Mysql 主从部署
ShawJie

Mysql 主从部署

基于DockerMysql主从部署测试,Mysql版本为8.0.18

准备工作

Docker镜像仓库拉取Mysql的镜像(由于只是为了测试主从部署,所以并没有刻意的去限定版本)

1
2
3
4
5
// 拉取Mysql镜像到本地
$ docker pull mysql

// 查看确认拉取到本地的镜像
$ docker images

为了简化测试过程的docker命令编写,这边使用了docker-compose辅助进行容器创建控制操作。
为了实现主从部署,我们还需要修改一些配置文件。根据Docker Mysql官方的镜像描述称可通过VOLUMES进行配置文件的挂载进行配置文件的加载。
但实际进行操作后发现Docker Mysql连接时会抛出UNKNOW variable的异常。后改用启动参数方式设置配置参数,经测试可用。

1
2
// docker 命令
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
1
2
3
4
5
6
7
8
# docker-compose 配置

version: '3.1'
services:
mysql-db:
image: mysql:tag
command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
restart: always

具体配置内容如下
Master端:

1
2
3
4
5
6
7
server_id=1 // 节点标识,不可重复
read-only=0 // 主写从读,则主节点无需控制只读限制
log-bin=mysql-bin // 由于Mysql的主从同步是通过binlog进行控制 所以需要开启binlog

binlog-do-db=[database name] // 需要进行binlog 记录的数据库

// 若是需要同步的数据库为大部分 也可通过 replicate-ignore-db=[database name] 进行部分的排除

slave端:

1
2
3
4
5
server_id=[primary identity] // 节点标识 不可重复
read-only=1 // 主写从读 设置主节点为只读,保证非super权限用户无法对数据进行修改,保证数据同步安全性
log-bin=mysql-bin // 开启binlog

binlog-do-db=[database name] // 需要进行binlog 记录的数据库 (需要进行同步的数据库)

权限配置

由于需要进行主从同步,我们需要让从数据库有权限从主数据库取到binlog并进行同步。则我们需要在主数据库进行一个账户权限的开放。

1
2
CREATE USER '[username]'@'%' IDENTIFIED WITH mysql_native_password BY '[your password]';
GRANT REPLICATION SLAVE ON *.* TO '[username]'@'%';

完成这两步之后再进行一个登录的尝试,成功登录后,账户权限的开放就完成了。

主从同步

在完成账户权限的开放后,我们就需要建立主从之间的连接了。
首先既然是主从同步,从数据库需要知道主数据库的地址,连接用户名密码,要读取的binlog日志文件,以及从日志文件开始同步的位置。
数据库的连接地址,用户名密码我们都知道了,那么binlog日志文件和同步的位置我们从哪里获取呢。
我们可以在主数据库执行SHOW MASTER STATUS;

FilePositionBinlog_Do_DBBinlog_Ignore_DBExecuted_Gtid_Set
mysql-bin.000003155datebase name

日志文件,对应的就是File字段。日志文件开始同步的位置,对应的就是Position字段。

切换到从数据库,我们就需要开始配置连接主数据库的内容了。

1
2
3
4
5
6
7
CHANGE MASTER TO
MASTER_HOST = '[Master database ip]',
MASTER_USER = '[username]', // 主数据库开放的数据库权限的账号
MASTER_PASSWORD = '[password]',
MASTER_LOG_FILE = '[Log file]',
MASTER_LOG_POS = [Position], // 日志文件同步位置
MASTER_PORT = [Master database port];

在配置完主数据库后,就可以通过执行START SLAVE;命令进行主从同步的过程。通过SHOW SLAVE STATUS\G;命令,可以查看主从同步情况,若连接无问题,则slave_io_runningslave_sql_running值都为YES。

我们可以在主数据库插入一条数据,然后回到从数据库查看情况。若主数据库插入成功之后从数据库没有同步成功,则我们可以通过SHOW SLAVE STATUS\G;命令的ERROR_MSG查看原因。