1. 程式人生 > >數據庫 之 Mysql半同步復制

數據庫 之 Mysql半同步復制

tab relay_log 正常 rar nbsp 主從復制 設定 cli library

1 概述

半同步復制指一部分主機同步復制,另一部分主機異步復制

同步的邏輯是用戶寫操作到主服務器,主服務記錄到二進制文件後,主服務會同步發送給從服務器,從服務器響應數據同步後,主服務器才會把響應發給用戶。這種方式對IO有強依賴。

mysql是高度插件化的,半同步復制插件是google共獻給mysql的插件。裝有該插件的服務器才能實現同步復制。半同步復制的插件在主節點和從節點是不一樣的,各自分別使用專有插件,當插件配置啟用後,從節點將同步的方式來同步主服務器數據,其他沒有配置的插件的機器為異步同步機制復制。這裏的同步復制可以設定時間,在一定的時間範圍內,如果配有插件的從服務器沒有復制主服務器的數據,該從服務器將會被降級為異步復制。

PXC:Percona XtraDB Cluster,percona的插件,是一種多主的高可用,可擴展的解決方案,可以在生產環境使用。實現了主從復制集群,和mysql的主從服務復制邏輯不一樣,PXC實現了多主的集群復制,每一個節點都是可讀可寫。通過集群信道來同步信息,不依賴於二進制日誌和中繼日誌,按位復制,不同步量少,實現幾乎同步的復制。二進制級別做校驗,可以發現數據的不一致,但是這個方案不是mysql官方的,這種方案可能會停止維護,當數據量大後,要重新轉移數據庫難度就很大。

本文沒有介紹PXC工具的使用,主要mysql自帶的半同步復制安裝插件才能實現半同步的功能

2 插件安裝

查看當前數據庫安裝的插件

MariaDB [sunny]> show plugins;

mysql支持多種插件,其中,在路徑/usr/lib64/mysql/plugin/下的semisync_master.so和semisync_slave.so這兩個插件實現半同步復制,需要安裝才能使用同步復制功能

在mysql下執行help install查看install的使用方法

安裝語法如下:

mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';

其中,

plugin_name為插件名,與文件名不一致

shared_library_name為共享庫名稱,即/usr/lib64/mysql/plugin/下不需要加.so後綴的插件名。

通過文檔得知插件對應的插件名稱和文件名,沒有規律可尋

半同步復制:

semisync_master.so 主節點的插件

semisync_slave.so 從節點的插件

主節點:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

+------------------------------------+-------+

| Variable_name | Value |

+------------------------------------+-------+

| rpl_semi_sync_master_enabled | OFF |

| rpl_semi_sync_master_timeout | 10000 |

| rpl_semi_sync_master_trace_level | 32 |

| rpl_semi_sync_master_wait_no_slave | ON |

+------------------------------------+-------+

MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON;

從節點:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

+---------------------------------+-------+

| Variable_name | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled | OFF |

| rpl_semi_sync_slave_trace_level | 32 |

+---------------------------------+-------+

MariaDB [mydb]> STOP SLAVE IO_THREAD;

MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

MariaDB [mydb]> START SLAVE IO_THREAD;

判斷方法:

主節點:

MariaDB [mydb]> SELECT @@global.rpl_semi_sync_master_clients;

3 例子 實現半同步復制

步驟一,主從復制模型配置

主服務器71配置

[root@CentOS7A ~]#vim /etc/my.cnf.d/server.cnf

[server]

skip_name_resolve = ON

innodb_file_per_table = ON

max_connections = 20000

log_bin = master-log

server_id = 1

重啟mysql

[root@CentOS7A ~]#systemctl restart mariadb

授權擁有復制權限的賬號

MariaDB [sunny]> grant replication client,replication slave on *.* to 'sunnycopy'@'192.168.1.%' identified by 'Pass123456';

MariaDB [sunny]> flush privileges;

從節點73配置

[root@CentOS7C ~]#vim /etc/my.cnf.d/server.cnf

[server]

skip_name_resolve = ON

innodb_file_per_table = ON

innodb_buffer_pool_size = 256M

max_connections = 2000

relay_log = relay-log

server_id = 2

重啟mysql

[root@CentOS7C ~]#systemctl restart mariadb

連接入從服務器,啟動從服務器的復制

MariaDB [(none)]> change master to master_host='192.168.1.71',master_user='sunnycopy',master_password='Pass1234',master_log_file='master-log.000004',master_log_pos=245;

其中,master_log_file和master_log_pos可以到主服務器上用如下命令

MariaDB [sunny]> show binlog events in 'master-log.000004';

或者

MariaDB [sunny]> show mastert status;

查看從哪個二進制文件的位置開始復制

啟動復制線程

MariaDB [(none)]> start slave;

查看狀態

MariaDB [(none)]> show slave status\G;

到這裏,主從復制集群設置完成。


步驟二,配置為半同步模式

主節點73上安裝模塊

MariaDB [sunny]> install plugin rpl_semi_sync_master soname 'semisync_master';

安裝完成後,在主節點上會生成相關服務器半同步參數

查看如下

MariaDB [sunny]> show global variables like '%rpl%';

+------------------------------------+-------+

| Variable_name | Value |

+------------------------------------+-------+

| rpl_recovery_rank | 0 |

| rpl_semi_sync_master_enabled | OFF |

| rpl_semi_sync_master_timeout | 10000 |

| rpl_semi_sync_master_trace_level | 32 |

| rpl_semi_sync_master_wait_no_slave | ON |

+------------------------------------+-------+

5 rows in set (0.00 sec)

查看半同步復制狀態的相關參數,命令如下

MariaDB [sunny]> show status like '%rpl%';

從節點73安裝插件

MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave';

查看參數

MariaDB [sunny]> show global variables like '%rpl%';

MariaDB [sunny]> show status like '%rpl%';


步驟三,設置參數為啟用

註意,插件安裝完成後,master和slave節點上的rpl_semi_sync_master_enabled 和rpl_semi_sync_slave_enabled都是禁用的,需要啟用

主節點71上啟用

MariaDB [sunny]> set @@global.rpl_semi_sync_master_enabled=on;

從節點73上啟用

MariaDB [(none)]> set @@global.rpl_semi_sync_slave_enabled=on;


步驟四,從節點重啟復制線程

註意,這裏是從原來的主從復制轉為半同步復制,已經設置了同步主機,即執行過change master to的命令,如果沒有需要設置相關參數,然後啟用復制線程

73上設置

MariaDB [(none)]> stop slave io_thread;

MariaDB [(none)]> start slave io_thread;

確認,從服務器的Rpl_semi_sync_slave_status狀態為on才是正常啟用,查看命令如下

MariaDB [(none)]> show status like '%rpl%';

主服務器上查看Rpl_semi_sync_master_clients 參數,value是1,表示已經有1臺從服務器啟用半同步復制方式連接到該主服務器上

MariaDB [sunny]> show status like '%rpl%';

檢查,在主節點,插入數據後,狀態會變化

如73上執行如下操作

MariaDB [sunny]> create database test2;

MariaDB [sunny]> use test2

MariaDB [test2]> create table class(id int,major char(20));

查看相關參數狀態, 就會發生變化,命令如下

MariaDB [test2]> show status like '%rpl%';

半同步復制到這裏配置完成,註意,半同步是一把雙刃劍,因為為了等待事務同步復制事務的完成,需要耗費一定的時間,速度相對較慢。

生成環境,建議用keepalive工具將proxysql配置為高可用,防止單點故障

數據庫 之 Mysql半同步復制