mysql的半同步模式

打印 上一主题 下一主题

主题 1827|帖子 1827|积分 5481

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.半同步模式原理

mysql的主备库通过binlog日记保持同等,主库本地执行完事务,binlog日记落盘后即返回给用户;备库通过拉取主库binlog日记来同步主库的操作。默认情况下,主库与备库并没有严格的同步,因此存在一定的概率备库与主库的数据是不对等的。半同步特性的出现,就是为了包管在任何时刻主备数据同等的题目。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。实现原理也很简朴,主库本地执行完毕后,等待备库的相应消息(包罗最新备库接收到的binlog(file,pos)),接收到备库相应消息后,再返回给用户,这样一个事务才算真正完成。在主库实例上,有一个专门的线程(ack_receiver)接收备库的相应消息,并以关照机制告知主库备库已经接收的日记,可以继续执行。


2.启用半同步模式

  
  1. [root@mysql1 ~]# vim /etc/my.cnf
  2. 配置完后要重新启动服务
  3. [root@mysql1 ~]#/etc/init.d/mysqld restart
复制代码

  
  进入mysql:
  1. #安装半同步插件
  2. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  3. #打开半同步功能
  4. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  5. #查看半同步功能状态
  6. mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
  7. +-------------------------------------------+------------+
  8. | Variable_name | Value                                  |
  9. +-------------------------------------------+------------+
  10. | rpl_semi_sync_master_enabled              | ON         |
  11. | rpl_semi_sync_master_timeout              | 10000      |
  12. | rpl_semi_sync_master_trace_level          | 32         |
  13. | rpl_semi_sync_master_wait_for_slave_count | 1          |
  14. | rpl_semi_sync_master_wait_no_slave        | ON         |  
  15. | rpl_semi_sync_master_wait_point           | AFTER_SYNC |
  16. +-------------------------------------------+------------+
  17. mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
  18. +--------------------------------------------+-------+
  19. | Variable_name                              | Value |
  20. +--------------------------------------------+-------+
  21. | Rpl_semi_sync_master_clients               | 0     |
  22. | Rpl_semi_sync_master_net_avg_wait_time     | 0     |
  23. | Rpl_semi_sync_master_net_wait_time         | 0     |
  24. | Rpl_semi_sync_master_net_waits             | 0     |
  25. | Rpl_semi_sync_master_no_times              | 0     |
  26. | Rpl_semi_sync_master_no_tx                 | 0     |
  27. | Rpl_semi_sync_master_status                | ON    |
  28. | Rpl_semi_sync_master_timefunc_failures     | 0     |
  29. | Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
  30. | Rpl_semi_sync_master_tx_wait_time          | 0     |
  31. | Rpl_semi_sync_master_tx_waits              | 0     |
  32. | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
  33. | Rpl_semi_sync_master_wait_sessions         | 0     |
  34. | Rpl_semi_sync_master_yes_tx                | 0     |
  35. +--------------------------------------------+-------+
  36. 14 rows in set (0.00 sec)
复制代码

     在slave端开启半同步功能:      
  1. [root@mysql1 ~]# vim /etc/my.cnf
  2. 配置完后要重新启动服务
  3. [root@mysql1 ~]#/etc/init.d/mysqld restart
复制代码
  

   
   
   进入mysql:
  
  1. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> STOP SLAVE IO_THREAD; #重启io线程,半同步才能生效
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> START SLAVE IO_THREAD; ##重启io线程,半同步才能生效
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
  10. +---------------------------------+-------+
  11. | Variable_name                   | Value |
  12. +---------------------------------+-------+
  13. | rpl_semi_sync_slave_enabled     | ON    |
  14. | rpl_semi_sync_slave_trace_level | 32    |
  15. +---------------------------------+-------+
  16. 2 rows in set (0.01 sec)
  17. mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
  18. +----------------------------+-------+
  19. | Variable_name              | Value |
  20. +----------------------------+-------+
  21. | Rpl_semi_sync_slave_status | ON    |
  22. +----------------------------+-------+
  23. 1 row in set (0.00 sec)
复制代码
  3.测试

       在master端写入数据         
  1. mysql> insert into lee.userlist values ('xixi','123123');
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
  4. | Variable_name | Value |
  5. +--------------------------------------------+-------+
  6. | Rpl_semi_sync_master_clients               | 2     |      #链接客户端两个
  7. | Rpl_semi_sync_master_net_avg_wait_time     | 0     |
  8. | Rpl_semi_sync_master_net_wait_time         | 0     |
  9. | Rpl_semi_sync_master_net_waits             | 2     |
  10. | Rpl_semi_sync_master_no_times              | 0     |  
  11. | Rpl_semi_sync_master_no_tx                 | 0     |      #未同步数据0笔
  12. | Rpl_semi_sync_master_status                | ON    |      #表示半同步复制启用中
  13. | Rpl_semi_sync_master_timefunc_failures     | 0     |
  14. | Rpl_semi_sync_master_tx_avg_wait_time      | 981   |
  15. | Rpl_semi_sync_master_tx_wait_time          | 981   |
  16. | Rpl_semi_sync_master_tx_waits              | 1     |
  17. | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
  18. | Rpl_semi_sync_master_wait_sessions         | 0     |
  19. | Rpl_semi_sync_master_yes_tx                | 1     |        #已同步数据1笔
  20. +--------------------------------------------+-------+
复制代码
            模拟故障:             
  1. #在slave端10、20端都断开slave服务连接
  2. mysql> STOP SLAVE IO_THREAD;
  3. Query OK, 0 rows affected (0.00 sec)
  4. #在master端插入数据
  5. mysql> insert into lee.userlist values ('xixi','123123');
  6. Query OK, 1 row affected (10.00 sec)                       #10秒超时,会卡住十秒钟然后从同步
  7.                                                             转为异步,再插入数据
  8. mysql> SHOW STATUS LIKE 'Rpl_semi%';
  9. +--------------------------------------------+-------+
  10. | Variable_name                              | Value |
  11. +--------------------------------------------+-------+
  12. | Rpl_semi_sync_master_clients               | 0     |      连接人数变为0
  13. | Rpl_semi_sync_master_net_avg_wait_time     | 0     |
  14. | Rpl_semi_sync_master_net_wait_time         | 0     |
  15. | Rpl_semi_sync_master_net_waits             | 2     |
  16. | Rpl_semi_sync_master_no_times              | 1     |
  17. | Rpl_semi_sync_master_no_tx                 | 1     |      #一笔数据为同步
  18. | Rpl_semi_sync_master_status                | OFF   |      #自动转为异步模式,当slave恢复
  19. | Rpl_semi_sync_master_timefunc_failures     | 0     |      #会自动恢复
  20. | Rpl_semi_sync_master_tx_avg_wait_time      | 981   |
  21. | Rpl_semi_sync_master_tx_wait_time          | 981   |
  22. | Rpl_semi_sync_master_tx_waits              | 1     |      #主服务器等待从服务器确认事务的次
  23.                                                              数
  24. | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
  25. | Rpl_semi_sync_master_wait_sessions         | 0     |
  26. | Rpl_semi_sync_master_yes_tx                | 1     |    #主服务器成功提交事务并得到从服务器
  27.                                                             确认的次数
  28. +--------------------------------------------+-------+
  29. 14 rows in set (0.00 sec)
复制代码
    4.gitd模式

     注:当主服务器从宕机状态规复时,从库会根据GTID顺序接收并应用来自主服务器的事务
     配置参数时在master和slave都配置
     参数:gtid_mode=ON   
                enforce-gtid-consistency=ON
     

     
     1.基于 GTID 的主从复制方式的出现,重要是用于替换传统的日记点 复制方式。通过GTID 可以包管每个主库提交的事务在集群中都有 唯一 的一个事务 ID。
     
2.强化了数据库主从的同等性和故障规复数据的容错能力,在主库宕机发生主从切换 的情况下,GTID 方式可以让其他从库自动找到新主库复制的位置。
     
3.而且 GTID 可以忽略已经执行过的事务,淘汰了数据发生错误的概率。
     
4.一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱大概主从不同等;
     
5.GTID用来代替传统复制方法,不再利用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是利用MASTER_AUTO_POSTION=1的方式开始复制;
     
6.在GTID中【slave】端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表