1. 程式人生 > >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-mastermulti-source 複製不是一樣的。multi-master 複製通常是環形複製,你可以在任意主機上將資料複製給其他主機。

MySQL

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

多源複製

多源複製使用場景

  • 資料分析部門會需要各個業務部門的部分資料做資料分析,這個時候就可以用到多源複製把各個主資料庫的資料複製到統一的資料庫中。
  • 在從伺服器進行資料彙總,如果我們的主伺服器進行了分庫分表的操作,為了實現後期的一些資料統計功能,往往需要把資料彙總在一起再統計。
  • 在從伺服器對所有主伺服器的資料進行備份,在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

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

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

安裝MySQL

MySQL安裝比較簡單,官方都有提供不同系統的相應軟體源。這裡以 Ubuntu 16.04 系統為例:

  • 從MySQL官方網站下載APT源
$ 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軟體源並更新
$ dpkg -i mysql-apt-config_0.8.6-1_all.deb
$ apt-get update
  • 安裝MySQL Server和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多源複製

  • 修改MySQL主配置檔案

配置 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。這裡沒有給出全部配置,其它請根據實際情況自行配置。

  • 重啟MySQL伺服器
$ 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_RunningSlave_SQL_Running 兩個引數都為 Yes 狀態。

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

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

測試多源複製

  • 在主庫(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);
  • 在主庫(dev-node-01)例項建立一些資料。
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)例項檢查資料是否成功複製。
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)

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

其它一些需要注意的點

  • 初次配置耗時較長,需要將各個 master 的資料 dump 下來,再 source 到 slave 上。
  • 需要考慮各 master 資料增長頻率,slave 的資料增長頻率是這些資料的總和。如果太高,會導致大量的磁碟IO,造成資料更新延遲,最嚴重的是會影響正常的查詢。
  • 如果多個主資料庫例項中存在同名的庫,則同名庫的表都會放到一個庫中;
  • 如果同名庫中的表名相同且結構相同,則資料會到一起;如果結構不同,則先建的有效。

文章來源微信公眾號:運維之美