注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

生命无非记忆

不要在记忆中丢失了自己

 
 
 

日志

 
 

使用heartbeat的虚拟ip对链接(socket)的影响  

2012-08-01 09:53:55|  分类: postgreSQL[原创] |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       我使用heartbeat为postgres-xc的datanode1配置了一个standby,并为coordinator与datanode1之间的链接配置了一个虚拟ip(即IPaddr2),这样做主要是在master挂掉后,slave切换为master后,不需要修改该节点(即datanode1)在所有coordinator中的注册信息的ip。

      但是在进行实验时,当我手动kill到datanode1的主进程(master节点上)后,slave确实切换为master,但是在kill之前我们使用一个psql链接了coordinater1,并执行了一些sql语句,在切换之后,我在使用该psql进行插入或者select时,psql就卡了, 一直没有任何反应,一直等了大概有20分钟作用才报错,说找不到datanode1.

        在配置虚拟ip后,当master节点挂掉后,standby 将promote为新的master,以前链接到原来的master 的链接将不会自动从新链接到新的master 上,应该需要自己手动重连。

          在master挂掉之前,我用psql链接coordinator1,创建一个表,并插入了一些数据,在master挂掉并成功过promote slave为新的master后,为执行来一条insert语句,psql等死在那了,然而如果我重新启动一个psql并链接coordinator1,执行任何sql语句均能正常执行。
     分析:在psql执行sql语句后,datanode会创建一个专门的进程来为coordinator服务,在kill掉主进程datanode后,该进程并没有随之结束,导致coordinator与该进程的socket并没有断开,但是虚拟ip进程已经迁移到slave节点上了,由于原来的socket是使用的虚拟ip建立的,所以在使用该socket进行通信时,系统会认为该socket是“好”的,但是却向新的master节点发送或者接收消息,而新master节点并没有与之对应的socket,所以socket会一直等在select或者recv上。如果在之后kill掉datanode与coordinator之间的子进程,soket还是会等在select或者recv上,是因为,在kill之前虚拟ip已经迁移到slave上,系统在关闭该进程时会关闭该进程打开的socket并向对于的端发送FIN消息,告诉另一端该socket已经关闭,但是由于是虚拟ip,导致在发送FIN消息时,并没有真正的发送到另一端,而是发给了虚拟ip迁移后的节点上,导致原来的socket没有收到FIN消息,所以系统认为该socket还是“好”的,因此还是会出现上述问题。
解决办法:
i. 在原有链接上手动执行select pgxc_pool_reload(),重新建立链接;
ii. 在kill到主进程后,虚拟ip迁移之前kill掉其所有的子进程,这样socket关闭时发送的FIN,就会发送到真正的与之对应的另一端,另一端的socket就会被系统设置为关闭状态,之后在使用时,postgres-xc就会重新建立该链接,这样也就不会出现上面的问题
  评论这张
 
阅读(913)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017