(一)gtid主從半同步複製html
1、半同步複製原理
mysql
mysql默認的複製是異步的,主庫在執行完客戶端提交的事務後會當即將結果返回給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主庫若是crash掉了,此時主庫上已經提交的事務可能並無傳到從上,若是此時,強行將從提高爲主,可能致使新主上的數據不完整。
sql
當主庫執行完一個事務,全部的從庫都執行了該事務才返回給客戶端。由於須要等待全部從庫執行完該事務才能返回,因此全同步複製的性能必然會收到嚴重的影響。數據庫
介於異步複製和全同步複製之間,主庫在執行完客戶端提交的事務後不是馬上返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步複製,半同步複製提升了數據的安全性,同時它也形成了必定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。因此,半同步複製最好在低延時的網絡中使用。
bootstrap
2、操做步驟
vim
server2 master安全
server3 slave
網絡
1) 在server2(master)上進行配置文件的修改異步
---> vim /etc/my.cnf ide
---> /etc/init.d/mysqld start
2)在server3(slave)上編寫配置文件
---> vim /etc/my.cnf
---> /etc/init.d/mysqld start
3)在slave中,基於gtid的主從複製搭建成功後,關閉slave。 (能夠參照以前的博客mysql的gtid的主從複製)
4)在master中安裝半同步複製所需的模塊
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> show variables like '%semi_sync%'; # 半同步複製等待時間爲10s
5)在slave中安裝模塊並查看
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show global variables like '%semi%'; # 查看半同步的信息
---> start slave;
6)在master中插入一條語句,並進行檢測
mysql> use student;
mysql> insert into msg values ('4','lala');
mysql> show status like '%semi_sync%'; # 能夠看到半同步成功了次數加了1
註釋: Rpl_semi_sync_master_yes_tx ##使用半同步成功的次數,數據一致性性能提升
Rpl_semi_sync_master_no_tx ##使用半同步失敗的次數,10s後沒有獲得反饋信息,會轉爲異步複製
7)將slave的半同步關閉時候,進行插入測試
mysql> set global rpl_semi_sync_slave_enabled=OFF; ###將半同步設置爲關閉
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show global variables like '%semi%';
# 此時在server2(master)中再插入一條數據測試。結果以下:
mysql> insert into msg values ('5','ling'); # 本次插入花費了十秒,由於異步複製有十秒等待slave發送ack的時間;若10s後尚未反映,就會轉換爲異步複製。
mysql> show global status like '%semi%'; # 查看異步複製的執行記錄(失敗次數+1)
(二)組複製
環境: server2 master
server三、server4 slave
參照官方文檔:https://dev.mysql.com/doc/refman/5.7/en/group-replication-adding-instances.html;最終實現三臺主機都可以讀寫,且能夠同步。
二、在server二、server三、server4中修改配置文件:
---> vim /etc/my.cnf
---> /etc/init.d/mysqld start # 啓動數據庫
三、在server2中進行mysql的登錄,並進行設置。(隨機密碼在/var/log/mysqld下查找)
mysql> SET SQL_LOG_BIN=0; # 關閉日誌同步
mysql> alter user root@localhost identified by 'Xniu+123'; # 修改root用戶密碼
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' identified by 'Xniu+123'; # 向rel_user用戶授予全部權限(用來同步信息)
mysql> FLUSH PRIVILEGES; # 刷新受權表
mysql> reset master;
mysql> SET SQL_LOG_BIN=1; # 開啓日誌記錄
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xniu+123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # 安裝組複製所需的模塊
mysql> SHOW PLUGINS;
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members; # 此時server2已添加到組中。(狀態爲online)
四、在server3和server4中進行mysql的設置。因爲步驟相同,在這以server3爲例顯示:
mysql> SET SQL_LOG_BIN=0;
mysql> alter user root@localhost identified by 'Xniu+123';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Xniu+123';
mysql> reset master;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xniu+123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members; # 若此時server4也配置完成,則結果以下:(狀態均爲online)
五、測試
#當咱們在server2中建立數據庫時,全部節點都可以看到
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
server2:
server3:
server4:
# 當咱們在server4中插入信息時,在srver2和server3中結果以下:
mysql> INSERT INTO test.t1 VALUES (2, 'Lucy');
server2:
server3: