Docker配置mysql主从

拉取mysql镜像
docker pull mysql:5.7
master

  • 3306端口前面的端口是容器映射到宿主机的端口,外部访问端口
  • 映射端口时注意端口不要冲突
    docker run -p 3339:3306 --name main_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    slave
    docker run -p 3340:3306 --name slave_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  • 查询启动两个mysql容器
  • 可以通过本地的navicat等可视化工具测试连接数据库,检测容器是否启动成功,我这里用的pycharm的连接mysql数据库插件连接的
    • Host 服务器公网IP
    • 账号 root
    • 密码是创建容器时的密码
    • 端口是容器映射的端口
      在这里插入图片描述
      docker ps
      在这里插入图片描述
      配置Master(主)
  • 通过docker exec -it eada490abf5f /bin/bash命令进入到Master容器内部,也可以通过docker exec -it main_mysql /bin/bash命令进入。eada490abf5f是容器的id,而main_master是容器的名称。
  • cd /etc/mysql切换到/etc/mysql目录下,然后vim my.cnf对my.cnf进行编辑。此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim
    在这里插入图片描述
  • 刚刚进入的容器没有vim编辑器,这时可能又会报错
  • 需要更新一下软件包 apt-get update
  • 更新完毕之后,再次安装vim编辑器apt-get install vim
[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
  • 配置完成之后,需要重启mysql服务使配置生效。在当前容器中,使用service mysql restart完成重启。重启mysql服务时会使得docker容器停止,我们还需要docker start main_mysql启动容器。
  • 下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
  • docker exec -it main_mysql 进入容器
  • 连接数据库 mysql -u root -p 123456
    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    在这里插入图片描述
    配置从数据库slaveMySQL
  • 基本操作和主数据库一样
  • 修改从数据库的my.cnf配置文件
[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin  
  • 配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。
    连接Master(主)和Slave(从)

  • 在Master进入mysql,执行show master status;
    在这里插入图片描述

  • File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

  • master_host查询 后面跟容器名字或者容器ID
    docker inspect --format='{{.NetworkSettings.IPAddress}} main_mysql在这里插入图片描述

  • 在Slave 中进入 mysql,执行change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 617, master_connect_retry=30;

  • master_port:Master的端口号,指的是容器的端口号

  • master_user:用于数据同步的用户

  • master_password:用于同步的用户的密码

  • master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

  • master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

  • master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

  • 在从数据库查询从数据库状态
    show slave status \G;

    • 此时这两状态都是NO
    • Slave_IO_Running: No
    • Slave_SQL_Running:No在这里插入图片描述
  • 因为此时从数据库还未开启主从服务
    start slave; 开启数据库主从服务
    show slave status \G; 不出意外主从配置成功
    在这里插入图片描述

  • 测试主从

  • 连接主数据库,创建数据库
    在这里插入图片描述

  • 连接从数据库查询
    在这里插入图片描述
    没问题,docker中mysql主从配置成功!

可能在最后一步会报错!我在这个错误上被折磨了一个多小时!!!

在这里插入图片描述

  • 报错问题
  • 出现报错,先在从数据库停掉数据库主从服务 stop slave;
    • 网络错误(这个几乎可以排除,可能性比较低,解决办法ping 一下看是不是网络错误)
    • pos值错误(重新查询一些master信息 show master status
    • 密码错误(检查在使用grant命令时是不是密码串中多了空格,这个可能性也比较大)
    • 没有查询master_host的IP
      master_host的ip不是服务器ip,是主数据库的docker容器的ip,通过上面说过的 docker inspect命令查询,我就忘记了查询,直接写出服务器的ip,导致主从配置一直无法成功!
  • 解决之后,在充从数据库重启数据库主从服务 start salve
  • 之后查询状态
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值