MySQL半同步复制

MySQL半同步复制:

1. 主从库都要激活半同步复制
2. 等到至少一个从库确认接收到所有event或者等待超时,主库才commit
3. 没有任何slave确认事务超时,master切换为异步复制。当至少有一个slave追上,master切换为半同步模式
4. 半同步复制必须master和slave都激活,有任一边没激活就是异步复制

blocking:
当master正在等待slave的acknowledgment时,master是被blocking的,并不反回给执行事务的session . 当blocking结束才反回信息给session ,master才能继续执行其它语句。
在这个时间点,master事务提交并且接收到至少一个slave的acknowledgment 信息。

master接收到多少个slave的acknowledgment 信息由参数rpl_semi_sync_master_wait_for_slave_count系统变量控制。默认值是1,表示一个slave的acknowledgment信息

blocking发生。当一个事务修改了一个非事务表,此时事务发生了rollback ,已生成binlog记录。但是非事务表的修改不能被rollback 并且必须发送到slave

asynchronous replication:master写event到binlog并且slave做好请求event准备。无法保证有一个slave接收所有的event
fully synchronous replication:当master提交事务,所有在master返回给session执行语句之前slave也提交事务。不利点大量延时提交事务
Semisynchronous replication:在asynchronous和fully synchronous 之间,只需等待至少一个slave接收event并且logged event,不需要所有都确认接收。只需要接收,并不需event被完全执行和commited在slave端。

在Semisynchronous replication复制情况

慢commit会影响db speed
慢网络也会影响db speed
远距离server会影响网速 影响db speed

rpl_semi_sync_master_wait_point:
 AFTER_SYNC: master写每个事务到它的binlog和slave,并同步binlog到disk. 在从库sync后,master等待接收到一个slave的acknowledgment时,master才commit事务到storage engine 并反回结果给client .

 过程:1.写master binglog  
       2.同步主 binlog 到 slave  
       3.slave 返回 acknowledgment 给 master
       4. master 接收到acknowledgment并commit
       5.master返回结果给client

AFTER_COMMIT: master写每个事务到它的binlog和slave,同步binlog,并commit到storage engine. 在从库commit后, master等到接收一个slave acknowledgment。反回结果给client

 过程:1.写master binlog 并commit  
       2.同步 binlog到 slave 并commit
       3.slave 返回 acknowledgment 给 master ,
       4.master接收到slave acknowledgment
       5.master返回结果给client
 问题:1.在4,5步骤时,由于数据已commit,其它client可以看到结果,但返回的client认为是没有生成的
       2. 在4,5步骤crash时,返回client认为事务是失败,其实是事务是已提交的

Semisynchronous replication管理接口:
系统变量:

1. rpl_semi_sync_master_enabled  -- 在master上,控制半同步时否激活,默认0(关闭)
2. rpl_semi_sync_master_timeout  -- 控制master接收slave的acknowlegment等待超过多少毫秒切换为异步。 默认是10秒(10000)
3. rpl_semi_sync_slave_enabled   -- 在slave上,控制半同步时否激活,默认0(关闭)

状态变量:

1. Rpl_semi_sync_master_clients  -- 半同步slave数量
2. Rpl_semi_sync_master_status   -- 半同步操作在master上操作状态
3. Rpl_semi_sync_master_no_tx    -- 多少已提交事务没有被slave上被acknowlegemnt
4. Rpl_semi_sync_master_yes_tx   -- 多少已提交事务已经被slave上被acknowlegemnt
5. Rpl_semi_sync_slave_status    -- 半同步操作在slave上操作状态


半同步安装与配置
安装半同步条件:

1.MySQL5.5以上
2.支持动态加载,是否有系统参数 have_dynamic_loading为YES
3.主从复制应已经正常工作
4.没有配置多源复制的渠道,半同频仅支持默认复制渠道

半同步安装
on master :

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = {0|1};
SET GLOBAL rpl_semi_sync_master_timeout = N;

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+

on slave:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+

半同步监控:

SHOW VARIABLES LIKE 'rpl_semi_sync%';
SHOW STATUS LIKE 'Rpl_semi_sync%';

有些地方理解错误,还请指出。谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值