步骤
MySQL主从复制的基本步骤为:
- 配置 server-id
- 开启 bin-log
- 开始复制
这里以 docker 容器为例。
1、配置文件
可以先把配置文件放好,容器启动时直接挂载配置文件到容器中。
主节点配置文件 my.cnf:
[mysqld]
log-bin=mysql-bin
server-id=1
从节点配置文件 my.cnf:
[mysqld]
server-id=2
2、创建网络
能够主从复制的前提是两台主机能够相互 ping 通。
docker network create --subnet=192.192.192.0/24 mysql_cluster_net
docker 的三种网络概述:
- bridge 模式:以虚拟网桥的形式连接容器和宿主机。是默认的网络模式。
- host 模式:使用宿主机的网络和端口。
- none 模式:容器不能进行网络通信。
- 自定义模式:
- bridge
- overlay:当有多个主机时,跨主机的容器通信。
- macvlan:每个容器都有一个虚拟的 MAC 地址。
3、创建容器并加入网络
创建主节点 mysql_master:
docker run -d \
-p 3306:3306 \
-v /f/mysql/mysql80/3306/conf.d/:/etc/mysql/conf.d/ \
-v /f/mysql/mysql80/3306/data/:/var/lib/mysql/ \
-v /f/mysql/mysql80/3306/mysql-files/:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=1234 \
--network=mysql_cluster_net \
--ip=192.192.192.2 \
--privileged=true \
--name=mysql_master \
mysql
创建从节点 mysql_slaver:
docker run -d \
-p 3307:3306 \
-v /f/mysql/mysql80/3307/conf.d/:/etc/mysql/conf.d/ \
-v /f/mysql/mysql80/3307/data/:/var/lib/mysql/ \
-v /f/mysql/mysql80/3307/mysql-files/:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=1234 \
--network=mysql_cluster_net \
--ip=192.192.192.3 \
--privileged=true \
--name=mysql_slaver \
mysql
4、在主节点创建用于复制的用户
以Cygwin为模拟 unix 环境的本地终端在进入容器时需要配置,因此采用了 powershell,powershell是配置好的。
创建的用于复制的用户时必须使用 mysql_native_password 密码规则插件:
CREATE USER 'slaver'@'192.192.192.3' IDENTIFIED WITH mysql_native_password BY '1234';
对 用户授权:
GRANT REPLICATION SLAVE ON *.* TO 'slaver'@'192.192.192.3';
刷新权限:
FLUSH PRIVILEGES;
5、获取主节点当前的 binary log 文件名和位置
SHOW MASTER STATUS;
6、从节点设置主节点参数
如果失败了还需要重新获取主节点参数并重新设置,即执行上一个步骤和此步骤。
CHANGE MASTER TO MASTER_HOST='192.192.192.2',\
MASTER_USER='slaver',\
MASTER_PASSWORD='1234',\
MASTER_LOG_FILE='mysql-bin.000005',\
MASTER_LOG_POS=1678;
7、从节点开始同步
开始同步:
START SLAVE;
查看从节点状态:
SHOW SLAVE STATUS\G;
如果失败也可以在这些信息中找到错误的原因,可以使用如下命令停止复制:
STOP SLAVE;
8、测试
注意事项
密码认证插件
通常情况下为了将navicat等客户端工具连接上MySQL,都会强调将密码认证插件由 caching_sha2_password 改成 mysql_native_passord,如:
百度到的结果基本也都解释为,客户端工具的MySQL驱动版本太低,要么升级客户端工具的MySQL驱动,要么使用命令行,要么更改密码认证插件。
但是换言之,MySQL8版本已经出来这么久,8.0版本和5.7版本就好比JDK的8版本和11版本,都是重大的更新,而如果客户端工具依旧既没有使用8版本的驱动,还不为用户提供可配置可插拔的驱动设置,那么是不是这款客户端工具有点那个啥了。
但是通过查看安装目录和测试,至少navicat客户端已经支持8版本的密码认证规则了。
docker for windows的数据卷容器
在windows上的docker实际上运行了一层虚拟机,所以挂载时只能挂载与虚拟机共享的磁盘。然而,虽然mac系统由unix衍生,但是mac系统也是和windows一样的。所以,人生苦短我用Manjaro······
本教主将F盘作为共享磁盘,可以通过类似如下的方式访问:
ls -l /f/mysql/mysql80/3306/conf.d/
挂载
在百度上可以看到很多教程可以只挂载文件,和挂载目录的方式是相同的,例如:
-v /f/mysql/mysql80/3306/my.cnf:/etc/mysql/my.cnf
但是在尝试时确始终提示文件和目录不对应,而在DockerHub上的mysql说明也是映射 conf.d 目录,浏览 /etc/mysql/my.cnf 文件时发现也提到了 custom 配置应包含在conf.d目录中,所以挂载 conf.d 目录也挺好的。又或者,这些操作也仅仅局限于自己玩一玩罢了,也并不满足高可用的集群方案。