您好,欢迎访问一九零五行业门户网

说说MySQL的半同步复制

mysql5.5 除了支持内置的异步复制机制,还提供了接口支持半同步复制的机制。mysql复制默认是异步复制,master将事件写入binlog,
mysql semisynchronous replication
mysql5.5 除了支持内置的异步复制机制,还提供了接口支持半同步复制的机制。
异步复制的缺点:
mysql复制默认是异步复制,master将事件写入binlog,但并不知道slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果master宕机,事务在master上已提交,但很可能这些事务没有传到任何的slave上。假设有master->salve故障转移的机制,此时slave也可能会丢失事务。
半同步复制的概念:
i.
当slave主机连接到master时,能够查看其是否处于半同步复制的机制。
ii.
当master上开启半同步复制的功能时,至少应该有一个slave开启其功能。此时,一个线程在master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的slave已收到此事务的所有事件,或等待超时。
iii.
当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,slave才会告知已收到。
iv.
如果等待超时,也就是master没被告知已收到,此时master会自动转换为异步复制的机制。当至少一个半同步的slave赶上了,master与其slave自动转换为半同步复制的机制。
v.
半同步复制的功能要在master,slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。
同步,异步,半同步复制的比较:
同步复制:master提交事务,直到事务在所有的slave都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。
异步复制:当slave准备好才会向master请求binlog。缺点:不能保证一些事件都能够被所有的slave所接收。
半同步复制:半同步复制工作的机制处于同步和异步之间,master的事务提交阻塞,只要一个slave已收到该事务的事件且已记录。它不会等待所有的slave都告知已收到,且它只是接收,并不用等其完全执行且提交。
半同步复制的控制变量,状态监控变量:
控制变量
variable namevariable scopedynamic variabletypedefaulteffect host
rpl_semi_sync_master_enabledglobalyesbooleanoffmaster
rpl_semi_sync_slave_enabledglobalyesbooleanoffslave
rpl_semi_sync_master_timeoutglobalyesnumeric10000master
解释:
rpl_semi_sync_master_enabled是控制master是否开启半同步,开启或不开启,将其设置为on或off(1or0).
rpl_semi_sync_master_timeout是控制master等待多长时间被告知slave已收到,也就是所谓的超时时间。
rpl_semi_sync_slave_enabled是控制slave是否开启半同步,开启或不开启,将其设置为on或off(1or0)。
监控半同步复制的状态变量(几个常用的)
rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的slave
rpl_semi_sync_master_status:查看在master上半同步复制是否正在运行,其值为on时,说明master已启用半同步且已被告知有slave收到;其值为off时,说明master没启用半同步或是没被告知,,由于timeout等原因。
rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。
rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。
rpl_semi_sync_slave_status:查看slave上半同步复制是否正常运行,其值为on时,说明slave正通过半同步复制且slave i/o正在运行;为off时,反之。
说明关于其它的请参阅:
半同步复制的安装,配置
环境要求:
i.
mysql5.5或以上版本
ii.
在mysql上安装插件需要数据库支持动态载入。检查是否支持,用如下检测:
mysql> show global variables like 'have_dynamic_loading';
+----------------------+-------+
| variable_name        | value |
+----------------------+-------+
| have_dynamic_loading | yes  |
+----------------------+-------+
1 row in set (0.00 sec)
iii.半同步复制是基于复制的环境。也就是说配置半同步复制前,已有复制的环境。
安装:
在master上执行:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
各个slave上执行:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
如果不清楚plugin的目录,用如下查找:
mysql> show global variables like 'plugin_dir';
+---------------+----------------------------------+
| variable_name | value                            |
+---------------+----------------------------------+
| plugin_dir    | /opt/usr/local/mysql/lib/plugin/ |
+---------------+----------------------------------+
检查plugin是否已正确安装:
mysql> show plugins;
or
mysql> select * from information_schema.plugins;
配置:
在master上执行:
mysql> set global rpl_semi_sync_master_enabled = 1;
mysql> set global rpl_semi_sync_master_timeout = n;
在slave上执行:
mysql> set global rpl_semi_sync_slave_enabled = 1;
说明:
如果在一个正在运行的slave上开启半同步复制的功能,必须先停止slave i/o,将其启用半同步后,再开启slave i/o.
mysql> stop slave io_thread; start slave io_thread;
如果不这样做,slave还是会以异步的方式进行复制。
正如大家所知,如果不将变量的设置写到配置文件,下次重启数据库,将失效。写入配置文件:
master上:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
slave上:
[mysqld]
rpl_semi_sync_slave_enabled=1
总结:半同步复制个人感觉是维持数据完整性,安全性的的一个策略,虽会损失一点性能,还是值得的。配置很简单,关键是理解其工作机制。
其它类似信息

推荐信息