MySql主从复制:
写在开头的话, docker实现Mysql主从复制还是比较简单的,记录一次踩坑过程
-
首先用docker安装两个数据库Master和slave
docker run -p 3301:3306 --name master-mysql -e MYSQL_ROOT_PASSWORD=XXXXXXXX mysql:latest docker run -p 3302:3306 --name slave-mysql -e MYSQL_ROOT_PASSWORD=XXXXXXXX mysql:latest
-
修改容器内的配置文件,重启两个docker实例
这里个人觉得最好还是将docker内的配置文件挂载到本地(需要好好研究一下); 目前我使用的方式是直接使用
docker exec -it 容器Id /bin/bash # 然后进入对应的目录 cd /etc/mysql apt-get update apt-get install vim vim my.cnf docker restart 容器id
进去之后使用键盘上的Insert键,进入插入模式,然后保存退出。
具体在容器中修改的内容是
主数据库:
server-id=1 log-bin=mysql-master-bin
从数据库:
server-id=2 log-bin=mysql-slave-bin relay_log=edu-mysql-relay-bin
这一段配置使用的是https://www.cnblogs.com/songwenjie/p/9371422.html
之前试过挂在本地文件配置,但是发现一直出现server-id重复的问题,但是配置文件里面又不是一样的,最后确认一遍后还真是相同的。具体使用的命令可以百度去查。
-
在Master主数据库中创建一个有对应权限的User
在这里之后,有多种选择;如果觉得命令行难记,可以选择Navicate等远程连接工具直接可视化操作; 当然也可以选择命令行,但是命令行如果你百度搜索的话可能会遇到一些问题。
Mysql: 5.7 和 Mysql: 8.0 (因为我使用的是8.0之后的版本),8.0版本必须先创建用户,然后授权。不能像Mysql:5.7一样直接操作。
这一块我发现对于Mysql整个权限体系还是要有一定了解的,在这个实践过程中,我在CentOS7中使用到一些命令行如下(使用环境均为Mysql8.0版本,不知道之前版本是不是会有坑):
写法一: mysql -uroot -pXXXXXX 写法二: mysql -u root -pXXXXXX 写法三: ->mysql -u root -p ->Enter password: XXXXXX # % 表示所有类型的IP create User '登陆用户名':'%' Identified By '登陆密码' # 授权这两个 REPLICATION SLAVE, REPLICATION CLIENT grant REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '登陆用户名'@'%';
-
在slave从数据库中配置链接信息
这里基本上就是最后一步了。其中最核心的一条设置就是(连成一行):
a) master_log_file 与 master_log_pos配置值非常容易变化,一旦主数据发生修改,master_log_pos就会更改,所以,最好不要随意修改主数据库相关重要信息。很容易掉进去,不过日志还是挺详细的。
b) master_host与master_port中还是可以选择公网链接方式也可以是内网链接方式。
公网链接方式注意开对应端口的防火墙,
内网链接方式必须通过命令
docker inspect 容器ID
会返回一段JSON文件,其中会包含对应的IP地址。
change master to master_host='172.18.0.2', master_port=3306, master_user='root', master_password='XXXXXXXX', master_log_file='mysql-master-bin.000001', master_log_pos=1574, master_connect_retry=30;
完成配置后,然后将使用下面三个方式启动,修改,查看对应的主从状态:
# 停止从服务器 STOP SLAVE; # 启动从服务器 START SLAVE; # 查看从服务器状态 show slave status;
最后如果Slave_IO_Running , Slave_SQL_Runnin 均为Yes,成功。