docker 安装mysql主从
一、准备
1、一个docker:
我使用的docker版本为:
2、使用docker 下载并安装mysql镜像
[root@bogon ~]# docker search mysql [root@bogon ~]# docker pull 你想要下载的版本号,最好是5版本的。8目前不支持
注意。使用docker拉取镜像的时候 会很慢,这是因为翻墙导致的。可以选择阿里或者中文镜像,会很快,具体网上有教程。不赘述了
3、在拉取成功镜像后启动镜像,也就是创建容器(master主库)
docker run -p 3308:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -d 镜像id
解释一下,docker 运行 对外映射端口为3308,容器名字为mysql03,并制定root用户的密码为123456,设置时间-d 并指定使用镜像
因为我的mysql01 被我创建mysql 8版本的容器了对外还是3306(尴尬)。。所以我就使用了mysql03命名;
4、创建从库(slave)
docker run -p 3307:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -d 镜像id
这样呢。主库与从库就创建完成了。但。两个库还没实现数据通信。
5、进入容器内部修改配置(主库)
进入容器内部 docker exec -it 容器id /bin/bash 进入mysql 的根目录 cd etc/mysql 编辑my.cnf 文件 vim my.cnf
这里可能会遇到 没有vim命令的报错。
需要安装相关功能才行
apt-get update apt-get install vim
再编辑my.cnf文件时,添加
## 同一局域网内注意要唯一 server-id=100 ## 开启二进制日志功能,可以随便取(关键) log-bin=mysql-bin
配置完成后,exit 出容器,并重启容器,docker restart 容器id;
到这里就要开始操作一个管家的步骤了。要不创建一个用户,给从库提供数据用。
要不就使用root进行,我呢,为了图方便就直接使用root了。
给root用户赋权限。其实吧我感觉都不用赋权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
6、配置从库
1、与主库一样,配置my.cnf文件
[mysqld] ## 设置server_id,注意要唯一 server-id=101 ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin
重启容器
7、连接主从
1、进入主mysql容器,并登陆mysql
mysql -uroot -p
2、查看主库的属性 show master status; 并记录下file 和position 两个参数
3、查出主mysql 的容器内部地址,并记录下来
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id
4、进入到从库,并登陆
mysql -uroot -p 执行下面的命令 change master to master_host='172.17.0.2', master_user='root', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
参数说明:
master_host :Master的容器在docker中的地址
master_port:master的容器内部端口,不是对外的端口号
master_user:要连接master那个用户
master_password:用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端执行show slave status \G;
用于查看主从同步状态。
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave
开启主从复制过程,然后再次查询主从同步状态show slave status \G;
。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。比如,在master上,执行 create database test;再去从库中看,是不是同样有了一个test库,如果是,就没有问题了。
8、主从排错:
出现上述问题 原因是真的难分析。因为我第一次搭建也是上述报错。错误原因也是同一类。在这里呢。分享一下我的经验。
1、在从库中执行change命令时,参数不准确,比如port 写成了对外的,用户写成了从库的等等
2、记录的file 与position 不准确,这里要注意,在配置主从的时候,不要在对主库有任何操作否则都会使得position值发生变化。
3、docker容器内部网络问题。
4、密码录错了。
基本上都是自己疏忽大意,导致的问题。只能仔细一点点排查。。