MySQL学习笔记08多源复制

时间:2022-09-26 04:00:39

 

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_PERMISSIVEON_PERMISSIVE这两种模式下,允许master是基于GTID的或者基于BInary Log的配置。在用于多源复制的slave时,一个slave可以同时和基于GTID和基于Binary Logmaster建立复制关系。

 

 

1.1.2. 基于Binary Log的多源复制

目标:一个slave2master建立基于GTID的多源复制关系。

master192.168.197.111,通道名称master111

        192.168.197.110,通道名称master110

slave192.168.197.112

 

(1)slave上设置复制相关参数的存储位置。

master连接参数默认保存在master.info文件中,包括masterIP地址和端口号,以及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

 

 

masterRelay 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.inforelay_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的多源复制

目标:一个slave2master建立基于GTID的多源复制关系。

master192.168.197.111,通道名称master111

        192.168.197.110,通道名称master110

slave192.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

 

 

此时查看MySQLRelay 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)