關於MariaDB.10.5.1 主從複製介紹

提示:本博文演示環境是基於centos7.2 x86_64位,最小化安裝系統,MariaDB.10.5.1二進制安裝來進行的

一、簡單介紹下slave庫的並行複製模式

slave_parallel_mode的 slave並行複製的5種模式:
官方給的5種模式

Description: Controls what transactions are applied in parallel when using parallel replication.
optimistic: tries to apply most transactional DML in parallel, and handles any conflicts with rollback and retry. See optimistic mode.
conservative: limits parallelism in an effort to avoid any conflicts. See conservative mode.
aggressive: tries to maximize the parallelism, possibly at the cost of increased conflict rate.
minimal: only parallelizes the commit steps of transactions.
none: disables parallel apply completely.

in-order 有序並行複製的optimistic樂觀模式爲在slave上並行應用提供了很多機會,同時從應用程序的角度來看,仍然保留精確的事務語義。這是MariaDB 10.5.1中的默認模式

二、master_use_gtid 參數說明:

配置主從複製時, CHANGE MASTER TO master_use_gtid = { slave_pos | current_pos | no } 這3個參數介紹:

2.1、CHANGE MASTER TO master_use_gtid=slave_pos 介紹:

假如:
A slave is configured to use GTID by CHANGE MASTER TO master_use_gtid=slave_pos

當slave從站連接到master主站時,它將在複製到從站的最後一個GTID的位置開始複製,這可以在變量gtid_slave_pos中看到。由於所有複製服務器上的GTID均相同,因此可以將從屬服務器指向其他主服務器,並自動確定正確的位置。

如果不希望更改從屬服務器上的binlog會影響GTID複製位置,則應使用master_use_gtid = slave_pos。然後,從站將始終在最後複製的GTID位置連接到主站。
對於期望與傳統複製保持一致行爲的用戶來說,這可以避免一些意外,因爲複製位置永遠不會因服務器上進行的本地更改而改變

如果在從站上寫入任何本地事務,則在使用值current_pos時可能會遇到問題。例如,如果在slave從屬線程停止時發出INSERT語句或以其他方式寫入表,則可能在gtid_binlog_pos中生成新的本地GTID,這將影響從屬的gtid_current_pos值。重新啓動從屬線程時,這可能會導致錯誤,因爲主控制器將不存在本地GTID。您可以通過將MASTER_USE_GTID複製參數設置爲slave_pos而不是current_pos來糾正此問題。

重要提示:下面3種場景的演示環境: centos7.2_x86_64位 MariaDB.10.5.1 二進制安裝
mgr01 172.16.0.130 master
mgr03 172.16.0.131 slave

1.場景1:當線上的master庫運行了一段時間,而且數據庫的數據很少。針對此場景給master庫部署一個全新的slave庫

mgr03啓動後默認情況下GTID位點都是空的,尤其是gtid_slave_pos 這個是空的


(root@'mgr03':mysql.sock)[(none)]>show variables like 'Gtid%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| gtid_binlog_pos         |       |
| gtid_binlog_state       |       |
| gtid_cleanup_batch_size | 64    |
| gtid_current_pos        |       |
| gtid_domain_id          | 0     |
| gtid_ignore_duplicates  | OFF   |
| gtid_pos_auto_engines   |       |
| gtid_seq_no             | 0     |
| gtid_slave_pos          |       |
| gtid_strict_mode        | OFF   |
+-------------------------+-------+
10 rows in set (0.00 sec)

(root@'mgr03':mysql.sock)[(none)]>ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.02 sec)

(root@'mgr03':mysql.sock)[(none)]>show variables like 'Gtid%';
+-------------------------+-------------+
| Variable_name           | Value       |
+-------------------------+-------------+
| gtid_binlog_pos         | 0-1313306-1 |
| gtid_binlog_state       | 0-1313306-1 |
| gtid_cleanup_batch_size | 64          |
| gtid_current_pos        | 0-1313306-1 |
| gtid_domain_id          | 0           |
| gtid_ignore_duplicates  | OFF         |
| gtid_pos_auto_engines   |             |
| gtid_seq_no             | 0           |
| gtid_slave_pos          |             |
| gtid_strict_mode        | OFF         |
+-------------------------+-------------+
10 rows in set (0.01 sec)

master操作:

提示:reset master 這一步操作不是必須的,除非在這個庫之前,此數據庫做過別的集羣的slave庫。尤其是在master庫上,嚴禁此操作,除非你清楚的知道自己在幹什麼

mysql -e "grant replication slave on *.* to repuser@'172.16.0.%' identified by 'JuwoSdk21TbUser'; flush privileges;"
mysqldump -uroot -p'123456' -B -A -F  --master-data=2 --single-transaction  --events|gzip >test.sql.gz
scp -rp -P52110 /opt/tes.sql.gz [email protected]:/root

slave操作:

(root@'mgr03':mysql.sock)[test]>source /root/test.sql
CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G

2.場景2: 當線上的master庫運行了一段時間,而且數據庫的數據很少。針對此場景給master庫部署一個slave庫。但是這個新slave庫之前有做過其他的項目的主庫

那麼初始位置需要手動設置爲空:SET GLOBAL gtid_slave_pos = "";

mgr01-master :
當前gtid情況:

root@localhost [test]>show variables like 'Gtid%';
+-------------------------+--------------+
| Variable_name           | Value        |
+-------------------------+--------------+
| gtid_binlog_pos         | 0-1283306-50 |
| gtid_binlog_state       | 0-1283306-50 |
| gtid_cleanup_batch_size | 64           |
| gtid_current_pos        | 0-1283306-50 |
| gtid_domain_id          | 0            |
| gtid_ignore_duplicates  | OFF          |
| gtid_pos_auto_engines   |              |
| gtid_seq_no             | 0            |
| gtid_slave_pos          | 0-1313306-41 |
| gtid_strict_mode        | OFF          |
+-------------------------+--------------+
10 rows in set (0.001 sec)

mgr03-slave:
當前gtid情況:


(root@'mgr03':mysql.sock)[test]>show variables like 'Gtid%';
+-------------------------+---------------------------+
| Variable_name           | Value                     |
+-------------------------+---------------------------+
| gtid_binlog_pos         | 0-1313306-45              |
| gtid_binlog_state       | 0-1283306-42,0-1313306-45 |
| gtid_cleanup_batch_size | 64                        |
| gtid_current_pos        | 0-1313306-45              |
| gtid_domain_id          | 0                         |
| gtid_ignore_duplicates  | OFF                       |
| gtid_pos_auto_engines   |                           |
| gtid_seq_no             | 0                         |
| gtid_slave_pos          | 0-1283306-42              |
| gtid_strict_mode        | OFF                       |
+-------------------------+---------------------------+
10 rows in set (0.00 sec)

具體操作:

master操作:

mysql -e "grant replication slave on *.* to repuser@'172.16.0.%' identified by 'JuwoSdk21TbUser'; flush privileges;"

mysqldump -uroot -p'123456' -B -A -F  --master-data=2 --single-transaction  --events|gzip >test.sql.gz

scp -rp -P52110 /opt/test.sql.gz [email protected]:/root

slave操作:


(root@'mgr03':mysql.sock)[test]>source /root/test.sql

(root@'mgr03':mysql.sock)[test]>reset master ;
(root@'mgr03':mysql.sock)[test]>stop slave;
Query OK, 0 rows affected (0.12 sec)
(root@'mgr03':mysql.sock)[test]>reset slave all;
(root@'mgr03':mysql.sock)[test]>SET GLOBAL gtid_slave_pos = "";
Query OK, 0 rows affected (0.03 sec)

(root@'mgr03':mysql.sock)[test]>show variables like 'Gtid%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| gtid_binlog_pos         |       |
| gtid_binlog_state       |       |
| gtid_cleanup_batch_size | 64    |
| gtid_current_pos        |       |
| gtid_domain_id          | 0     |
| gtid_ignore_duplicates  | OFF   |
| gtid_pos_auto_engines   |       |
| gtid_seq_no             | 0     |
| gtid_slave_pos          |       |
| gtid_strict_mode        | OFF   |
+-------------------------+-------+
10 rows in set (0.00 sec)

(root@'mgr03':mysql.sock)[test]>CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G

3.場景三:從mysqldump或者XtraBackup或者Mariabackup備份集設置

這兩種方式都可以在非阻塞的情況下獲得備份時正確的Binlog位點(所有表都要是事務引擎),當然,如果備份時不會有寫入,那麼 SHOW MASTER STATUS 也能提供正確的位點。
一旦獲取了備份時正確的Binlog位點(文件名和偏移量),那麼就可以用BINLOG_GTID_POS()函數來計算GTID:SELECT BINLOG_GTID_POS("mysql-bin.000011",342);

使用mysqldump +gtid 方式新建slave:

從MariaDB 10.0.13版本開始,mysqldump會自動完成這個工作,並且把GTID的寫在導出文件中,只要設置 –master-data 或 -dump-slave 的同時設置 --gtid 即可。

mgr01-master:

[root@mgr01 ~]# mysqldump -uroot -p'123456' -B -A -F  --master-data=1 --gtid  --single-transaction  --events >2.sql
[root@mgr01 ~]# 
[root@mgr01 ~]# grep  'CHANGE MASTER TO' 2.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=342;
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;

(root@'mgr01':mysql.sock)[(none)]>SELECT BINLOG_GTID_POS("mysql-bin.000011",342);
+-----------------------------------------+
| BINLOG_GTID_POS("mysql-bin.000011",342) |
+-----------------------------------------+
| 0-1283306-68                            |
+-----------------------------------------+
1 row in set (0.009 sec)

[root@mgr01 ~]# scp -rp -P52110 2.sql root@'172.16.0.131':/root

slave庫操作:

(root@'mgr03':mysql.sock)[test]>source /root/2.sql
(root@'mgr03':mysql.sock)[test]>show variables like 'gtid_slave_pos';
+----------------+--------------+
| Variable_name  | Value        |
+----------------+--------------+
| gtid_slave_pos | 0-1283306-68 |
+----------------+--------------+
1 row in set (0.00 sec)

(root@'mgr03':mysql.sock)[test]>SET GLOBAL gtid_slave_pos = "0-1283306-68";   這一步可有可無
(root@'mgr03':mysql.sock)[test]>CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G

使用當日Mariabackup的全備份來新建一個slave庫:

mgr01 master 庫上操作:

master主庫上創建備份用戶
root@localhost [(none)]>grant  reload,replication client,lock tables,process,super on *.* to mariabackup@'127.0.0.1' identified by 'mypassword';flush privileges;

 mariabackup --backup --target-dir=/data/backup/  --user=mariabackup --password=mypassword  --host=127.0.0.1
 mariabackup --prepare --target-dir=/data/backup/

cd /data/; tar zcf bak.tar.gz ./backup
scp -rp -P22 bak.tar.gz [email protected]:/root

[root@mgr01 data]# cat /data/backup/xtrabackup_binlog_info 
mysql-bin.000013    746 0-1283306-74

mgr03 slave庫上操作:


[root@mgr03 ~]# mariabackup  --defaults-file=/etc/my.cnf  --copy-back  --target-dir=/data/backup/
 chown -R mysql.mysql  /data/mysql/mysql3306/data
 /etc/init.d/mysql start

 基於Gtid複製配置:
SET GLOBAL gtid_slave_pos = "0-1283306-74";
CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G

基於File and Position複製配置:

CHANGE MASTER TO 
   MASTER_HOST='mgr01', 
   MASTER_PORT=3306, 
   MASTER_USER="repuser",  
   MASTER_PASSWORD="JuwoSdk21TbUser", 
   MASTER_LOG_FILE='mysql-bin.000013',
   MASTER_LOG_POS=746;
START SLAVE;

從一個線上的slave庫進行 mariabackup備份數據庫,然後利用這個備份做當前master庫的slave庫:
基於Gtid複製配置:
master庫操作:

mariabackup --backup --slave-info --safe-slave-backup --target-dir=/data/backup/  --user=mariabackup --password=mypassword
 mariabackup --prepare --target-dir=/data/backup/
 cd /data/; tar zcf bak.tar.gz ./backup
scp -rp -P22 bak.tar.gz [email protected]:/root
[root@mgr01 data]# cat /data/backup/xtrabackup_binlog_info 
mysql-bin.000013    746 0-1283306-74

slave庫操作:

SET GLOBAL gtid_slave_pos = "0-1283306-74";
CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G

2.2、CHANGE MASTER TO master_use_gtid=curren_pos 介紹:

假設我們設置了兩個服務器A和B,讓A作爲master主服務器,而B作爲slave從服務器。它運行了一段時間。然後在某個時候,masterA掛掉了,而slaveB成爲了新的master。
然後,稍後我們想添加源masterA作爲備庫,也就是作爲新的master 的slave庫。
因爲A之前從來不是slave庫,它沒有任何先前複製的GTID,並且gtid_slave_pos是空的,
爲了允許A自動添加爲slave庫,可以使用master_use_gtid = current_pos,這將使用變量gtid_current_pos的值而不是gtid_slave_pos進行連接,gtid_current_pos該變量還考慮了當服務器作爲主服務器時寫入二進制日誌中的GTID。
使用master_use_gtid = current_pos時,在使用CHANGE MASTER之前無需考慮服務器是master還是slave.
但是必須注意不要將多餘的事務注入到slave 上的binlog中,這些事務不打算複製到其他服務器。
如果這樣的額外事務是slave服務器啓動時最新的事務,它將用作複製的起點。這可能會失敗,因爲該事務不在master主服務器上。爲了避免slave從屬服務器上的本地事務更改進入binlog,請將slave上的sql_log_bin設置爲0。

啓用GTID嚴格模式(通過將@@ GLOBAL.gtid_strict_mode設置爲1)時,通常最好使用current_pos。在嚴格模式下,不允許在主服務器上進行額外的事務
提示:
不應以任何其他方式修改mysql.gtid_slave_pos表。特別是,請勿嘗試更新表中的行以更改從站對當前GTID位置的想法

2.3、CHANGE MASTER TO master_use_gtid =no

這個是配置基於filename,pos傳統複製的配置,這個在此不再演示描述,具體配置可以自行搜索本博主的文章或者百度。
到此處關於mariadb的主從複製介紹完畢,歡迎一起交流學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章