mysql 5.7半同步搭建_MySQL5.7半同步復制
半同步復制原理:
半同步復制保證了數據庫之間數據的一致性。
MySQL5.7以前:rpl_semi_sync_master_wait_point = AFTER_COMMIT
client-->MySQL SQL Parse-->Storage Involve-->write binary log-->storage commit-->wait ACK-->client(OK)
主庫把每一個事務寫到二進制日志並保存到磁盤上,且發送給從庫,並把事務寫到存儲引擎里,主庫在等待從庫寫到自己的relay-log里確認信息。在接收到確認信息后,主庫把相應結果返回給客戶端。
問題:主庫把事務寫到存儲后,如果此時從庫因網絡等問題沒有收到,但此時主庫又掛了,在HA架構中,因故障轉移進行主從切換時,就丟失了該事務。
MySQL5.7:rpl_semi_sync_master_wait_point = AFTER_SYNC
client-->MySQL SQL Parse-->Storage Involve-->write binary log-->wait ACK-->storage commit-->client(OK)
主庫把每一個事務寫道二進制日志並保存到磁盤上,並發給從庫,主庫等待從庫寫到自己的relay-log日志里的確認信息。主庫收到確認后再將事務寫到存儲引擎里,然后將結果返回給客戶端。
rpl_semi_sync_master_wait_slave_count 指定有幾台slave收到binlog才成功返客戶端請求,默認任意一台。
實驗實現:
master:172.25.67.1
slave1:172.25.67.3
slave2:172.25.67.4
firewalld selinux disabled
安裝mysql5.7
半同步復制模式必須在主服務器和從服務器同時啟用,否則主服務器默認使用異步復制模式。
master和slave都做:
半同步復制需要安裝相應插件,如果用rpm包裝的mysql5.7,則插件在該目錄下:/usr/lib64/mysql/plugin/mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled=ON;
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=ON;
初次加載插件后,MySQL會將該插件記錄到系統表mysql.plugin中,下次啟動會自動加載該插件,但如果要讓插件自動生效,需要修改配置文件:vim /etc/my.cnf
log-bin=mysql-bin
binlog-do-db=test
server-id=1 #slave的id一定不同
binlog-ignore-db=mysql
# 自動開啟半同步復制
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_slave_enabled=ON
***********
測試:
master:mysql> show status like "%semi%";
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 2 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 2 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 252 |
| Rpl_semi_sync_master_tx_wait_time | 252 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
| Rpl_semi_sync_slave_status | OFF |
+--------------------------------------------+-------+
Rpl_semi_sync_master_clients 用於顯示有多少個從服務器配置成了半同步模式
Rpl_semi_sync_master_status 用於指示主服務器是使用異步還是半同步模式,ON->半同步
Rpl_semi_sync_master_yes_tx 用於顯示從服務器確認的成功提交數量
在slave:mysql> show status like "%semi%";
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_slave_status | ON |
+--------------------------------------------+-------+
Rpl_semi_sync_slave_status 表示從服務器的半同步復制模式已經開始工作。
壓力測試:
半同步復制:[root@server1 ~]# mysqlslap -uroot -pxxxxxxxx --concurrency=100 --number-of-queries=1000 --auto-generate-sql
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
Average number of seconds to run all queries: 2.094 seconds
Minimum number of seconds to run all queries: 2.094 seconds
Maximum number of seconds to run all queries: 2.094 seconds
Number of clients running queries: 100
Average number of queries per client: 10
異步復制:[root@server1 ~]# mysqlslap -uroot -pxxxxxxxx --concurrency=100 --number-of-queries=1000 --auto-generate-sql
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
Average number of seconds to run all queries: 1.840 seconds
Minimum number of seconds to run all queries: 1.840 seconds
Maximum number of seconds to run all queries: 1.840 seconds
Number of clients running queries: 100
Average number of queries per client: 10
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
