Mysql 多源复制

Posted shark_西瓜甜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 多源复制相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

一、配置

启动选项和复制通道

本节介绍受添加复制通道影响的启动选项。

必须正确配置 以下启动设置才能使用多源复制。

  • relay_log_info_repository

    这必须设置为TABLE. 如果此变量设置为FILE,则尝试向副本添加更多源将失败并显示 ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY。

  • master_info_repository
    这必须设置为TABLE. 如果此变量设置为FILE,则尝试向副本添加更多源将失败并显示 ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITOR

以下启动选项现在影响 复制拓扑中的所有通道。

slave 接收到的所有事务(甚至来自多个源)都写入自己的二进制日志。

slave 服务器从 master 服务器接收的更新是否应记录到 slave 自己的二进制日志中。

通常,副本不会将从源服务器接收到的任何更新记录到其自己的二进制日志中。启用此变量会导致副本将其复制 SQL 线程执行的更新写入其自己的二进制日志。

下面为多级复制架构
其中 B 必须设置为 true

A --> B --> C
  • relay_log_purge
    设置后,每个通道都会自动清除自己的中继日志。

  • slave_transaction_retries

如果复制 SQL 线程由于InnoDB死锁或事务的执行时间超出 InnoDB’s innodb_lock_wait_timeout或 NDB’s TransactionDeadlockDetectionTimeout 或 TransactionInactiveTimeout,而无法执行事务,则它会在因错误停止之前自动重试 slave_transaction_retries 次。不会重试具有非临时错误的事务。

slave_transaction_retries 的默认值为 10。将变量设置为 0 将禁用事务的自动重试。设置该变量会立即对所有复制通道生效,包括正在运行的通道。

mysql 5.7.5 开始,在副本上启用多线程时支持重试事务。在以前的版本中, slave_transaction_retries 在使用多线程副本时被视为等于 0。

在 performance_schema 库的 replication_applier_status 表中的 COUNT_TRANSACTIONS_RETRIES
列中 显示了在每个复制通道上发生的重试次数。

  • --skip-slave-start

    设置为: ON 时,告诉副本服务器在服务器启动时不要启动复制线程。要稍后启动线程,请使用START SLAVE语句。
    默认值: OFF

  • --slave-skip-errors
    继续执行并跳过所有通道的错误。
    通常,当副本上发生错误时,复制会停止,这让您有机会手动解决数据中的不一致问题。当语句返回选项值中列出的任何错误时,此选项会导致复制 SQL 线程继续复制。

除非您完全理解为什么会出现错误,否则不要使用此选项。如果您的复制设置和客户端程序中没有错误,并且 MySQL 本身没有错误,那么停止复制的错误就不会发生。不加选择地使用此选项会导致副本与源完全不同步,您不知道为什么会发生这种情况

为以下启动选项设置的值适用于每个通道;由于这些是mysqld启动选项,因此它们适用于每个通道。

  • max_relay_log_size= size

    每个通道的单个中继日志文件的最大大小;达到此限制后,文件将被旋转。

  • --relay-log-space-limit=size

    每个单独通道的所有中继日志总大小的上限。对于N 通道,这些日志的组合大小限制为 . relay_log_space_limit * N

  • --slave-parallel-workers= value

    每个通道的工作线程数。

  • slave_checkpoint_group

    每个源的 I/O 线程的等待时间。

  • --relay-log-index=filename

    每个通道的中继日志索引文件的基本名称。请参见 第 16.2.2.4 节,“复制通道命名约定”

  • --relay-log=filename

    表示每个通道的中继日志文件的基本名称。请参见第 16.2.2.4 节,“复制通道命名约定”

  • --slave_net-timeout=N

    这个值是为每个通道设置的,因此每个通道都会等待 *N*几秒钟来检查断开的连接。

  • --slave-skip-counter=N

    该值是按通道设置的,因此每个通道都会跳过 *N*其源中的事件。

slave_parallel_workers 为每个通道设置工作线程数,默认值 0

更多参考官方文档

基础信息配置过程

master1

master1 配置文件

master1 IP:192.168.122.24

配置文件添加如下内容到 [mysqld] 配置块下:

log-bin=/var/log/mysql/mysql-bin
server-id=24

# Innodb 引擎的优化
innodb_flush_log_at_trx_commit=1
sync_binlog=1

# 主服务上设置不记录到二进制日志的逻辑库名称,一行一个
binlog-ignore-db=mysql

# 应该在从服务器设置不需要进行复制的逻辑库名称,一行一个
replicate-ignore-db=mysql

# 跳过主机名的解析
skip-name-resolve

master1 创建日志目录

mkdir /var/log/mysql/
chown mysql.mysql /var/log/mysql/

master1 登录会话为 master2 授权

master2 IP: 192.168.122.190

mysql> create user 'repl'@'192.168.122.190' identified by 'QFedu123@';
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.122.190';
Query OK, 0 rows affected (0.01 sec)

master1 查看当前的二进制日志及其位置

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      883 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql>

注意这里是给 mster2 准备的信息

master2

master2 配置文件

master2 IP:192.168.122.190

配置文件添加如下内容到 [mysqld] 配置块下:

log-bin=/var/log/mysql/mysql-bin
server-id=190

innodb_flush_log_at_trx_commit=1
sync_binlog=1

# 主服务上设置不记录到二进制日志的逻辑库名称,一行一个
binlog-ignore-db=mysql

# 应该在从服务器设置不需要进行复制的逻辑库名称,一行一个
replicate-ignore-db=mysql

# 跳过主机名的解析
skip-name-resolve

master2 创建日志目录

mkdir /var/log/mysql/
chown mysql.mysql /var/log/mysql/

master2 登录会话为 master1 授权

master1 IP: 192.168.122.24

mysql> create user 'repl'@'192.168.122.24' identified by 'QFedu123@';
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.122.24';
Query OK, 0 rows affected (0.01 sec)

master2 查看当前的二进制日志及其位置

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      881 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql>

注意这里是给 mster1 准备的信息


配置互为主从过程

master1

配置连接到 master2 的信息

此时 master1 作为
master2 作为 192.168.l122.190
master2 的日志 mysql-bin.000002 位置 881

mysql> change master to
master_host='192.168.122.190',
master_port=3306,
master_user='repl',
master_password='QFedu123@',
master_log_file='mysql-bin.000002',
master_log_pos=881;
Query OK, 0 rows affected, 2 warnings (0.24 sec)

启动 master1 的 slave

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

master1 上查看自己的 slave 状态

mysql> show slave status\\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.122.190
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 881
               Relay_Log_File: nfs-mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
              ...略...

master2

配置连接到 master2 的信息

此时 master2 作为
master1 作为 192.168.l122.24
master1 的日志 mysql-bin.000002 位置 883

mysql> change master to
master_host='192.168.122.24',
master_port=3306,
master_user='repl',
master_password='QFedu123@',
master_log_file='mysql-bin.000002',
master_log_pos=883;
Query OK, 0 rows affected, 2 warnings (0.24 sec)

启动 master2 的 slave

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

master2 上查看自己的 slave 状态

show slave status\\G

互为主从测试

分别在两台机器上创建逻辑库 和表,以及插入数据。观察是否互为同步。

从服务器配置多源复制

假如这里有一台从服务器,IP:192.168.122.100

分别在 master1 和 master2 上进行授权

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.122.100'  identified by 'QFedu123@';;
Query OK, 0 rows affected (0.01 sec)

配置文件

server_id=100
skip-name-resolve
read_only=true
# 应该在从服务器设置不需要进行复制的逻辑库名称,一行一个
replicate-ignore-db=mysql


# 多源复制必须添加的变量,表示将主的连接信息和中继日志信息保存的表中,默认是 FILE。
relay_log_info_repository=TABLE
master_info_repository=TABLE

# 自动删除中继日志
relay-log-purge

# 中继日志的轮转大小
max_relay_log_size=5m

重启服务

配置多源通道主从关系

change master to
master_host='192.168.122.190',
master_port=3306,
master_user='repl',
master_password='QFedu123@',
master_log_file='mysql-bin.000002',
master_log_pos=81
for channel '122.190';
change master to
master_host='192.168.122.24',
master_port=3306,
master_user='repl',
master_password='QFedu123@',
master_log_file='mysql-bin.000002',
master_log_pos=83
for channel '122.24';

启动

启动此机器上的所有 slave 通道

start  slave

启动指定的 slave 通道

start  slave  for channel '122.190';

查看指定通道的状态

show slave status for channel '122.190'\\G

假如有任意一个通道不正常,请关闭之后,再启动一次。

停止指定通道

stop  slave  for channel '122.190';

测试

分别在 master1 和 master2 上插入数据,之后在 slave 上观察是否同步。

以上是关于Mysql 多源复制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL多源复制

MySQL5.7多源复制配置过程

MySQL 5.7的多源复制

mysql 多源复制

mysql多源复制详解

mysql 5.7 多源复制 原创