Mysql5.7的gtid主從半同步復制和組復制


(一)gtid主從半同步復制

一、半同步復制原理

mysql默認的復制是異步的,主庫在執行完客戶端提交的事務后會立即將結果返回給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主庫如果crash掉了,此時主庫上已經提交的事務可能並沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。

當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。

介於異步復制和全同步復制之間,主庫在執行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。 

二、操作步驟

server2   master

server3   slave

1) 在server2(master)上進行配置文件的修改

--->  vim /etc/my.cnf

 

server-id=1         # 表示master的id                  
log-bin=mysql-bin   # 生成二進制文件  
gtid_mode=ON        # 打開gtid模式
enforce_gtid-consistency=ON

 

--->  /etc/init.d/mysqld  start

2)在server3(slave)上編寫配置文件

--->  vim /etc/my.cnf

server-id=2  
gtid_mode=ON
enforce-gtid-consistency=true

 

--->  /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)

 

在此過程出現問題和解決方式

問題1:Slave_SQL_Running: No 

解決方法:start  slave;            # 啟動slave(或者關閉slave之后,---> reset slave,再啟動slave)

問題2:Slave_IO_Running: Connecting,說明主從庫沒有連接上

解決方法:1) 在master中是否對用戶進行授權     

         2) 密碼或pos號是否正確     

         3) 防火牆是否關閉

 

(二)組復制

環境: server2   master

      server3、server4  slave

參照官方文檔:https://dev.mysql.com/doc/refman/5.7/en/group-replication-adding-instances.html;最終實現三台主機均可以讀寫,且可以同步。

 

1、首先關閉server2、3、4的mysqld服務,並把/var/lib/mysql下的內容刪除。

 

2、在server2、server3、server4中修改配置文件:

--->  vim /etc/my.cnf          

 

server_id=1                    # 三個節點的id不同

gtid_mode=ON                   # 打開gtid模式
enforce_gtid_consistency=ON
master_info_repository
=TABLE   # 把relay.info記錄在
slave_relay_log_info表中
relay_log_info_repository=TABLE
log_bin=binlog
 
transaction_write_set_extraction
=XXHASH64
loose-group_replication_group_name
="c1a16382-2146-417d-a1c7-1b77fd000b42"     # uuid我們可以使用uuidgen來生成
loose-group_replication_start_on_boot=off
loose-group_replication_local_address
= "172.25.2.2:24901"         # 填寫自己主機的ip
loose-group_replication_group_seeds= "172.25.2.2:24901,172.25.2.3:24902,172.25.2.4:24901"  # 三個節點ip
loose-group_replication_bootstrap_group
= off
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_ip_writelist='127.0.0.1/8,172.25.2.0/24'
loose-group_replication_single_primary_mode=off

---> /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:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM