1. 程式人生 > >MySQL 5.7多源複製配置詳解

MySQL 5.7多源複製配置詳解

MySQL 5.7釋出後,在複製方面有了很大的改進和提升。比如開始支援多源複製(multi-source)以及真正的支援多執行緒複製了。多源複製可以使用基於二進位制日子的複製或者基於事務的複製。下面我們說一說如何配置基於二進位制日誌的多源複製。

什麼是多源複製???

首先,我們要清楚幾種常見的複製模式:

一主一從

一主多從

級聯複製

multi-master

MySQL 5.7 之前只能支援一主一從,一主多從或者多主多從的複製。如果想實現多主一從的複製 只能使用mariadb,但是mariadb又與官方的mysql版本不相容。

MySQL 5.7 開始支援了多主一從的複製方式也就是多源複製。MySQL 5.7 版本相比之前的版本,無論是功能還是效能還是安全等方面都已經有了不少的提升。

首先我們要清楚multi-master OR multi-source 複製不是一樣的。multi-master複製通常是環形的複製,可以在任意的主機上將資料複製給其他的主機。如圖:

 

multi-source 是不同的。簡單的說,多源複製就是將多個主庫同步到一個從庫,從而增加從的利用率,節省了機器。如圖:

 

多源複製的使用場景

資料分析部門會需要各個業務部門的部分資料做資料分析,這個時候就可以使用到多源複製把各個主資料庫的資料複製到統一的資料庫中

在從伺服器進行資料的彙總,如果我們的主伺服器進行了分庫分表的操作,為了實現後期的一些資料的統計功能,往往要把資料彙總在一起在進行統計

在從伺服器對所有主伺服器的資料進行備份,在MySQL 5.7之前每個主伺服器都需要一臺從伺服器,這樣很容易造成資源的浪費,同時也加大了DBA的維護成本,但MySQL 5.7引入的多源複製,可以把多個主伺服器的資料同步到一臺從伺服器進行備份。

使用多源複製的必要條件

不管是使用基於二進位制日誌的複製或者基於事務的複製,要開啟多源複製功能必須要在從庫上設定master-info-repository AND relay-log-info-repository 這兩個引數。

這兩個引數是用來儲存同步資訊的,可以設定的值為FILE和TABLE,預設是FILE。比如master-info就儲存在master.info檔案中,relay-log-info儲存在relay-log.inf檔案中伺服器如果意外關閉,正確的relay-log-info沒有來的及更新帶relay-log.info檔案,這樣就會造成資料的丟失。

為了資料更加安全,通常設定為TABLE。這些表都是innodb型別的,支援事務。相對檔案儲存安全得多。在MySQL庫下可以看到這兩個表的資訊,分別是mysql.slave_master_info AND mysql.slave_relay_log_info 。

這兩個引數也是可以動態調整的。

SET GLOBAL master_info_repository = 'TABLE';

SET GLOBAL relay_log_info_repository = 'TABLE';

如果要啟用enhanced multi-threaded slave(多執行緒複製),可以設定一下引數

slave-parallel-type=LOGICAL_CLOCK

slave-parallel-workers=8

relay_log_recovery=ON

如果SLAVE已經為開啟狀態,那麼需要首先關閉SLAVE(stop slave;)

配置多源複製

環境準備:

hostname

IP

mysql

dev-master-01

192.168.1.131

master

dev_node-01

192.168.1.132

master

dev-node-02

192.168.1.133

slave

安裝MySQL 5.7版本:

可參考官方文件:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

MySQL 5.7軟體包下載地址:https://dev.mysql.com/downloads/repo/yum/

下載yum源rpm安裝包:wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

安裝yum源:yum localinstall mysql57-community-release-el7-11.noarch.rpm

檢查mysql源是否安裝成功:yum repolist enable | grep "mysql.*-community.*"

 安裝MySqL:yum install mysql-community-server

 啟動MySQL服務:systemctl start mysqld

 檢視MySQL的啟動狀態:systemctl status mysqld

 設定開機自啟:systemctl enable mysqld ----> systemctl daemon-reload

 修改root預設密碼(這裡出現了一些小問題)下面做問題的闡述

在修改密碼的過程中出現了和官網上說法不一致的問題

官網的說法:

mysql安裝完成後,在/var/log/mysqld.log檔案中給root生成一個預設的密碼,通過下面的方式可以找到root的預設密碼,然後登入mysql進行修改:

找密碼:grep 'temporary password' /var/log/mysqld.log

登入mysql:mysql -uroot -p

修改密碼:ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'

注意:MySQL的 validate_password 外掛預設安裝。這將要求密碼至少包含一個大寫字母,一個小寫字母,一位數字和一個特殊字元,並且總密碼長度至少為8個字元。

我自己遇到的問題:

使用官方提供的找密碼的命令根本就在mysqld.log檔案中找不到預設的密碼,只能想辦法自己解決mysql的密碼的問題了 嘗試了一些mysql5.7之前的版本的修改密碼的方法但是還是不可行,但是最後還是想到了一種相當簡單的方法:

 修改/etc/my.cnf 在[mysqld]下面新增 skip-grant-tables=1 這一行配置 讓mysql啟動的時候不對密碼進行驗證

 重啟mysqld服務:systemctl restart mysqld

 使用root使用者登入到mysql:mysql -uroot

 切換到mysql資料庫:use mysql;

 更新user表:UPDATE user SET authentication_string = PASSWORD('sycx_2009abc') WHERE user = 'root';

 使修改後生效:FLUSH PRIVILEGES;

 退出mysql,編輯/etc/my.cnf檔案 註釋掉skip-grant-tables=1

 重啟mysqld服務,再用新密碼登入即可

配置多源複製:

上面我們已經把MySQL 5.7版本的mysql安裝成功了 現在我們只要修改my.cnf配置檔案重啟mysql驗證多源複製即可。步驟如下:

 修改192.168.1.131和192.168.1.132下面的/etc/my.cnf檔案,修改如下:記得修改配置引數中的server-id(192.168.1.131為1,那麼192。168.1.132就得是2,每臺伺服器中的這個id不能一樣,切記!!!)

[mysqld]
# 指定埠 不指定預設3306
#port=5603
# mysql資料存放路徑
datadir=/var/lib/mysql
# mysql socker檔案存放路徑
socket=/var/lib/mysql/mysql.sock
# 建立符號連結(建議禁用符號連結,以防止各種安全風險。開啟將引數的值設定為1)
symbolic-links=0
# 錯誤日誌存放路徑
log-error=/var/log/mysqld.log
# 啟動pid檔案存放路徑
pid-file=/var/run/mysqld/mysqld.pid
# 設定主從的時候的唯一ID 每臺主機的ID不可重複
server-id=1
# #開啟日誌(主機需要開啟),這個mysql-bin也可以自定義,這裡也可以加上路徑,如:/home/www/mysql_bin_log/mysql-bin
log-bin=mysql-bin
# 設定mysql的複製模式(STATEMENT  ROW  MIXED)
binlog_format=mixed
# 繞過密碼驗證可直接使用root登入(用於修改密碼)
#skip-grant-tables=1
# 啟動伺服器來禁用主機名快取
skip-host-cache
# 如果這個引數設為OFF,則MySQL服務在檢查客戶端連線的時候會解析主機名;如果這個引數設為ON,則MySQL服務只會使用IP,在這種情況下,授權表中的Host欄位必須是IP地址或localhost。
skip-name-resolve
# 網路傳輸時單個數據包的大小
max_allowed_packet = 500M
# 設定資料庫的時間
default-time-zone = '+8:00'
# 內部記憶體臨時表的最大記憶體
tmp_table_size=200M
# MySQL伺服器用來作普通索引掃描、範圍索引掃描和不使用索引而執行全表掃描���些操作所用的快取大小。
join_buffer_size = 32M
# 每個會話執行排序操作所分配的記憶體大小。
sort_buffer_size = 1M
# 每個客戶端執行緒和連線快取和結果快取互動,每個快取最初都被分配大小為net_buffer_length的容量,並動態增長,直至達到max_allowed_packet引數的大小
net_buffer_length = 8K
# 為每個執行緒對MyISAm表執行順序讀所分配的記憶體。如果資料庫有很多順序讀,可以增加這個引數,預設值是131072位元組。
read_buffer_size = 512K
# 這個引數用在MyISAM表和任何儲存引擎表隨機讀所使用的記憶體。
read_rnd_buffer_size = 32M
# 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操作中,MyISAM索引排序使用的快取大小。
myisam_sort_buffer_size = 256M
# 設定客戶端的併發連線數量
max_connections = 8000
# mysql關閉非互動連線前的等待時間,單位是秒
wait_timeout = 604800
# Mysql關閉互動連線前的等待時間,單位是秒
interactive_timeout = 604800
# 設定遠端使用者必須迴應PORT型別資料連線的最大時間
connect_timeout = 30
# 如果客戶端嘗試連線的錯誤數量超過這個引數設定的值,則伺服器不再接受新的客戶端連線。可以通過清空主機的快取來解除伺服器的這種阻止新連線的狀態,通過FLUSH HOSTS或mysqladmin flush-hosts命令來清空快取。
max_connect_errors = 30000
# mysql關閉連線前的等待時間,單位是秒
interactive_timeout = 86400
# 慢查詢的時間設定,單位為秒
long_query_time = 20
# mysql服務快取以重用的執行緒數
thread_cache_size = 120
# 為查詢結果所分配的快取
query_cache_size = 256M
# 如果一個事務需要的記憶體超過這個引數,就會報錯
max_heap_table_size=2097152000

2、修改192.168.1.133也就是從庫的/etc/my.cnf 配置引數,配置如下:(記得修改server-id為3,不能和其他伺服器id一樣,切記!!!)

[mysqld]
# 指定埠 不指定預設3306
#port=5603
# mysql資料存放路徑
datadir=/var/lib/mysql
# mysql socker檔案存放路徑
socket=/var/lib/mysql/mysql.sock
# 建立符號連結(建議禁用符號連結,以防止各種安全風險。開啟將引數的值設定為1)
symbolic-links=0
# 錯誤日誌存放路徑
log-error=/var/log/mysqld.log
# 啟動pid檔案存放路徑
pid-file=/var/run/mysqld/mysqld.pid
# 設定主從的時候的唯一ID 每臺主機的ID不可重複
server-id=1
# #開啟日誌(主機需要開啟),這個mysql-bin也可以自定義,這裡也可以加上路徑,如:/home/www/mysql_bin_log/mysql-bin
log-bin=mysql-bin
# 設定mysql的複製模式(STATEMENT  ROW  MIXED)
binlog_format=mixed
# 繞過密碼驗證可直接使用root登入(用於修改密碼)
#skip-grant-tables=1
# 啟動伺服器來禁用主機名快取
skip-host-cache
# 如果這個引數設為OFF,則MySQL服務在檢查客戶端連線的時候會解析主機名;如果這個引數設為ON,則MySQL服務只會使用IP,在這種情況下,授權表中的Host欄位必須是IP地址或localhost。
skip-name-resolve
# 網路傳輸時單個數據包的大小
max_allowed_packet = 500M
# 設定資料庫的時間
default-time-zone = '+8:00'
# 內部記憶體臨時表的最大記憶體
tmp_table_size=200M
# MySQL伺服器用來作普通索引掃描、範圍索引掃描和不使用索引而執行全表掃描這些操作所用的快取大小。
join_buffer_size = 32M
# 每個會話執行排序操作所分配的記憶體大小。
sort_buffer_size = 1M
# 每個客戶端執行緒和連線快取和結果快取互動,每個快取最初都被分配大小為net_buffer_length的容量,並動態增長,直至達到max_allowed_packet引數的大小
net_buffer_length = 8K
# 為每個執行緒對MyISAm表執行順序讀所分配的記憶體。如果資料庫有很多順序讀,可以增加這個引數,預設值是131072位元組。
read_buffer_size = 512K
# 這個引數用在MyISAM表和任何儲存引擎表隨機讀所使用的記憶體。
read_rnd_buffer_size = 32M
# 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操作中,MyISAM索引排序使用的快取大小。
myisam_sort_buffer_size = 256M
# 設定客戶端的併發連線數量
max_connections = 8000
# mysql關閉非互動連線前的等待時間,單位是秒
wait_timeout = 604800
# Mysql關閉互動連線前的等待時間,單位是秒
interactive_timeout = 604800
# 設定遠端使用者必須迴應PORT型別資料連線的最大時間
connect_timeout = 30
# 如果客戶端嘗試連線的錯誤數量超過這個引數設定的值,則伺服器不再接受新的客戶端連線。可以通過清空主機的快取來解除伺服器的這種阻止新連線的狀態,通過FLUSH HOSTS或mysqladmin flush-hosts命令來清空快取。
max_connect_errors = 30000
# mysql關閉連線前的等待時間,單位是秒
interactive_timeout = 86400
# 慢查詢的時間設定,單位為秒
long_query_time = 20
# mysql服務快取以重用的執行緒數
thread_cache_size = 120
# 為查詢結果所分配的快取
query_cache_size = 256M
# 如果一個事務需要的記憶體超過這個引數,就會報錯
max_heap_table_size=2097152000
# mysql5.7 多源複製從庫的配置引數
master-info-repository = table # 這個引數是必須的
relay-log-info-repository = table # 這個引數是必須的
report-port = 3306
report-host = 192.168.1.131
replicate-do-db = master1
replicate-do-db = master2
replicate_wild_do_table=master1.%
replicate_wild_do_table=master2.%

3、重新啟動mysql服務:systemctl restart mysqld

4、升級mysql授權表:mysql_upgrade -uroot -p

5、登入192.168.1.131和192.168.1.132的mysql:mysql -uroot -p

6、以下的執行都是在192.168.1.131和192.168.1.132的mysql中執行sql語句

建立mysql的主從授權使用者:grant replication slave on *.*  to 'slave'@'192.168.1.%' identified by '2017123';

重新整理生效:FLUSH PRIVILEGES;

7、登入192.168.1.133的mysql執行sql語句:

CHANGE MASTER TO MASTER_HOST='192.168.1.131',
MASTER_USER='slave',
MASTER_PORT=3306,
MASTER_PASSWORD='2017123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master1';
CHANGE MASTER TO MASTER_HOST='192.168.1.132',
MASTER_USER='slave',
MASTER_PORT=3306,
MASTER_PASSWORD='2017123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master2';

8、全部顯示sql語句執行ok,然後檢視主從的狀態:

執行sql語句:show  slave  status\G;

如果要檢視單一通道的複製的詳細狀態,可以使用以下命令:

SHOW SLAVE STATUS FOR CHANNEL 'master1'\G;

9、在主庫(192.168.1.131)例項建立一些資料。

create database master1;
 
use master1;
 
CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
 
insert into test1 values(1,1);

10、在主庫(192.168.1.132)例項建立一些資料。

create database master2;
 
use master2;
 
CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
 
insert into test2 values(1,1);

11、在從庫(192.168.1.133)例項檢查資料是否成功複製。

select * from master1.test1;
 
select * from master2.test2;

12、列出所有的複製通道的複製狀態概況:

select * from performance_schema.replication_applier_status_by_worker;

13、在 performance_schema 庫中,提供了複製相關的一些檢視,可供檢視複製相關的資訊。

use performance_schema;
 
show tables like '%repl%';

這些表裡分別有多源通道的配置資訊和多源通道的狀態資訊,另外還有連線配置資訊和連線狀態資訊,如果配置了多執行緒複製的話,還會有多執行緒配置資訊和多執行緒狀態資訊。

其它一些需要注意的點:

 初次配置耗時較長,需要將各個 master 的資料 dump 下來,再 source 到 slave 上。

 需要考慮各 master 資料增長頻率,slave 的資料增長頻率是這些資料的總和。如果太高,會導致大量的磁碟IO,造成資料更新延遲,最嚴重的是會影響正常的查詢。

 如果多個主資料庫例項中存在同名的庫,則同名庫的表都會放到一個庫中;

 如果同名庫中的表名相同且結構相同,則資料會到一起;如果結構不同,則先建的有效。