《MySQL 5.7多源復制實踐》要點:
本文介紹了MySQL 5.7多源復制實踐,希望對您有用。如果有疑問,可以聯系我們。
MySQL 5.7發布后,在復制方面有了很大的改進和提升.比如開始支持多源復制 (multi-source) 以及真正的支持多線程復制了.多源復制可以使用基于二進制日志的復制或者基于事務的復制.下面我們講講如何配置基于二進制日志的多源復制.
首先,我們需要清楚幾種常見的復制模式:
1)一主一從
2)一主多從
3)級聯復制
4)multi-master
MySQL 5.7 之前只能實現一主一從、一主多從或者多主多從的復制.如果想實現多主一從的復制,只能使用 MariaDB,但是 MariaDB 又與官方的 MySQL 版本不兼容.
MySQL 5.7 開始支持了多主一從的復制方式,也就是多源復制.MySQL 5.7 版本相比之前的版本,無論在功能還是性能、安全等方面都已經有不少的提升.
首先,我們需要清楚 multi-master
與 multi-source
復制不是一樣的.multi-master
復制通常是環形復制,你可以在任意主機上將數據復制給其他主機.
multi-source
是不同的.簡單的說,多源復制就是將多個主庫同步到一個從庫上面,從而增加從的利用率,節省了機器.如下圖:
不管是使用基于二進制日志的復制或者基于事務的復制,要開啟多源復制功能必須需要在從庫上設置 master-info-repository
和 relay-log-info-repository
這兩個參數.
這兩個參數是用來存儲同步信息的,可以設置的值為 FILE
和 TABLE
,默認值是 FILE
.比如 master-info
就保存在 master.info
文件中, relay-log-info
保存在 relay-log.info
文件中,如果服務器意外關閉,正確的 relay-log-info
沒有來得及更新到 relay-log.info
文件,這樣會造成數據丟失.
為了數據更加安全,通常設為 TABLE
.這些表都是 innodb
類型的,支持事務.相對文件存儲安全得多.在 MySQL 庫下可以看見這兩個表信息,分別是 mysql.slave_master_info
和 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;).
這里一共使用了三臺機器,MySQL版本都為5.7.18.
MySQL安裝比較簡單,官方都有提供不同系統的相應軟件源.這里以 Ubuntu 16.04 系統為例:
$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.6-1_all.deb
更多軟件源可參考:http://dev.mysql.com/downloads/repo/apt/
,如果是 CentOS/RHEL
系統可參考官方文檔:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
$ dpkg -i mysql-apt-config_0.8.6-1_all.deb $ apt-get update
$ apt-get install mysql-server mysql-client
$ service mysql start
$ 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 多源復制,主要是需要在 MySQL 從服務器的主配置文件 [mysqld]
段中添加以下兩行:
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf master-info-repository = table relay-log-info-repository = table
MySQL主服務器配置片斷
以 dev-master-01
為例,另一臺 Master 也是類似的配置方法.
$ 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.這里沒有給出全部配置,其它請根據實際情況自行配置.
$ service mysql restart
在兩臺 MySQL Master 上創建
mysql> grant replication slave on *.* to 'repl'@'192.168.2.%' identified by '000000'; mysql> flush privileges;
MySQL 5.7 有了通信渠道的概念,每一個通信渠道都是一個從服務器到主服務器獲得二進制日志的鏈接.這意味著每個通信渠道都得有一個 IO_THREAD
.對于每一個主服務器,我們需要運行不同的 CHANGE MASTER
命令和FOR CHANNEL
這個參數來分別提供不同通信鏈接名字.
下面開始設置需要同步的源,同步兩個主服務器的數據到從服務器上.
設置同步源到 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;
也可以單獨啟動需要同步的通道.
mysql> START SLAVE FOR CHANNEL 'master1'; mysql> START SLAVE FOR CHANNEL 'master2';
停止和 RESET 復制的命令也同 START 類似,可以操作所有的,也可以操作單個通道.
查看SLAVE信息
mysql> SHOW SLAVE STATUS\G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ...
確認 Slave_IO_Running
和 Slave_SQL_Running
兩個參數都為 Yes 狀態.
如果要查看單一信道的復制的詳細狀態,可以使用以下命令:
mysql> SHOW SLAVE STATUS FOR CHANNEL 'master1'\G;
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);
mysql> create database master2; mysql> use master2; mysql> CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL); mysql> insert into test2 values(1,1);
mysql> select * from master1.test1; +------+-------+ | id ? | count | +------+-------+ | ? ?1 | ? ? 1 | +------+-------+ 1 row in set (0.00 sec) mysql> select * from master2.test2; +------+-------+ | id ? | count | +------+-------+ | ? ?1 | ? ? 1 | +------+-------+ 1 row in set (0.00 sec)
列出所有的復制信道的復制狀態概況:
在 performance_schema
庫中,提供了復制相關的一些視圖,可供查看復制相關的信息.
mysql> use performance_schema; mysql> show tables like '%repl%'; +-------------------------------------------+ | Tables_in_performance_schema (%repl%) ? ? | +-------------------------------------------+ | replication_applier_configuration ? ? ? ? | | replication_applier_status ? ? ? ? ? ? ? ?| | replication_applier_status_by_coordinator | | replication_applier_status_by_worker ? ? ?| | replication_connection_configuration ? ? ?| | replication_connection_status ? ? ? ? ? ? | | replication_group_member_stats ? ? ? ? ? ?| | replication_group_members ? ? ? ? ? ? ? ? | +-------------------------------------------+ 8 rows in set (0.00 sec)
這些表里分別有多源通道的配置信息和多源通道的狀態信息,另外還有連接配置信息和連接狀態信息,如果配置了多線程復制的話,還會有多線程配置信息和多線程狀態信息.
文章來源微信公眾號:運維之美
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/2391.html