Mysql5.6.x版本半同步主从复制的开启方法 Mysql5.6.x版本半同步主从复制的开启方法

Mysql5.6.x版本半同步主从复制的开启方法

 

介绍

    先了解一下mysql的主从复制是什么回事,我们都知道,mysql主从复制是基于binlog的复制方式,而mysql默认的主从复制方式,其实是异步复制.

    主库实际上并不关心从库是否把数据拉完没有,也不关心从库有没有把数据写进硬盘入库,反正数据丢过去,让从库自己慢慢跑,而实际上这也并不影响主库任何使用的情况.

    细心的人就会发现,这种情况下,假如主库临时挂了,binlog还没传输完毕,即使是集群也不能保证说这挂了之后的数据一致性,因为你不能排除别人在主库是正常提交的,而从库没有数据的情况.

    然后在某个位面的时间上,就有人提出同步复制的概念,意思就是说,只要从库没写入,主库就不返回完成,这个时候即使主库挂了,这也只是一个未完成的事务,从库也不会记录,能保证数据一致性.

    看上去,数据一致性是解决了,但是呢,每个事务的延时就增大了,如果是大事务的话,就更惨,这得看网络带宽能不能顶得住,不然延时更低,性能更差.

    最后,在mysql5.5之后,半同步就提出来了,意思就是说,每个事务的复制,至少保证一个从库已经收到了binlog,主库才返回事务完成,但不需要理会从库是否写入硬盘.

    这样做虽然延时还是有,但是比起完全的同步方式还是好太多,对于数据一致性要求高的情况,牺牲性能来换取一定的价值,是在所难免的.

  

大家留意上面的数字,

第一部,客户端提交sql语句,

第二部,提交给存储引擎解析并处理数据修改,

第三部,事务在主库处理完毕,处于待完成状态,等待最终完成,

第四部,同时提交给各从库,等待完成,

第五部,从库返回状态给主库,标记已完成,半同步只需要一个从库返回就可以,其他会转成异步

第六部,返回客户端,整个事务已完成.

看上去还是比较不错,主从的数据一致性得到很大的提高,但是延时也不含糊,就是牺牲性能来提高一致性的问题了.

不过我还是得负责任的讲句,在极端的情况下,还是可能会丢一些数据的,所以定期做主从数据校验还是有必要的,例如使用PT工具什么的,至于为什么,这个不仿让大家思考一下,而对于大事务来说,半同步也是比较无力的情况,性能损耗较大.

安装使用

下面来看看如何安装使用半同步,大部分mysql本身并没有预装半同步的组件,需要另外安装,但是一般mysql的包里面会自带so文件,所以只要手动加载一下就可以用了.

安装使用

下面来看看如何安装使用半同步,大部分mysql本身并没有预装半同步的组件,需要另外安装,但是一般mysql的包里面会自带so文件,所以只要手动加载一下就可以用了.

#查找mysql插件目录位置

?
mysql> show variables like 'plugin_dir' ;
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| plugin_dir    | /roobo/server/mysql/lib/plugin/ |
+---------------+---------------------------------+
1 row in set (0.00 sec)

 #查看文件

?
[root@m2 ~] # cd /roobo/server/mysql/lib/plugin/
 
[root@m2 plugin] # ll
总用量 1048
-rwxr-xr-x. 1 mysql mysql  16445 5月   8 2017 adt_null.so
-rwxr-xr-x. 1 mysql mysql  25459 5月   8 2017 auth.so
-rwxr-xr-x. 1 mysql mysql  12532 5月   8 2017 auth_socket.so
-rwxr-xr-x. 1 mysql mysql  24544 5月   8 2017 auth_test_plugin.so
-rw-r--r--. 1 mysql mysql    227 5月   8 2017 daemon_example.ini
drwxr-xr-x. 2 mysql mysql   4096 5月   8 2017 debug
-rwxr-xr-x. 1 mysql mysql  38715 5月   8 2017 libdaemon_example.so
-rwxr-xr-x. 1 mysql mysql  17827 5月   8 2017 mypluglib.so
-rwxr-xr-x. 1 mysql mysql  11865 5月   8 2017 mysql_no_login.so
-rwxr-xr-x. 1 mysql mysql  18079 5月   8 2017 qa_auth_client.so
-rwxr-xr-x. 1 mysql mysql  23862 5月   8 2017 qa_auth_interface.so
-rwxr-xr-x. 1 mysql mysql  12934 5月   8 2017 qa_auth_server.so
-rwxr-xr-x. 1 mysql mysql 414708 5月   8 2017 semisync_master.so  #有semisync开头的文件,就说明插件安装成功了。
-rwxr-xr-x. 1 mysql mysql 247783 5月   8 2017 semisync_slave.so   #有semisync开头的文件,就说明插件安装成功了。
?
-rwxr-xr-x. 1 mysql mysql 168184 5月 8 2017 validate_password.so

 #看到下面两个,就是半同步的组件了,一个是主库组件,一个是从库组件,你可以两个都装上或者只装一个.

?
semisync_master.so
semisync_slave.so

 #下面开始正式安装:

#在主库上执行

?
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so' ;
mysql> show plugins;
#看到下面这个就证明成功了
rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL

 #从库当然也要做

?
#然后在从库执行
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so' ;
mysql> show plugins;
#看到下面这个就证明成功了
rpl_semi_sync_slave  | ACTIVE | REPLICATION | semisync_slave.so  | GPL

安装完了,就开始准备启动了,

主库很简单,只要设置一下半同步启动就可以了.

?
mysql> set global rpl_semi_sync_master_enabled = on;

当然,你也可以写到配置文件,不过写到配置文件要重启才生效,而且还要重新加载组件,所以这就没意思了.

然后到从库,slave要重启动IO线程来生效,否则还是异步的方式复制数据。

?
mysql> set global rpl_semi_sync_slave_enabled = on;
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;

同样你也能写到配置文件,我就不多说了,反正这就启动完毕了.

下面来验证一下是否成功,以下是主库的信息,因为从库很多信息是没有的.

来看看我们能设置些什么关于半同步的参数

?
mysql> show variables like '%Rpl%' ;
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| rpl_stop_slave_timeout | 31536000 |
+------------------------+----------+
1 row in set (0.00 sec)

更多详细情况参考:

https://www.cnblogs.com/paul8339/p/8177683.html

https://www.cnblogs.com/abobo/p/4242417.html  (备注:这个介绍的更详细)

other:

主从复制参考:

http://www.cnblogs.com/agileai/p/6126823.html

介绍

    先了解一下mysql的主从复制是什么回事,我们都知道,mysql主从复制是基于binlog的复制方式,而mysql默认的主从复制方式,其实是异步复制.

    主库实际上并不关心从库是否把数据拉完没有,也不关心从库有没有把数据写进硬盘入库,反正数据丢过去,让从库自己慢慢跑,而实际上这也并不影响主库任何使用的情况.

    细心的人就会发现,这种情况下,假如主库临时挂了,binlog还没传输完毕,即使是集群也不能保证说这挂了之后的数据一致性,因为你不能排除别人在主库是正常提交的,而从库没有数据的情况.

    然后在某个位面的时间上,就有人提出同步复制的概念,意思就是说,只要从库没写入,主库就不返回完成,这个时候即使主库挂了,这也只是一个未完成的事务,从库也不会记录,能保证数据一致性.

    看上去,数据一致性是解决了,但是呢,每个事务的延时就增大了,如果是大事务的话,就更惨,这得看网络带宽能不能顶得住,不然延时更低,性能更差.

    最后,在mysql5.5之后,半同步就提出来了,意思就是说,每个事务的复制,至少保证一个从库已经收到了binlog,主库才返回事务完成,但不需要理会从库是否写入硬盘.

    这样做虽然延时还是有,但是比起完全的同步方式还是好太多,对于数据一致性要求高的情况,牺牲性能来换取一定的价值,是在所难免的.

  

大家留意上面的数字,

第一部,客户端提交sql语句,

第二部,提交给存储引擎解析并处理数据修改,

第三部,事务在主库处理完毕,处于待完成状态,等待最终完成,

第四部,同时提交给各从库,等待完成,

第五部,从库返回状态给主库,标记已完成,半同步只需要一个从库返回就可以,其他会转成异步

第六部,返回客户端,整个事务已完成.

看上去还是比较不错,主从的数据一致性得到很大的提高,但是延时也不含糊,就是牺牲性能来提高一致性的问题了.

不过我还是得负责任的讲句,在极端的情况下,还是可能会丢一些数据的,所以定期做主从数据校验还是有必要的,例如使用PT工具什么的,至于为什么,这个不仿让大家思考一下,而对于大事务来说,半同步也是比较无力的情况,性能损耗较大.

安装使用

下面来看看如何安装使用半同步,大部分mysql本身并没有预装半同步的组件,需要另外安装,但是一般mysql的包里面会自带so文件,所以只要手动加载一下就可以用了.

安装使用

下面来看看如何安装使用半同步,大部分mysql本身并没有预装半同步的组件,需要另外安装,但是一般mysql的包里面会自带so文件,所以只要手动加载一下就可以用了.

#查找mysql插件目录位置

?
mysql> show variables like 'plugin_dir' ;
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| plugin_dir    | /roobo/server/mysql/lib/plugin/ |
+---------------+---------------------------------+
1 row in set (0.00 sec)

 #查看文件

?
[root@m2 ~] # cd /roobo/server/mysql/lib/plugin/
 
[root@m2 plugin] # ll
总用量 1048
-rwxr-xr-x. 1 mysql mysql  16445 5月   8 2017 adt_null.so
-rwxr-xr-x. 1 mysql mysql  25459 5月   8 2017 auth.so
-rwxr-xr-x. 1 mysql mysql  12532 5月   8 2017 auth_socket.so
-rwxr-xr-x. 1 mysql mysql  24544 5月   8 2017 auth_test_plugin.so
-rw-r--r--. 1 mysql mysql    227 5月   8 2017 daemon_example.ini
drwxr-xr-x. 2 mysql mysql   4096 5月   8 2017 debug
-rwxr-xr-x. 1 mysql mysql  38715 5月   8 2017 libdaemon_example.so
-rwxr-xr-x. 1 mysql mysql  17827 5月   8 2017 mypluglib.so
-rwxr-xr-x. 1 mysql mysql  11865 5月   8 2017 mysql_no_login.so
-rwxr-xr-x. 1 mysql mysql  18079 5月   8 2017 qa_auth_client.so
-rwxr-xr-x. 1 mysql mysql  23862 5月   8 2017 qa_auth_interface.so
-rwxr-xr-x. 1 mysql mysql  12934 5月   8 2017 qa_auth_server.so
-rwxr-xr-x. 1 mysql mysql 414708 5月   8 2017 semisync_master.so  #有semisync开头的文件,就说明插件安装成功了。
-rwxr-xr-x. 1 mysql mysql 247783 5月   8 2017 semisync_slave.so   #有semisync开头的文件,就说明插件安装成功了。
?
-rwxr-xr-x. 1 mysql mysql 168184 5月 8 2017 validate_password.so

 #看到下面两个,就是半同步的组件了,一个是主库组件,一个是从库组件,你可以两个都装上或者只装一个.

?
semisync_master.so
semisync_slave.so

 #下面开始正式安装:

#在主库上执行

?
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so' ;
mysql> show plugins;
#看到下面这个就证明成功了
rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL

 #从库当然也要做

?
#然后在从库执行
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so' ;
mysql> show plugins;
#看到下面这个就证明成功了
rpl_semi_sync_slave  | ACTIVE | REPLICATION | semisync_slave.so  | GPL

安装完了,就开始准备启动了,

主库很简单,只要设置一下半同步启动就可以了.

?
mysql> set global rpl_semi_sync_master_enabled = on;

当然,你也可以写到配置文件,不过写到配置文件要重启才生效,而且还要重新加载组件,所以这就没意思了.

然后到从库,slave要重启动IO线程来生效,否则还是异步的方式复制数据。

?
mysql> set global rpl_semi_sync_slave_enabled = on;
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;

同样你也能写到配置文件,我就不多说了,反正这就启动完毕了.

下面来验证一下是否成功,以下是主库的信息,因为从库很多信息是没有的.

来看看我们能设置些什么关于半同步的参数

?
mysql> show variables like '%Rpl%' ;
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| rpl_stop_slave_timeout | 31536000 |
+------------------------+----------+
1 row in set (0.00 sec)

更多详细情况参考:

https://www.cnblogs.com/paul8339/p/8177683.html

https://www.cnblogs.com/abobo/p/4242417.html  (备注:这个介绍的更详细)

other:

主从复制参考:

http://www.cnblogs.com/agileai/p/6126823.html

猜你喜欢

转载自www.cnblogs.com/dengbingbing/p/10429086.html