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

相关推荐
虎头金猫10 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
小白男神11 小时前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
分布式存储与RustFS11 小时前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
这个DBA有点耶11 小时前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
kybs199113 小时前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
玉&心13 小时前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing13 小时前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
赵文宇(温玉)13 小时前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
程序猿_极客13 小时前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
guo_wen_qiang14 小时前
上传本地镜像到harbor中
docker·容器·持续部署