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,则搭建成功。

相关推荐
这个DBA有点耶1 小时前
信创场景下数据同步软件怎么选?对比开源CDC与原生闭环工具的结构性差异
数据库·mysql·架构
多客:duokelijie2 小时前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
IT利刃出鞘3 小时前
Docker Compose--解决修改配置后不生效的问题
运维·docker·容器
java_logo3 小时前
Docker 部署 CloudBeaver:轻松搭建网页数据库管理平台
数据库·docker·容器·数据库管理·dbeaver·轩辕镜像·cloudbeaver
Lsetea3 小时前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
FluxDB4 小时前
FluxDB vs DBX vs DBeaver:GPUI、Tauri、Eclipse 三种技术栈实测
数据库·mysql
好用斋4 小时前
拾光坞安装网盘聚合LitePan:把Docker命令翻译成图形界面
运维·docker·容器
对象存储与RustFS5 小时前
Velero 接 RustFS 实操:K8s 集群备份落到自建对象存储
后端·docker·云原生
数据库小学妹5 小时前
MySQL分页结果不稳定:唯一键兜底与游标分页
数据库·mysql·dba
风翼靓崽5 小时前
mysql数据备份/恢复
数据库·mysql