Docker搭建Mysql主从复制

首先明确docker中启动的容器不能访问宿主机的ip。

但是在从机执行下面命令的时候 master_host用到了主机的ip。

有两种解决方案:

1.使用容器自身的ip,可以通过 docker inspect 容器名 | grep IPAddress 查看容器ip。 但是容器自身的ip是随机分配的,会发生变化,

2.使用自定义网络(桥接模式)。将需要互联的容器放到同一个网络下,就能够通过容器名称进行访问。

bash 复制代码
change master to master_host='readwrite_master_1',master_port=3306, master_user='root',master_password='123456',master_log_file='master-bin.000001',master_log_pos=3755;

本次搭建使用的是自定义网络模式。

Mysql 一主一从。

  1. 使用docker启动两个mysql容器,并将这两个容器放入同一个网络下

    bash 复制代码
    docker run \
    --name readwrite_master_0 \
    -d \
    -p 3301:3306 \
    -v mysql_data_1:/var/lib/mysql \
    -v mysql_conf_1:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --privileged=true \
    mysql:8.0
    
    
    docker run \
    --name readwrite_slave_0 \
    -d \
    -p 3302:3306 \
    -v mysql_data_2:/var/lib/mysql \
    -v mysql_conf_2:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --privileged=true \
    mysql:8.0
    
    # 创建网络
    docker network create readwrite-net # 默认创建的就是网桥模式
    # 将容器放入同一个网络
    docker network connect readwrite-net readwrite_master_0
    docker network connect readwrite-net readwrite_slave_0
  2. 在这两个mysql下创建数据库 db_test,用于测试。

  3. 修改挂载出来的mysql 配置文件 mysql.conf。

    3.1 主机mysql mysql.conf,添加如下配置:

    bash 复制代码
    [mysqld]
    server-id = 1    #服务器 id,随意,但要唯一
    log_bin = master-bin        #二进制文件存放路径
    log-slave-updates=true
    read-only = 0    #[可选] 0(默认)表示读写(主机),1表示只读(从机)
    binlog_expire_logs_seconds = 2592000    #设置日志文件保留的时长,单位是秒
    max_binlog_size = 100M    #控制单个二进制日志大小。此参数的最大和默认值是1GB
    binlog_do_db = db_test    #待同步的数据库日志
    binlog_ignore_db = mysql,sys    #不同步的数据库日志

    3.2 从机mysql mysql.conf ,添加如下配置:

    bash 复制代码
    [mysqld]
    server-id = 2      
    read-only = 1
    relay-log = relay-log-bin 	
    relay-log-index = slave-relay-bin.index 
  4. 主机用户密码插件,然后重启主机mysql

    bash 复制代码
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    
    FLUSH PRIVILEGES;
  5. 主机查看master状态,记录 File(如:master-bin.000004),Position(如:9082) 字段值(后面会用)

    bash 复制代码
    show master status;
  6. 从机mysql执行下面命令,填写自己主机mysql的容器名,用户名,密码,File,Position。

    bash 复制代码
    stop slave;
    
    change master to master_host='readwrite_master_0',master_port=3306, master_user='root',master_password='123456',master_log_file='master-bin.000004',master_log_pos=9082;
    
    start slave;
  7. 查看从机状态

    bash 复制代码
    show slave status;

    如果 Slave_IO_Running和Slave_SQL_Running字段都为Yes,则搭建成功。

相关推荐
鱼跃鹰飞18 分钟前
面试题:解释一下什么是全字段排序和rowid排序
数据结构·数据库·mysql
王同学 学出来20 分钟前
vue+nodejs项目在服务器实现docker部署
服务器·前端·vue.js·docker·node.js
Dxy123931021630 分钟前
MySQL连表查询讲解:从基础到实战
数据库·mysql
last demo38 分钟前
docker容器
运维·docker·容器
海鸥811 小时前
k8s 国内无法下载docker images的分析
docker
养乐多q.♡1 小时前
docker镜像的nginx配置证书SSL,单独配置单个localtion使用证书,其他nginx配置不影响
nginx·docker·ssl
Y.O.U..1 小时前
Kurbenetes-Service(1)
容器·kubernetes
韩立学长1 小时前
【开题答辩实录分享】以《兴趣班预约管理系统的设计与实现》为例进行选题答辩实录分享
java·mysql·intellij idea
岁岁种桃花儿2 小时前
MySQL知识汇总:讲一讲MySQL中Select语句的执行顺序
数据库·mysql·database
计算机毕设指导62 小时前
基于微信小程序民宿预订管理系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven