(一)gtid主從半同步復制
一、半同步復制原理
mysql默認的復制是異步的,主庫在執行完客戶端提交的事務后會立即將結果返回給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主庫如果crash掉了,此時主庫上已經提交的事務可能並沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。
當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。
介於異步復制和全同步復制之間,主庫在執行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。
二、操作步驟
server2 master
server3 slave
1) 在server2(master)上進行配置文件的修改
---> vim /etc/my.cnf
---> /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
server3、server4 slave
參照官方文檔:https://dev.mysql.com/doc/refman/5.7/en/group-replication-adding-instances.html;最終實現三台主機均可以讀寫,且可以同步。
2、在server2、server3、server4中修改配置文件:
---> vim /etc/my.cnf
---> /etc/init.d/mysqld start # 啟動數據庫
3、在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)
4、在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)
5、測試
#當我們在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: