半同步搭建
所谓的半同步复制就是master每commit一个事务,要slave应用这个事物后回给master信号。这样master才能把事物成功commit。这样就保证了master-slave的数据绝对的一致(但是以牺牲master的性能为代价).但等待时间也是可以调整的。 mysql半同步复制等待时间超时后(默认时间为10秒),会自动转换成异步复制 ,相对于异步复制,半同步复制提高了数据的安全性。
安装mysql5.5之后的版本,因为这个版本之后才实现的半同步复制
第一大步: 先要搭建好mysql主从异步复制,参考上一篇 。
第二大步:在异步基础上转成半同步复制
Master插入半同步插件:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.17 sec)
Slave插入半同步插件:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.16 sec)rpl_semi_sync_master_timeout
半同步的等待时间为10s,10s后如果还没有发送同步成功的信息,会自动转变为异步
rpl_semi_sync_master_enabled OFF
rpl_semi_sync_master_wait_for_slave_count
当多个从机时,只接收1个ack
mysql半同步实现
先在slave端关闭I/O线程
mysql> stop slave io_thread;
Query OK, 0 rows affected (0.19 sec)
>Master和slave端数据库设置半同步参数开启
Master:
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%semi_sync%';
+-------------------------------------------+------------+| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON || rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
Slave:
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
>在slave端打开I/O线程,查看半同步成功字数,再在master中插入数据,查看半同步的成功记录
Slave:
mysql> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)
Master:
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into userdb values ('user3','123');
Query OK, 1 row affected (0.15 sec)
mysql> show global status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | --有一个从服务器启用半同步复制
| Rpl_semi_sync_master_net_avg_wait_time | 0 | --master等待slave回复的平均等待时间。单位毫秒
| Rpl_semi_sync_master_net_wait_time | 0 | --master总的等待时间。单位毫秒
| Rpl_semi_sync_master_net_waits | 0 | --master等待slave回复的总的等待次数
| Rpl_semi_sync_master_no_times | 0 | --master关闭半同步复制的次数
| Rpl_semi_sync_master_no_tx | 0 | --master 等待超时的次数
| Rpl_semi_sync_master_status | ON | --标记master现在是否是半同步复制状态
| Rpl_semi_sync_master_timefunc_failures | 0 | --master调用时间(如gettimeofday())失败的次数
| Rpl_semi_sync_master_tx_avg_wait_time | 0 | --master花在每个事务上的平均等待时间
| Rpl_semi_sync_master_tx_wait_time | 0 | --master花在事物上总的等待时间
| Rpl_semi_sync_master_tx_waits | 0 | --master事物等待次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | --后来的先到了,而先来的还没有到的次数
| Rpl_semi_sync_master_wait_sessions | 0 | --当前有多少个session因为slave回复而造成等待
| Rpl_semi_sync_master_yes_tx | 0 | --标记slave是否在半同步状态
+--------------------------------------------+-------+
在slave上查看状态就只有下面一条信息
mysql> show global status like 'rpl_semi_sync%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
这里用时为10s左右
Rpl_semi_sync_master_yes_tx,Rpl_semi_sync_master_no_tx数值随着我们的操作