September 2013

semisync continue…

在前两天刚刚释放的MySQL5.7.2代码中,可以看到semisync终于做了进一步的改进;在之前用户线程的逻辑为: 1.在binlog写入文件后,调用semisync记录事务位点信息; 2.sync binlog(如果需要) 3.将事务提交; 4.等待备库ack; 该逻辑存在的问题是,当主库crash时,可能Binlog还没有传递到备库,这时候做一次主备切换,备库提升为新主库,老主库降级为新备库,这时候主备库是处于不一致状态的; 而在5.7.2中,可以使用如下逻辑: 1.在binlog写入文件后,记录事务位点信息; 2.sync binlog(如果需要) 3.等待备库ack; 4..将事务提交; 在新版本5.7.2中,增加了新的HOOK函数:after_sync,通过参数rpl_semi_sync_master_wait_point来控制,默认为AFTER_SYNC,如果设置为AFTER_COMMIT则在commit之前等待备库ack,这可以确保备库接受到了最新的binlog,即使主库随后crash掉,也可以在recovery阶段恢复,因为主库已经完成了prepare阶段; 尽管该特性仅存在于官方5.7.2中,使用MySQL5.6的同学也可以很容易的把这个特性port过来,因为代码的改动量非常小.但需要注意一个问题,即在rotate时,由于需要持有LOCK_log并等待所有preare的事务完成commit,而dump线程也需要持有LOCK_log来发送binlog,这里rotate, 用户线程等待ACK, dump线程三者很容易形成死锁。 解释下,rotate为什么要等待prepare的线程commit,由于我们默认使用的XA事务,在crash recovery时,会扫描最后一个binlog文件,找出其中的XID,然后再跟所有处于prepare状态的事务xid做对比,如果事务xid存在于binlog,则将该prepare的事务commit,否则rollback。 如果rotate时不等待prepare的事务commit,那么我们可能需要往前扫描多个binlog文件来 关于这个问题,有几种解决办法: 1.Mariadb版本,rotate线程无需等待prepare线程commit,而是在binlog中写入事件的方式,类似于给binlog做了个checkpoint。 2.MySQL5.7.2/FacebookMySQL5.6, 通过维护当前active的binlog尾部偏移量的方式来解除dump线程对LOCK_log锁的需求 原创文章,转载请注明: 转载自Simple Life 本文链接地址: semisync continue… Post Footer automatically generated by wp-posturl plugin for wordpress.

MySQL semisync replication配置及源代码实现

之前一直没有对semi sync做太多的关注,原因是线上的生产环境使用的非常少,最近需要提升semisync的生产环境优先级,以适应数据保护非常严格的场景,借此机会了解一下semisync,顺便过了一下大部分代码,以帮助后续的性能优化工作,以下分析基于代码MySQL5.6.13   如何配置   semisync的配置非常简单,采用MySQL Plugin的方式,在主库和备库上分别安装不同的插件,当然你也可以主库备库全部标准安装上,使用参数来控制sesmisync;     INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’; INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;   正常情况下,这两个PLUGIN都应该被标准安装,谁知道哪天备库会不会被切换成主库呢。 安装完PLUGIN后,我们可以根据拓扑结构来定义主库和备库的配置,主要包括以下几个配置项; 1.rpl_semi_sync_master_enabled     —控制主库上是否开启semisync, 打开或关闭,立刻生效 2.rpl_semi_sync_slave_enabled        —控制备库是否开启semisync, 当主库打开semisync时,则必须至少要有一个链接的备库是打开semisync的,否则主库线程每次都会去等待,直至超时;因此如果想关闭semisync必须要先关闭主库配置,再关闭备库配置 3.rpl_semi_sync_master_timeout       —控制主库上客户端的等待时间,当超过这么长时间等待后,客户端返回,同步复制退化成原生的异步复制   单位为毫秒,默认值为10000,即10秒   4.rpl_semi_sync_master_wait_no_slave 默认打开,表示当备库起来后,并跟上主库时,自动切换到同步模式,如果关闭,即使备库起来并跟上了,也不会启用半同步; 5.rpl_semi_sync_master_trace_level 以及  rpl_semi_sync_slave_trace_level — 输出监控信息的级别,详细点击见文档,不同的级别,可能输出更详细的信息,用于DEBUG 运行状态变量也比较丰富,不细说了,网上介绍的很多,官方文档也很详细 root@(none) 02:58:27>show status like ‘%semi%’; +——————————————–+——-+ | […]