MySQL 5.7發佈後,在複製方面有了很大的改進和提高。好比開始支持多源複製 (multi-source) 以及真正的支持多線程複製了。多源複製可使用基於二進制日誌的複製或者基於事務的複製。下面咱們講講如何配置基於二進制日誌的多源複製。html
首先,咱們須要清楚幾種常見的複製模式:node
1)一主一從
2)一主多從
3)級聯複製
4)multi-mastermysql
MySQL 5.7 以前只能實現一主一從、一主多從或者多主多從的複製。若是想實現多主一從的複製,只能使用 MariaDB,可是 MariaDB 又與官方的 MySQL 版本不兼容。linux
MySQL 5.7 開始支持了多主一從的複製方式,也就是多源複製。MySQL 5.7 版本相比以前的版本,不管在功能仍是性能、安全等方面都已經有很多的提高。sql
首先,咱們須要清楚 multi-master
與 multi-source
複製不是同樣的。multi-master
複製一般是環形複製,你能夠在任意主機上將數據複製給其餘主機。數據庫
multi-source
是不一樣的。簡單的說,多源複製就是將多個主庫同步到一個從庫上面,從而增長從的利用率,節省了機器。以下圖:vim
多源複製使用場景安全
數據分析部門會須要各個業務部門的部分數據作數據分析,這個時候就能夠用到多源複製把各個主數據庫的數據複製到統一的數據庫中。服務器
在從服務器進行數據彙總,若是咱們的主服務器進行了分庫分表的操做,爲了實現後期的一些數據統計功能,每每須要把數據彙總在一塊兒再統計。多線程
在從服務器對全部主服務器的數據進行備份,在MySQL 5.7以前每個主服務器都須要一個從服務器,這樣很容易形成資源浪費,同時也加大了DBA的維護成本,但MySQL 5.7引入多源複製,能夠把多個主服務器的數據同步到一個從服務器進行備份。
使用多源複製的必要條件
不論是使用基於二進制日誌的複製或者基於事務的複製,要開啓多源複製功能必須須要在從庫上設置 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
。
這兩個參數也是能夠動態調整的。
1 2 |
SET GLOBAL master_info_repository = 'TABLE'; SET GLOBAL relay_log_info_repository = 'TABLE'; |
若是要啓用 enhanced multi-threaded slave
(多線程複製),能夠設置如下參數
1 2 3 |
slave-parallel-type=LOGICAL_CLOCK slave-parallel-workers=8 relay_log_recovery=ON |
若是SLAVE已經爲開啓狀態,那麼須要首先關閉SLAVE(STOP SLAVE;)。
這裏一共使用了三臺機器,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安裝比較簡單,官方都有提供不一樣系統的相應軟件源。這裏以 Ubuntu 16.04 系統爲例:
1 |
$ 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
1 2 |
$ dpkg -i mysql-apt-config_0.8.6-1_all.deb $ apt-get update |
1 |
$ apt-get install mysql-server mysql-client |
1 |
$ service mysql start |
1 2 3 4 5 6 7 8 9 10 11 12 |
$ 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]
段中添加如下兩行:
1 2 3 4 |
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf master-info-repository = table relay-log-info-repository = table |
MySQL主服務器配置片段
以 dev-master-01
爲例,另外一臺 Master 也是相似的配置方法。
1 2 3 4 5 6 7 8 |
$ 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從服務器配置片段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ 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。這裏沒有給出所有配置,其它請根據實際狀況自行配置。
1 |
$ service mysql restart |
在兩臺 MySQL Master 上建立
1 2 |
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 從服務器上執行)
1 2 3 4 5 6 |
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 從服務器上執行)
1 2 3 4 5 6 |
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
1 |
mysql> START SLAVE; |
也能夠單獨啓動須要同步的通道。
1 2 |
mysql> START SLAVE FOR CHANNEL 'master1'; mysql> START SLAVE FOR CHANNEL 'master2'; |
中止和 RESET 複製的命令也同 START 相似,能夠操做全部的,也能夠操做單個通道。
查看SLAVE信息
1 2 3 4 5 6 |
mysql> SHOW SLAVE STATUS\G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ... |
確認 Slave_IO_Running
和 Slave_SQL_Running
兩個參數都爲 Yes 狀態。
若是要查看單一信道的複製的詳細狀態,可使用如下命令:
1 |
mysql> SHOW SLAVE STATUS FOR CHANNEL 'master1'\G; |
1 2 3 4 |
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); |
1 2 3 4 |
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); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
庫中,提供了複製相關的一些視圖,可供查看複製相關的信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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.google.com
http://www.ywnds.com/?p=7154
http://blog.itpub.net/27808137/viewspace-1848036/
http://www.cnblogs.com/xuanzhi201111/p/5151666.html
https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html