MySQL 主从复制原理及其配置

MySQL 主从复制原理及其配置

前言

环境配置:CentOS-7、MySQL-8.0.18

主从复制基于二进制日志官方文档: https://dev.mysql.com/doc/refman/8.0/en/replication-howto.html

MySQL 数据库复制

  1. 设置基于二进制日志文件位置的复制
  2. 使用全局事务标识符(GTID)进行复制

基于二进制

日志主从复制原理

  • Master 将数据改变记录到二进制日志(binary log)中,也就是配置文件 log-bin 指定的文件,这些记录叫做二进制日志事件(binary log events);
  • Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log);
  • Slave 重做中继日志中的事件, 把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储, 从而实现将改变反映到它自己的数据(数据重放)。

主从复制(实例:一主一从)

参考官方文档: https://dev.mysql.com/doc/refman/8.0/en/replication-howto.html

Master 配置

/etc/my.cnf 配置文件信息

开启 Binlog 写入功能 ,vim /etc/my.cnf,配置如下内容

# 配置标识id,不能重复
server_id=1
# 开启 binlog
log-bin=mysql-bin
# 选择 binlog 分三种模式(ROW/STATEMENT/MIXED)
binlog-format=ROW
# 二进制日志过期时间,过期后自动删除,默认为0 不删除二进制文件;1296000 = 15 天
binlog_expire_logs_seconds=1296000
# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。取值范围4096字节~1GB,默认值是1GB。
max_binlog_size = 1G
# 为了在InnoDB与事务一起使用的复制设置中获得最大的持久性和一致性,需要设置 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# 需要记录二进制日志的数据库,不写默认所有,多数据库用逗号隔开(binlog-do-db= 和 binlog-ignore-db= 二选一)
# binlog-do-db=
# 不需要记录二进制日志的数据库,多数据库用逗号隔开
binlog-ignore-db=db_test_00
启动数据库服务器
配置复制用户的权限

创建可以复制 Master 的用户并授权,进入 MySQL 命令行,在主节点上,创建有复制权限的用户,用于从节点链接主节点时使用。

# 创建用户
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_pass';
# 授权
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# 刷新权限
flush privileges;
查看 master 状态信息

进入 MySQL 命令行,获取主节点当前 binary log 文件名和位置(position),记录 File 和 Position 的值,用于从节点配置

show master status;

在这里插入图片描述

Slave 配置

/etc/my.cnf 配置文件信息

开启 Binlog 写入功能 ,vim /etc/my.cnf,配置如下内容

# 配置标识id,不能重复
server_id=2

# 跳过指定error no类型的错误
# slave-skip-errors=1062,1053,1146 
# 跳过所有错误
slave-skip-errors=all
启动数据库服务器
配置 Master 节点信息

进入 MySQL 命令行,在从节点上配置主节点,其中 MASTER_LOG_FILE=‘mysql-bin.000002’ 是 show master status 命令查询的 File 的值,MASTER_LOG_POS=442 是 show master status 命令查询的 Position 的值。

CHANGE MASTER TO MASTER_HOST='192.168.8.37', MASTER_USER='repl', MASTER_PASSWORD='repl_pass',  MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=817;
开启 slave 复制

进入 MySQL 命令行,

# 查看主从同步状态 
mysql> show slave status\G;
# 开启主从同步
mysql> start slave;
# 再查看主从同步状态 
mysql> show slave status\G;

查看状态时,可能会出现I/O任务启动失败的情况, 需要保证 server_id 和 UUID 主从不一致

# 查看数据库服务器的 server_id
show variables like 'server_id';
# 如果 Master 和 Slave 的 server_id 可以执行配置,或者在 /etc/my.cnf 配置
set global server_id=2;

有可能 UUID 一致,可以在 MySQL 的 data 目录下 auto.cnf 文件中配置,保证 Master 和 Slave 的server-uuid 不一致即可,配置内容如下

[auto]
server-uuid=5ebc44b3-ef28-11e9-ac4d-000c29a77f87

测试

在这里插入图片描述

开启二进制日志后,从数据库会自动从二进制日志中获取日志,通过日志执行对应的 SQL,但是如果在开启日志前对数据库 DML 和 DDL 操作不会记录到日志中,自然无法写入从数据库。

双主复制

双主复制,主 A 和 主 B 互为主从,参考一主一从配置即可

主一

/etc/my.cnf 配置文件信息
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
#MySQL存放临时文件的目录
tmpdir=/usr/local/mysql/tmp
# 设置时区,默认时区为 utc
default-time_zone = '+8:00'
# 服务端使用的字符集默认为 utf8mb4
character_set_server = utf8mb4
# 服务端默认的比对规则,排序规则
collation_server = utf8mb4_bin
# 配置标识id,不能重复
server_id=41
# 开启 binlog
log-bin=mysql-bin
# 选择 ROW 模式
binlog-format=ROW
# 二进制日志过期时间,过期后自动删除,默认为0 不删除二进制文件;604800 = 7 天
binlog_expire_logs_seconds=604800
# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。取值范围4096字节~1GB,默认值是1GB。
max_binlog_size = 512M
# 为了在InnoDB与事务一起使用的复制设置中获得最大的持久性和一致性,需要设置 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# 需要记录二进制日志的数据库,不写默认所有,多数据库用逗号隔开
# binlog-do-db=
# 不需要记录二进制日志的数据库,多数据库用逗号隔开
# binlog-ignore-db=
# 跳过指定error no类型的错误
# slave-skip-errors=1062,1053,1146 
# 跳过所有错误
slave-skip-errors=all

# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用 "mysql_native_password" 插件认证
default_authentication_plugin=mysql_native_password
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
配置复制主一的用去权限

创建可以复制主一的用户并授权

# 创建用户
CREATE USER 'replone'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_pass_one';
# 授权
GRANT REPLICATION SLAVE ON *.* TO 'replone'@'%';
# 刷新权限
flush privileges;
配置主一节点信息

查看主一的 binary log 文件名和位置(position),记录 File 和 Position 的值

show master status;
配置主二的配置
CHANGE MASTER TO MASTER_HOST='192.168.8.41', MASTER_PORT=3306, MASTER_USER='repltwo', MASTER_PASSWORD='repl_pass_two',  MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=155;
开启复制主一
# 查看主从同步状态 
mysql> show slave status\G;
# 开启主从同步
mysql> start slave;
# 再查看主从同步状态 
mysql> show slave status\G;

主二

/etc/my.cnf 配置文件信息
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
#MySQL存放临时文件的目录
tmpdir=/usr/local/mysql/tmp
# 设置时区,默认时区为 utc
default-time_zone = '+8:00'
# 服务端使用的字符集默认为 utf8mb4
character_set_server = utf8mb4
# 服务端默认的比对规则,排序规则
collation_server = utf8mb4_bin
# 配置标识id,不能重复
server_id=41
# 开启 binlog
log-bin=mysql-bin
# 选择 ROW 模式
binlog-format=ROW
# 二进制日志过期时间,过期后自动删除,默认为0 不删除二进制文件;604800 = 7 天
binlog_expire_logs_seconds=604800
# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。取值范围4096字节~1GB,默认值是1GB。
max_binlog_size = 512M
# 为了在InnoDB与事务一起使用的复制设置中获得最大的持久性和一致性,需要设置 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# 需要记录二进制日志的数据库,不写默认所有,多数据库用逗号隔开
# binlog-do-db=
# 不需要记录二进制日志的数据库,多数据库用逗号隔开
# binlog-ignore-db=
# 跳过指定error no类型的错误
# slave-skip-errors=1062,1053,1146 
# 跳过所有错误
slave-skip-errors=all

# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用 "mysql_native_password" 插件认证
default_authentication_plugin=mysql_native_password
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
配置复制主二的用去权限

创建可以复制主二的用户并授权

# 创建用户
CREATE USER 'repltwo'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_pass_two';
# 授权
GRANT REPLICATION SLAVE ON *.* TO 'repltwo'@'%';
# 刷新权限
flush privileges;
查看主二 master 状态

查看主二的 binary log 文件名和位置(position),记录 File 和 Position 的值

show master status;
复制主一的配置
CHANGE MASTER TO MASTER_HOST='192.168.8.42', MASTER_PORT=3306, MASTER_USER='replone', MASTER_PASSWORD='repl_pass_one',  MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=155;
开启复制主一
# 查看主从同步状态 
mysql> show slave status\G;
# 开启主从同步
mysql> start slave;
# 再查看主从同步状态 
mysql> show slave status\G;

附录

my.cnf 全文

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
#MySQL存放临时文件的目录
tmpdir=/usr/local/mysql/tmp
# 设置时区,默认时区为 utc 
default-time_zone = '+8:00'
# 服务端使用的字符集默认为 utf8mb4
character_set_server = utf8mb4
# 服务端默认的比对规则,排序规则
collation_server = utf8mb4_bin
# 配置标识id,不能重复
server_id=1
# 开启 binlog
log-bin=mysql-bin
# 选择 ROW 模式
binlog-format=ROW
# 二进制日志过期时间,过期后自动删除,默认为0 不删除二进制文件;604800 = 7 天
binlog_expire_logs_seconds=604800
# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。取值范围4096字节~1GB,默认值是1GB。
max_binlog_size = 512M
# 为了在InnoDB与事务一起使用的复制设置中获得最大的持久性和一致性,需要设置 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# 需要记录二进制日志的数据库,不写默认所有,多数据库用逗号隔开
# binlog-do-db=
# 不需要记录二进制日志的数据库,多数据库用逗号隔开
# binlog-ignore-db=
# 跳过指定error no类型的错误
# slave-skip-errors=1062,1053,1146 
# 跳过所有错误
slave-skip-errors=all

# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用 "mysql_native_password" 插件认证
default_authentication_plugin=mysql_native_password
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4

关于二进制过期时间

# 查看二进制日志过期时间
show variables like 'binlog_expire_logs_seconds';
# 设置二进制过期时间,以秒为单位,604800(7天)
set global binlog_expire_logs_seconds=604800;

temd unit file for mariadb according to the

instructions in http://fedoraproject.org/wiki/Systemd

[mysql]

设置mysql客户端默认字符集

default-character-set=utf8mb4
[client]

设置mysql客户端连接服务端时默认使用的端口

port=3306
default-character-set=utf8mb4


### 关于二进制过期时间

```mysql
# 查看二进制日志过期时间
show variables like 'binlog_expire_logs_seconds';
# 设置二进制过期时间,以秒为单位,604800(7天)
set global binlog_expire_logs_seconds=604800;
发布了321 篇原创文章 · 获赞 132 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/SIMBA1949/article/details/102622878
今日推荐