1.1.1. 相关概念
(1)单源复制。
通常的复制是单源复制,即一个slave只与一个master建立复制关系,复制关系的相关参数保存在master.info文件中。
(2)多源复制。
多源复制是指一个slave与多个master上建立复制关系。在多源复制中,slave必须与每个master建立一个单独的复制通道(Replication Channel)。
(3)复制通道。
在MySQL启动时,MySQL自动建立一个名称为空('')的默认复制通道,在建立复制时,默认使用这个默认复制通道。 在多源复制时,必须为每个复制关系,即每个master建立一个单独的复制通道,每个复制通道有一组独立的IO线程和SQL线程。每个复制通道拥有一个唯一的名称,名称不能超过64个字符,不区分大小写。 在使用多源复制时,需要在每个命令的后面加上FOR CHANNEL参数,以便指定所操作所使用的复制通道。
(4)GTID_MODE
GTID_MODE有以下几种可能的取值:
值 |
含义 |
OFF |
不使用GTID模式。只有匿名事务被复制。只能使用基于Binary Log的复制。 |
OFF_PERMISSIVE |
宽容的OFF模式。新的事务是匿名的,但是允许被复制的事务可以是基于GTID的事务或匿名事务。 |
ON_PERMISSIVE |
宽容的ON模式。新的事务是基于GTID的,但是允许被复制的事务是基于GTID的事务或匿名事务。 |
ON |
使用GTID模式。匿名事务不能被复制。只能使用基于GTID的复制。 |
OFF_PERMISSIVE和ON_PERMISSIVE这两种模式下,允许master是基于GTID的或者基于BInary Log的配置。在用于多源复制的slave时,一个slave可以同时和基于GTID和基于Binary Log的master建立复制关系。
1.1.2. 基于Binary Log的多源复制
目标:一个slave与2个master建立基于GTID的多源复制关系。
master:192.168.197.111,通道名称master111。
192.168.197.110,通道名称master110。
slave:192.168.197.112。
(1)在slave上设置复制相关参数的存储位置。
master连接参数默认保存在master.info文件中,包括master的IP地址和端口号,以及master上的Binary Log文件名和位置等信息。
[d@112.coe2coe.me:/opt/mysql/data]$sudo cat master.info
25
mysql-bin.000004
194
192.168.197.111
repl
123456
3306
60
0
0
30.000
0
a2392929-6dfb-11e7-b294-000c29b1c111
86400
1
Relay Log的信息默认保存在relay-log.info文件中,包括slave本地的Relay Log的文件名和位置,以及对应的master 上的Binary Log的文件名和位置等信息。
sudo cat relay-log.info
[sudo] password for d:
7
./112-relay-bin.000005
407
mysql-bin.000004
194
0
0
1
master和Relay Log相关参数信息支持保存在文件中,或者保存在数据表中。
mysql> select @@global.master_info_repository , @@global.relay_log_info_repository;
+---------------------------------+------------------------------------+
| @@global.master_info_repository | @@global.relay_log_info_repository |
+---------------------------------+------------------------------------+
| FILE | FILE |
+---------------------------------+------------------------------------+
1 row in set (0.00 sec)
通过修改上述两个全局变量的值,就可以将其保存方式修改为数据表。修改之前必须先停止slave复制线程。
mysql> stop slave;
Query OK, 0 rows affected (0.06 sec)
mysql> set @@global.master_info_repository='TABLE';
Query OK, 0 rows affected (0.08 sec)
mysql> set @@global.relay_log_info_repository='TABLE';
Query OK, 0 rows affected (0.01 sec)
mysql> select @@global.master_info_repository , @@global.relay_log_info_repository;
+---------------------------------+------------------------------------+
| @@global.master_info_repository | @@global.relay_log_info_repository |
+---------------------------------+------------------------------------+
| TABLE | TABLE |
+---------------------------------+------------------------------------+
1 row in set (0.00 sec)
在修改成功之后,master.info和relay_log.info这两个文件已经不存在了。
[d@112.coe2coe.me:/opt/mysql/data]$sudo cat master.info
cat: master.info: No such file or directory
[d@112.coe2coe.me:/opt/mysql/data]$sudo cat relay_log.info
cat: relay_log.info: No such file or directory
也可以换一种方式修改这两个全局变量。
STOP SLAVE;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
这两个数据表在mysql数据库中。
master信息表:
mysql> select * from mysql.slave_master_info\G
*************************** 1. row ***************************
Number_of_lines: 25
Master_log_name:
Master_log_pos: 4
Host: 192.168.197.111
User_name: repl
User_password: 123456
Port: 3306
Connect_retry: 60
Enabled_ssl: 0
Ssl_ca:
Ssl_capath:
Ssl_cert:
Ssl_cipher:
Ssl_key:
Ssl_verify_server_cert: 0
Heartbeat: 30
Bind:
Ignored_server_ids: 0
Uuid:
Retry_count: 86400
Ssl_crl:
Ssl_crlpath:
Enabled_auto_position: 1
Channel_name: master111
Tls_version:
1 row in set (0.00 sec)
Relay Log信息表。
mysql> select *from slave_relay_log_info;
+-----------------+----------------------------------+---------------+-----------------+----------------+-----------+-------------------+----+--------------+
| Number_of_lines | Relay_log_name | Relay_log_pos | Master_log_name | Master_log_pos | Sql_delay | Number_of_workers | Id | Channel_name |
+-----------------+----------------------------------+---------------+-----------------+----------------+-----------+-------------------+----+--------------+
| 7 | ./112-relay-bin-master111.000001 | 4 | | 0 | 0 | 0 | 1 | master111 |
+-----------------+----------------------------------+---------------+-----------------+----------------+-----------+-------------------+----+--------------+
1 row in set (0.00 sec)
(2)在slave上建立与master的复制关系。
在slave上为每个复制通道建立一个复制关系。
CHANGE MASTER TO
-> MASTER_HOST='111.coe2coe.me',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=154
-> FOR CHANNEL 'master111';
CHANGE MASTER TO
-> MASTER_HOST='mysql110.coe2coe.me',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=154
-> FOR CHANNEL 'master110';
(3)启动复制。
使用for channel参数可以启动指定的复制通道上的复制线程(IO线程和SQL线程)。
mysql> start slave for channel 'master110';
Query OK, 0 rows affected (0.01 sec)
mysql> start slave for channel 'master111';
Query OK, 0 rows affected (0.01 sec)
或者直接使用不带参数的命令同时启动所有复制通道上的复制线程。
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
1.1.3. 基于GTID的多源复制
目标:一个slave与2个master建立基于GTID的多源复制关系。
master:192.168.197.111,通道名称master111。
192.168.197.110,通道名称master110。
slave:192.168.197.112。
(1)在slave上设置复制相关参数的存储位置。
mysql> stop slave;
Query OK, 0 rows affected (0.06 sec)
mysql> set @@global.master_info_repository='TABLE';
Query OK, 0 rows affected (0.08 sec)
mysql> set @@global.relay_log_info_repository='TABLE';
Query OK, 0 rows affected (0.01 sec)
(2)在slave上建立与master的复制关系。
执行以下命令与每个master建立复制关系,使用FOR CHANNEL参数指定复制通道的名称。
与111建立复制关系:
mysql> CHANGE MASTER TO
-> MASTER_HOST = '192.168.197.111',
-> MASTER_PORT = 3306,
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = '123456',
-> MASTER_AUTO_POSITION = 1
-> FOR CHANNEL 'master111';
Query OK, 0 rows affected, 2 warnings (0.09 sec)
与110建立复制关系:
mysql> CHANGE MASTER TO
-> MASTER_HOST = '192.168.197.110',
-> MASTER_PORT = 3306,
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = '123456',
-> MASTER_AUTO_POSITION = 1
-> FOR CHANNEL 'master110';
Query OK, 0 rows affected, 2 warnings (0.08 sec)
查看复制状态。
此时查看复制状态,可看到有两条记录,分别对应一个复制通道。
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.197.110
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: 112-relay-bin-master110.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,sys.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name: master110
Master_TLS_Version:
*************************** 2. row ***************************
Slave_IO_State:
Master_Host: 192.168.197.111
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: 112-relay-bin-master111.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,sys.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name: master111
Master_TLS_Version:
2 rows in set (0.01 sec)
从这两条记录中,还可以观察到以下信息:
(a)Relay_Log_File的文件名包含了指定的复制通道的名称master111。
Relay_Log_File: 112-relay-bin-master110.000001
Relay_Log_File: 112-relay-bin-master111.000001
(b)master连接参数的数据表名。
Master_Info_File: mysql.slave_master_info
此时查看MySQL的Relay Log相关文件,可以看到每个复制通道各自有一套Relay Log文件。
[d@112.coe2coe.me:/opt/mysql/data]$ls -l *relay-bin*
-rw-r----- 1 mysql mysql 217 Aug 18 09:56 112-relay-bin.000001
-rw-r----- 1 mysql mysql 23 Aug 18 09:56 112-relay-bin.index
-rw-r----- 1 mysql mysql 154 Aug 18 10:20 112-relay-bin-master110.000001
-rw-r----- 1 mysql mysql 33 Aug 18 10:20 112-relay-bin-master110.index
-rw-r----- 1 mysql mysql 154 Aug 18 09:56 112-relay-bin-master111.000001
-rw-r----- 1 mysql mysql 33 Aug 18 09:56 112-relay-bin-master111.index
(3)启动复制。
使用for channel参数可以启动指定的复制通道上的复制线程(IO线程和SQL线程)。
mysql> start slave for channel 'master110';
Query OK, 0 rows affected (0.01 sec)
mysql> start slave for channel 'master111';
Query OK, 0 rows affected (0.01 sec)
或者直接使用不带参数的命令同时启动所有复制通道上的复制线程。
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)