新聞中心

當前位置: 主頁> 新聞中心> 行業新聞>

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);

上一篇 :Wi-Fi信号滿格卻難上網,問題出在哪裏? 下(xià)一篇 :