docker 安装mysql主从

一、准备

1、一个docker:

我使用的docker版本为:docker下的mysql主从同步-LMLPHP

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 两个参数

docker下的mysql主从同步-LMLPHP

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;用于查看主从同步状态。

docker下的mysql主从同步-LMLPHP

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;

docker下的mysql主从同步-LMLPHP

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。比如,在master上,执行 create database test;再去从库中看,是不是同样有了一个test库,如果是,就没有问题了。

8、主从排错:

docker下的mysql主从同步-LMLPHP

docker下的mysql主从同步-LMLPHP

出现上述问题 原因是真的难分析。因为我第一次搭建也是上述报错。错误原因也是同一类。在这里呢。分享一下我的经验。

1、在从库中执行change命令时,参数不准确,比如port 写成了对外的,用户写成了从库的等等

2、记录的file 与position 不准确,这里要注意,在配置主从的时候,不要在对主库有任何操作否则都会使得position值发生变化。

3、docker容器内部网络问题。

4、密码录错了。

基本上都是自己疏忽大意,导致的问题。只能仔细一点点排查。。

参考:https://www.cnblogs.com/songwenjie/p/9371422.html

08-08 23:32