MySQL 5.7 多源複製實踐

MySQL 5.7 多源複製實踐

 

Posted by Mike on 2017-06-21

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-mastermulti-source 複製不是同樣的。multi-master 複製一般是環形複製,你能夠在任意主機上將數據複製給其餘主機。數據庫

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

多源複製使用場景安全

  • 數據分析部門會須要各個業務部門的部分數據作數據分析,這個時候就能夠用到多源複製把各個主數據庫的數據複製到統一的數據庫中。服務器

  • 在從服務器進行數據彙總,若是咱們的主服務器進行了分庫分表的操做,爲了實現後期的一些數據統計功能,每每須要把數據彙總在一塊兒再統計。多線程

  • 在從服務器對全部主服務器的數據進行備份,在MySQL 5.7以前每個主服務器都須要一個從服務器,這樣很容易形成資源浪費,同時也加大了DBA的維護成本,但MySQL 5.7引入多源複製,能夠把多個主服務器的數據同步到一個從服務器進行備份。

使用多源複製的必要條件

不論是使用基於二進制日誌的複製或者基於事務的複製,要開啓多源複製功能必須須要在從庫上設置 master-info-repositoryrelay-log-info-repository 這兩個參數。

這兩個參數是用來存儲同步信息的,能夠設置的值爲 FILETABLE ,默認值是 FILE。好比 master-info 就保存在 master.info 文件中, relay-log-info 保存在 relay-log.info 文件中,若是服務器意外關閉,正確的 relay-log-info 沒有來得及更新到 relay-log.info 文件,這樣會形成數據丟失。

爲了數據更加安全,一般設爲 TABLE。這些表都是 innodb 類型的,支持事務。相對文件存儲安全得多。在 MySQL 庫下能夠看見這兩個表信息,分別是 mysql.slave_master_infomysql.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

MySQL安裝比較簡單,官方都有提供不一樣系統的相應軟件源。這裏以 Ubuntu 16.04 系統爲例:

  • 從MySQL官方網站下載APT源
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

  • 安裝MySQL軟件源並更新
1
2
$ dpkg -i mysql-apt-config_0.8.6-1_all.deb
$ apt-get update
  • 安裝MySQL Server和MySQL Client
1
$ apt-get install mysql-server mysql-client
  • 啓動MySQL Server
1
$ service mysql start
  • 檢查MySQL Server是否成功啓動
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主配置文件

配置 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。這裏沒有給出所有配置,其它請根據實際狀況自行配置。

  • 重啓MySQL服務器
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_RunningSlave_SQL_Running 兩個參數都爲 Yes 狀態。

若是要查看單一信道的複製的詳細狀態,可使用如下命令:

1
mysql> SHOW SLAVE STATUS FOR CHANNEL 'master1'\G;

測試多源複製

  • 在主庫(dev-master-01)實例建立一些數據。
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);
  • 在主庫(dev-node-01)實例建立一些數據。
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);
  • 在從庫(dev-node-02)實例檢查數據是否成功複製。
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)

這些表裏分別有多源通道的配置信息和多源通道的狀態信息,另外還有鏈接配置信息和鏈接狀態信息,若是配置了多線程複製的話,還會有多線程配置信息和多線程狀態信息。

其它一些須要注意的點

  • 初次配置耗時較長,須要將各個 master 的數據 dump 下來,再 source 到 slave 上。
  • 須要考慮各 master 數據增加頻率,slave 的數據增加頻率是這些數據的總和。若是過高,會致使大量的磁盤IO,形成數據更新延遲,最嚴重的是會影響正常的查詢。
  • 若是多個主數據庫實例中存在同名的庫,則同名庫的表都會放到一個庫中;
  • 若是同名庫中的表名相同且結構相同,則數據會到一塊兒;若是結構不一樣,則先建的有效。

參考文檔

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

相關文章
相關標籤/搜索