MySQL 5.7多(duō)源複制實踐
日期:2017-06-22 10:35:30 / 點擊: 1110
MySQL 5.7發布後,在複制方面有了(le)很大(dà)的(de)改進和(hé)提升。比如開始支持多(duō)源複制 (multi-source) 以及真正的(de)支持多(duō)線程複制了(le)。多(duō)源複制可(kě)以使用(yòng)基于二進制日志的(de)複制或者基于事務的(de)複制。下(xià)面我們講講如何配置基于二進制日志的(de)多(duō)源複制。
什(shén)麽是多(duō)源複制
首先,我們需要清楚幾種常見的(de)複制模式:
1)一主一從
2)一主多(duō)從
3)級聯複制
4)multi-master
MySQL 5.7 之前隻能實現一主一從、一主多(duō)從或者多(duō)主多(duō)從的(de)複制。如果想實現多(duō)主一從的(de)複制,隻能使用(yòng) MariaDB,但是 MariaDB 又與官方的(de) MySQL 版本不兼容。
MySQL 5.7 開始支持了(le)多(duō)主一從的(de)複制方式,也(yě)就是多(duō)源複制。MySQL 5.7 版本相比之前的(de)版本,無論在功能還(hái)是性能、安全等方面都已經有不少的(de)提升。
首先,我們需要清楚 multi-master
與 multi-source
複制不是一樣的(de)。multi-master
複制通(tōng)常是環形複制,你可(kě)以在任意主機上将數據複制給其他(tā)主機。
multi-source
是不同的(de)。簡單的(de)說,多(duō)源複制就是将多(duō)個(gè)主庫同步到一個(gè)從庫上面,從而增加從的(de)利用(yòng)率,節省了(le)機器。如下(xià)圖:
多(duō)源複制使用(yòng)場(chǎng)景
-
數據分(fēn)析部門會需要各個(gè)業務部門的(de)部分(fēn)數據做(zuò)數據分(fēn)析,這(zhè)個(gè)時(shí)候就可(kě)以用(yòng)到多(duō)源複制把各個(gè)主數據庫的(de)數據複制到統一的(de)數據庫中。
-
在從服務器進行數據彙總,如果我們的(de)主服務器進行了(le)分(fēn)庫分(fēn)表的(de)操作,爲了(le)實現後期的(de)一些數據統計功能,往往需要把數據彙總在一起再統計。
-
在從服務器對(duì)所有主服務器的(de)數據進行備份,在MySQL 5.7之前每一個(gè)主服務器都需要一個(gè)從服務器,這(zhè)樣很容易造成資源浪費,同時(shí)也(yě)加大(dà)了(le)DBA的(de)維護成本,但MySQL 5.7引入多(duō)源複制,可(kě)以把多(duō)個(gè)主服務器的(de)數據同步到一個(gè)從服務器進行備份。
使用(yòng)多(duō)源複制的(de)必要條件
不管是使用(yòng)基于二進制日志的(de)複制或者基于事務的(de)複制,要開啓多(duō)源複制功能必須需要在從庫上設置 master-info-repository
和(hé) relay-log-info-repository
這(zhè)兩個(gè)參數。
這(zhè)兩個(gè)參數是用(yòng)來(lái)存儲同步信息的(de),可(kě)以設置的(de)值爲 FILE
和(hé) TABLE
,默認值是 FILE
。比如 master-info
就保存在 master.info
文件中, relay-log-info
保存在 relay-log.info
文件中,如果服務器意外關閉,正确的(de) relay-log-info
沒有來(lái)得(de)及更新到 relay-log.info
文件,這(zhè)樣會造成數據丢失。
爲了(le)數據更加安全,通(tōng)常設爲 TABLE
。這(zhè)些表都是 innodb
類型的(de),支持事務。相對(duì)文件存儲安全得(de)多(duō)。在 MySQL 庫下(xià)可(kě)以看見這(zhè)兩個(gè)表信息,分(fēn)别是 mysql.slave_master_info
和(hé) mysql.slave_relay_log_info
。
這(zhè)兩個(gè)參數也(yě)是可(kě)以動态調整的(de)。
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
如果要啓用(yòng) enhanced multi-threaded slave
(多(duō)線程複制),可(kě)以設置以下(xià)參數
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
relay_log_recovery=ON
如果SLAVE已經爲開啓狀态,那麽需要首先關閉SLAVE(STOP SLAVE;)。
配置多(duō)源複制
環境準備
這(zhè)裏一共使用(yòng)了(le)三台機器,MySQL版本都爲5.7.18。
機器名 | IP地址 | MySQL角色 |
---|---|---|
dev-master-01 | 192.168.2.210 | MySQL 主庫 |
dev-node-01 | 192.168.2.211 | MySQL 主庫 |
dev-node-02 | 192.168.2.212 | MySQL 從庫 |
安裝MySQL
MySQL安裝比較簡單,官方都有提供不同系統的(de)相應軟件源。這(zhè)裏以 Ubuntu 16.04 系統爲例:
-
從MySQL官方網站下(xià)載APT源
$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.6-1_all.deb
更多(duō)軟件源可(kě)參考:http://dev.mysql.com/downloads/repo/apt/
,如果是 CentOS/RHEL
系統可(kě)參考官方文檔:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
-
安裝MySQL軟件源并更新
$ dpkg -i mysql-apt-config_0.8.6-1_all.deb
$ apt-get update
-
安裝MySQL Server和(hé)MySQL Client
$ apt-get install mysql-server mysql-client
-
啓動MySQL Server
$ service mysql start
-
檢查MySQL Server是否成功啓動
$ service mysql status
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2017-06-12 17:16:09 CST; 32s ago
Process: 10442 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
Process: 10399 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 10446 (mysqld)
Tasks: 27
Memory: 190.8M
CPU: 362ms
CGroup: /system.slice/mysql.service
└─10446 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
配置MySQL多(duō)源複制
-
修改MySQL主配置文件
配置 MySQL 多(duō)源複制,主要是需要在 MySQL 從服務器的(de)主配置文件 [mysqld]
段中添加以下(xià)兩行:
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
master-info-repository = table
relay-log-info-repository = table
MySQL主服務器配置片斷
以 dev-master-01
爲例,另一台 Master 也(yě)是類似的(de)配置方法。
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 1
log-bin = /var/log/mysql/mysql-bin
log_bin_index = /var/log/mysql/mysql-bin.index
expire_logs_days = 30
max_binlog_size = 100M
binlog_format = ROW
MySQL從服務器配置片斷
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 3
log-slave-updates = true
skip-slave-start = true
expire_logs_days = 30
max_binlog_size = 100M
log-bin = /var/log/mysql/mysql-bin
relay-log = /var/log/mysql/relay-log
relay-log-index = /var/log/mysql/relay-log-index
relay-log-info-file = /var/log/mysql/relay-log.info
master-info-repository = table
relay-log-info-repository = table
report-port = 3306
report-host = 192.168.2.212
replicate-do-db = master1
replicate-do-db = master2
replicate_wild_do_table=master1.%
replicate_wild_do_table=master2.%
注:server-id
每台必須配置爲不一樣,比如 dev-master-01
爲1,dev-node-01
爲2,dev-node-02
爲3。這(zhè)裏沒有給出全部配置,其它請根據實際情況自行配置。
-
重啓MySQL服務器
$ service mysql restart
-
創建具有複制權限的(de)用(yòng)戶
在兩台 MySQL Master 上創建
mysql> grant replication slave on *.* to 'repl'@'192.168.2.%' identified by '000000';
mysql> flush privileges;
-
從庫分(fēn)别連接至兩個(gè)主庫
MySQL 5.7 有了(le)通(tōng)信渠道的(de)概念,每一個(gè)通(tōng)信渠道都是一個(gè)從服務器到主服務器獲得(de)二進制日志的(de)鏈接。這(zhè)意味著(zhe)每個(gè)通(tōng)信渠道都得(de)有一個(gè) IO_THREAD
。對(duì)于每一個(gè)主服務器,我們需要運行不同的(de) CHANGE MASTER
命令和(hé)FOR CHANNEL
這(zhè)個(gè)參數來(lái)分(fēn)别提供不同通(tōng)信鏈接名字。
下(xià)面開始設置需要同步的(de)源,同步兩個(gè)主服務器的(de)數據到從服務器上。
設置同步源到 Master1 (在 MySQL 從服務器上執行)
mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.210',
MASTER_USER='repl',
MASTER_PORT=3306,
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master1';
設置同步源到 Master2 (在 MySQL 從服務器上執行)
mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.211',
MASTER_USER='repl',
MASTER_PORT=3306,
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master2';
啓動所有SLAVE
mysql> START SLAVE;
也(yě)可(kě)以單獨啓動需要同步的(de)通(tōng)道。
mysql> START SLAVE FOR CHANNEL 'master1';
mysql> START SLAVE FOR CHANNEL 'master2';
停止和(hé) RESET 複制的(de)命令也(yě)同 START 類似,可(kě)以操作所有的(de),也(yě)可(kě)以操作單個(gè)通(tōng)道。
查看SLAVE信息
mysql> SHOW SLAVE STATUS\\\\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
确認 Slave_IO_Running
和(hé) Slave_SQL_Running
兩個(gè)參數都爲 Yes 狀态。
如果要查看單一信道的(de)複制的(de)詳細狀态,可(kě)以使用(yòng)以下(xià)命令:
mysql> SHOW SLAVE STATUS FOR CHANNEL 'master1'\\\\G;
測試多(duō)源複制
-
在主庫(dev-master-01)實例創建一些數據。
mysql> create database master1;
mysql> use master1;
mysql> CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
mysql> insert into test1 values(1,1);