Mysql5.7的gtid主從半同步複製和組複製

(一)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

 

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

      server三、server4  slave

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

 

一、首先關閉server二、三、4的mysqld服務,並把/var/lib/mysql下的內容刪除。

 

二、在server二、server三、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
slave_relay_log_infoloose-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     # 啓動數據庫

三、在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:

相關文章
相關標籤/搜索