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

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

sync replication死锁的原因和解决办法  

来自饶珑辉   2012-10-15 09:57:07|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
该死锁的产生过程涉及3个线程:
1,事务的提交过程。
2,binlog日志的切换过程。
3,binlog的发送过程。

1,事务的提交的流程是:
1)prepare()
2) write_binlog()
    {   ...
prepare_xid++
 ... }
3)  commit()
     prepare_xid--/*ulog()*/
2,binlog日志的切换过程/*new_file_rpml*/
1) Lock_log /*获得binlog文件锁*/
2)while(prepare_xid) /*等待所有的事务都提交*/
{ ... waitforsingal()... }
 3)unLock_log()/*释放锁*/

3,binlog内容的发送过程(做replication的时候,发送给slave)
该过程将binlog文件内容发送给slave端,当发送完一个binlog日志文件的时候,需要读取下一个binlog文件,过程是:
1)Lock_log()/*获得binlog文件锁*/
2) read_binlog()/*读一个binlog event*/
3)binlog_net_send()/*网络发送*/

加上semi-sync之后的过程后,改变如下:
1 事务的提交线程程:
1)prepare()
2) write_binlog()
    {   ...
prepare_xid++
 ... }
3)  commit()
     prepare_xid--/*ulog()*/
4)waitCommitTrx()/*进入休眠*/

2,binlog内容的发送过程
1)read_binlog()
2) binlog_net_send()
3) net_wait_ACK()/*等待slave的回复确认,并唤醒休眠的事务提交进程*/

变成sync replication之后的改变是:
1 事务的提交过程
1)prepare()
2) write_binlog()
    {   ...
prepare_xid++
 ... }
3)waitCommitTrx()/*进入休眠*/
4)  commit()
     prepare_xid--/*ulog()*/
死锁的产生
这样改变之后很容易造成下面的循环等待过程:
sync replication死锁的原因和解决办法 - 饶珑辉 - 饶珑辉的博客
 
解决的办法:
1,改变切换binlog线程的流程
1)while(prepare_xid)
      {...  waitforsignal() ...}
 2) Lock_bin_log()
目的:等待prepare_xid时不持有binlog文件锁,消除循环等待。
2,新增加一把锁,保证切换日志线程在等待prepare_xid下降时,其他线程不会增加这个值。
切换日志的过程如下:
1)Lock_xid()
2)while(prepare_xid)
     {... waitforsignal() ...}
3) unlock_xid()
事务的写入过程如下:
1)if(xid)
{ lock_xid() }
2) write_binlog()
3)  if(xid)
{ unlock_xid() }
目的:日志切换时xid写到新的日志中。
  评论这张
 
阅读(793)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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