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

相关推荐
余额很不足3 小时前
K8S知识点
linux·容器·kubernetes
栗子~~4 小时前
docker-compose的方式搭建 kafka KRaft 模式集群
docker·kafka·linq
betazhou4 小时前
sysbench压力测试工具mysql以及postgresql
数据库·mysql·postgresql
周杰伦_Jay6 小时前
详细介绍:持续集成与持续部署(CI/CD)技术细节(关键实践、CI/CD管道、优势与挑战)
程序人生·ci/cd·docker·微服务·云原生·容器·人机交互
老苏畅谈运维8 小时前
MySQL性能分析的“秘密武器”,深度剖析SQL问题
数据库·sql·mysql
Java诗人DK9 小时前
windows 安装 mysql 教程
数据库·windows·mysql
骑台风走9 小时前
ubunut22.04安装docker(基于阿里云 Docker 镜像源安装 Docker)
阿里云·docker·容器
仇辉攻防10 小时前
【云安全】云原生-Docker(五)容器逃逸之漏洞利用
安全·web安全·网络安全·docker·云原生·容器·安全性测试
SomeBottle13 小时前
【小记】在 Google Colab 等平台上运行 GPU 容器
linux·python·docker·学习笔记·容器化·斩虫
风霜不见闲沉月15 小时前
Docker常用知识点问题
docker