说明
本文会基于 docker 来搭建一套 一主两从 的 mysql 主从架构.
阅读本文之前, 需要对 docker 的相关知识有一定了解.
基本部署信息如下所示:
名称 | 对外端口 | 对内端口 | 容器名称 | Mysql 版本 |
---|---|---|---|---|
master | 3306 | 3306 | mymysql | 5.6 |
slave01 | 3340 | 3306 | mymysql-slave | 5.6 |
slave02 | 3341 | 3306 | mymysql-slave2 | 5.6 |
搭建过程
整个搭建过程肯定不会很顺利, 文中提到的问题你不一定会遇到, 你遇到的问题文中也不一定会提到, 需要在实践过程中 “见招拆招”.
建议先总览一遍全文, 再去动手操作.
1. 拉取镜像
本文使用的 mysql 版本是 5.6, 当然你也可以选择其他临近的版本.
docker pull mysql:5.6
2. 启动容器
# 启动 master 节点
docker run -p 3306:3306 --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
# 启动 slave01 节点
docker run -p 3340:3306 --name mymysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
# 启动 slave02 节点
docker run -p 3341:3306 --name mymysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
3. 查看 mysql 状态
docker ps
4. 使用 mysql 客户端连接服务端
这一步纯粹是为了充分验证 mysql 安装结果
可以使用 navicat 之类的 mysql 客户端依次登陆连接, 验证安装结果.
5. 配置 master 节点
从第 5 步开始, 就需要处处小心谨慎.
5.1 进入 docker 容器
# 6184e4f13e02 为容器 id
docker exec -it 6184e4f13e02 /bin/bash
5.2 修改 master 节点的配置文件, 即 my.cnf
通过 vim 编辑器编辑配置文件
vi /etc/mysql/my.cnf
如果提示没有 vi 命令, 还需要安装 vim
# 如果如下命令报错, 可以先执行 apt-get update, 然后再次执行如下命令
# 如果还是有问题, 请自行百度.
apt-get install vim
进入 vi 编辑器后, 追加如下配置到 my.cnf 文件
[mysqld]
# 同一局域网内要唯一
server-id=101
# 开启 binlog
log-bin=mysql-bin
5.3 在 master 上创建一个主从同步的用户, 并授权
这个步骤的目的是, 让 slave 节点可以通过此用户名去连接到 master 做数据同步.
# 通过如下命令连接 mysql 服务端, 然后会提示输入密码
mysql -uroot -p;
# 输入密码后, 进入 mysql 命令行, 去创建用户名及密码
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 赋予相应权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 刷新权限
FLUSH PRIVILEGES;
6. 配置 SLAVE01
6.1 修改 slave01 的 mysql 配置
进入 slave01 的容器中, 找到 my.cnf 文件, 追加如下配置:
[mysqld]
## 设置server_id,注意要唯一
server-id=102
## 开启二进制日志功能,以备 Slave 作为其它 Slave 的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
6.2 连接 master 和 slave01
进入slave01 容器的 mysql 命令行中, 执行如下 sql 命令:
change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=2830, master_connect_retry=30;
字段说明:
-
master_host 每个 docker 容器都有一个独立ip, 可以通过如下命令去查看.
# mymysql 为容器名称 docker inspect --format='{{.NetworkSettings.IPAddress}}' mymysql
-
master_user 和 master_password 为前面创建的用户名和密码
-
master_port 为对外开放的端口号
-
master_log_file 和 master_log_pos 可以通过如下命令得知
# 进入到 master 容器, 进入到 mysql 命令行, 执行如下命令 show master status;
6.3 查看 slave 状态
在 slave 节点上, 通过 show slave status;
验证连接结果
如下图所示:
-
如果连接成功会显示两个yes,
-
如果显示两个 no, 需要执行下,
start slave
-
如果上面显示 Connecting 下面显示 yes , 证明有问题.
通常报错信息是 ```error connecting to master xxxxx ``` 排查思路如下: * 检查两个容器端口是否是通的、防火墙是不是开着. * 检查上面创建的 slave 用户以及对应的权限是否创建成功. * 检查自己的执行命令的参数是不是写错了. 出现上述问题, 网上给出的解决方案一般就是上面三个, 我当时是把创建的用户删了, 重新创建, 问题就解决了. 原因未明.
7. 配置 SLAVE02
7.1 修改 slave02 的 mysql 配置文件
[mysqld]
## 设置server_id, 注意要唯一
server-id=103
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
7.2 连接 master 和 slave02
步骤同 slave01 一样
8. 验证部署结果
在 master 节点上执行一条插入语句, 然后查看两个 slave 节点上是否把数据同步过来.