mysql的半同步复制:
一、测试环境:
两台redhat linux5.8虚拟机;
Master:
IP地址:172.16.77.77
MySQL版本:5.5.28
操作系统:RHEL5.8

Slave:
IP地址:172.16.12.7
MySQL版本:5.5.28
操作系统:RHEL5.8;
二、准备工作
1、编译安装mysql,指定数据路径为/data/mydata;用户为mysql(路径和用户都需另行创建);
2、为mysql提供服务脚本,配置文件等等,修改/data/mydata的属主属组为mysql用户(步骤略);
3、分别在两台主机上执行如下命令:
 #hwclock -s
 同步主机的时间
三、mysql半同步复制的概述 
 所谓半同步复制,即给主服务器设定等待从服务器来同步的有效时长,在有效时长内主服务器将等待从服务器同步复制数据;若超出时长,主服务器将不再等待从服务
器同步复制数据,从而切换为异步复制数据。
 
四、设置半同步复制步骤:
1、这里只用一台从服务器,主从配置的设定按照之前配置的主从复制设置过程即可(此处略),要设置mysql的半同步复制,还需安装两个模块:

  1. # cd /usr/local/mysql/lib/
  2. # ls
  3. libmysqlclient.a libmysqlclient_r.so.18 libmysqlclient.so.18 libmysqld-debug.a plugin
  4. libmysqlclient_r.a libmysqlclient_r.so.18.0.0 libmysqlclient.so.18.0.0 libmysqlservices.a
  5. libmysqlclient_r.so libmysqlclient.so libmysqld.a libtcmalloc_minimal.so
  6. # cd plugin/
  7. # ls
  8. adt_null.so auth_test_plugin.so libdaemon_example.so qa_auth_interface.so semisync_slave.so
  9. auth.so daemon_example.ini mypluglib.so qa_auth_server.so
  10. auth_socket.so debug qa_auth_client.so semisync_master.so

如上所示:在mysql的安装目录下/lib/plugin下有两个模块:semisync_master.so  semisync_slave.so;前者是需要安装在主服务器上的,后者安装在从服务器上,安装了这两个模块后,才能对mysql进行半同步复制。

2、主服务器上

  1. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  2. mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
  3. +------------------------------------+-------+
  4. | Variable_name | Value |
  5. +------------------------------------+-------+
  6. | rpl_semi_sync_master_enabled | OFF |
  7. | rpl_semi_sync_master_timeout | 10000 |
  8. | rpl_semi_sync_master_trace_level | 32 |
  9. | rpl_semi_sync_master_wait_no_slave | ON |
  10. +------------------------------------+-------+
  11. 4 rows in set (0.01 sec)
  12. ################
  13. 查看安装semisync_master.so模块后生成的系统参数:
  14. rpl_semi_sync_master_enabled:是否开启主服务器上的半同步复制
  15. rpl_semi_sync_master_timeout:半同步复制的有效时长,单位为毫秒
  16. rpl_semi_sync_master_trace_level:传输级别
  17. rpl_semi_sync_master_wait_no_slave:当主服务器没有发现有从服务器在线时,是否依旧按照设定的时长等待从服务器
  18. ################
  19. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  20. mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
  21. mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
  22. +------------------------------------+-------+
  23. | Variable_name | Value |
  24. +------------------------------------+-------+
  25. | rpl_semi_sync_master_enabled | ON |
  26. | rpl_semi_sync_master_timeout | 1000 |
  27. | rpl_semi_sync_master_trace_level | 32 |
  28. | rpl_semi_sync_master_wait_no_slave | ON |
  29. +------------------------------------+-------+
  30. 4 rows in set (0.01 sec)
  31. ################
  32. 开启主服务器上的半同步复制功能;并将超时时长设置为1000毫秒
  33. ################
  34. mysql> SHOW GLOBAL STATUS LIKE '%semi%';
  35. +--------------------------------------------+-------+
  36. | Variable_name | Value |
  37. +--------------------------------------------+-------+
  38. | Rpl_semi_sync_master_clients | 0 |
  39. | Rpl_semi_sync_master_net_avg_wait_time | 0 |
  40. | Rpl_semi_sync_master_net_wait_time | 0 |
  41. | Rpl_semi_sync_master_net_waits | 0 |
  42. | Rpl_semi_sync_master_no_times | 0 |
  43. | Rpl_semi_sync_master_no_tx | 0 |
  44. | Rpl_semi_sync_master_status | ON |
  45. | Rpl_semi_sync_master_timefunc_failures | 0 |
  46. | Rpl_semi_sync_master_tx_avg_wait_time | 0 |
  47. | Rpl_semi_sync_master_tx_wait_time | 0 |
  48. | Rpl_semi_sync_master_tx_waits | 0 |
  49. | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
  50. | Rpl_semi_sync_master_wait_sessions | 0 |
  51. | Rpl_semi_sync_master_yes_tx | 0 |
  52. +--------------------------------------------+-------+
  53. 14 rows in set (0.00 sec)
  54. ################
  55. 在从服务器没有开启前主服务器半同步复制的变量状态:
  56. Rpl_semi_sync_master_clients:半同步复制中从服务器的在线个数
  57. Rpl_semi_sync_master_status :主服务器的半同步复制状态
  58. ################
  59. 3、从服务器上
  60. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  61. mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
  62. +---------------------------------+-------+
  63. | Variable_name | Value |
  64. +---------------------------------+-------+
  65. | rpl_semi_sync_slave_enabled | OFF |
  66. | rpl_semi_sync_slave_trace_level | 32 |
  67. +---------------------------------+-------+
  68. 2 rows in set (0.00 sec)
  69. mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
  70. +----------------------------+-------+
  71. | Variable_name | Value |
  72. +----------------------------+-------+
  73. | Rpl_semi_sync_slave_status | OFF |
  74. +----------------------------+-------+
  75. 1 row in set (0.00 sec)
  76. #################
  77. 从服务器上安装模块后的参数:
  78. rpl_semi_sync_slave_enabled:是否开启从服务器上半同步复制
  79. rpl_semi_sync_slave_trace_level:传输级别
  80. 变量状态:
  81. Rpl_semi_sync_slave_status:从服务器上半同步复制的状态
  82. #################
  83. mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  84. Query OK, 0 rows affected (0.01 sec)
  85. mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
  86. Query OK, 0 rows affected (0.02 sec)
  87. Query OK, 0 rows affected (0.01 sec)
  88. mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
  89. +---------------------------------+-------+
  90. | Variable_name | Value |
  91. +---------------------------------+-------+
  92. | rpl_semi_sync_slave_enabled | ON |
  93. | rpl_semi_sync_slave_trace_level | 32 |
  94. +---------------------------------+-------+
  95. 2 rows in set (0.00 sec)
  96. mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
  97. +----------------------------+-------+
  98. | Variable_name | Value |
  99. +----------------------------+-------+
  100. | Rpl_semi_sync_slave_status | ON |
  101. +----------------------------+-------+
  102. 1 row in set (0.01 sec)
  103. ###开启从服务器半同步复制,并开启slave上的io_thread线程###

五、测试半同步复制
a、所有参数已配置完成,从服务器的半同步复制已开启,在主服务器查看链接状态:

  1. mysql> SHOW GLOBAL STATUS LIKE '%semi%';
  2. +--------------------------------------------+-------+
  3. | Variable_name | Value |
  4. +--------------------------------------------+-------+
  5. | Rpl_semi_sync_master_clients | 1 |
  6. | Rpl_semi_sync_master_net_avg_wait_time | 0 |
  7. | Rpl_semi_sync_master_net_wait_time | 0 |
  8. | Rpl_semi_sync_master_net_waits | 0 |
  9. | Rpl_semi_sync_master_no_times | 0 |
  10. | Rpl_semi_sync_master_no_tx | 0 |
  11. | Rpl_semi_sync_master_status | ON |
  12. | Rpl_semi_sync_master_timefunc_failures | 0 |
  13. | Rpl_semi_sync_master_tx_avg_wait_time | 0 |
  14. | Rpl_semi_sync_master_tx_wait_time | 0 |
  15. | Rpl_semi_sync_master_tx_waits | 0 |
  16. | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
  17. | Rpl_semi_sync_master_wait_sessions | 0 |
  18. | Rpl_semi_sync_master_yes_tx | 0 |
  19. +--------------------------------------------+-------+
  20. 14 rows in set (0.00 sec)
  21. ###Clients的连接数已更改为1,从服务器连接正常###

b、在主服务器上之前创建的sumoan表中插入数据:

  1. mysql> insert into sumoan values (1,'fuyaxu');insert into sumoan values (2,'weiyang');
  2. Query OK, 1 row affected (0.01 sec)
  3. Query OK, 1 row affected (0.01 sec)
  4. mysql> select *from sumoan;
  5. +----+---------+
  6. | id | name |
  7. +----+---------+
  8. | 1 | fuyaxu |
  9. | 2 | weiyang |
  10. +----+---------+
  11. 2 rows in set (0.00 sec)
  12. ###数据已完成插入,查看主服务器上半同步复制的状态信息###
  13. mysql> SHOW GLOBAL STATUS LIKE '%semi%';
  14. +--------------------------------------------+-------+
  15. | Variable_name | Value |
  16. +--------------------------------------------+-------+
  17. | Rpl_semi_sync_master_clients | 1 |
  18. | Rpl_semi_sync_master_net_avg_wait_time | 1673 |
  19. | Rpl_semi_sync_master_net_wait_time | 3347 |
  20. | Rpl_semi_sync_master_net_waits | 2 |
  21. | Rpl_semi_sync_master_no_times | 0 |
  22. | Rpl_semi_sync_master_no_tx | 0 |
  23. | Rpl_semi_sync_master_status | ON |
  24. | Rpl_semi_sync_master_timefunc_failures | 0 |
  25. | Rpl_semi_sync_master_tx_avg_wait_time | 786 |
  26. | Rpl_semi_sync_master_tx_wait_time | 1572 |
  27. | Rpl_semi_sync_master_tx_waits | 2 |
  28. | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
  29. | Rpl_semi_sync_master_wait_sessions | 0 |
  30. | Rpl_semi_sync_master_yes_tx | 2 |
  31. +--------------------------------------------+-------+
  32. 14 rows in set (0.00 sec)

c、在从服务器上查看是否已同步到数据;

  1. mysql> show tables;
  2. +----------------+
  3. | Tables_in_test |
  4. +----------------+
  5. | fuyaxu |
  6. | moziyan |
  7. | sumoan |
  8. +----------------+
  9. 3 rows in set (0.00 sec)
  10. mysql> select *from sumoan;
  11. +----+---------+
  12. | id | name |
  13. +----+---------+
  14. | 1 | fuyaxu |
  15. | 2 | weiyang |
  16. +----+---------+
  17. 2 rows in set (0.00 sec)
  18. ###同步数据成功###