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

相关推荐
星哥说事1 天前
基于 MySQL Monitoring and Management 的性能保障实践
数据库·mysql
JPX-NO1 天前
windows下编程IDE使用docker搭建的rust开发环境(Linux)
ide·windows·docker·rust
快乐就去敲代码@!1 天前
Boot Cache Star ⭐(高性能两级缓存系统)
spring boot·redis·后端·缓存·docker·压力测试
爱学大树锯1 天前
在Docker环境中安装RabbitMQ延迟消息插件实战记录
docker·容器·rabbitmq
千寻技术帮1 天前
10382_基于Springboot的高校排课管理系统
mysql·vue·毕设·spingboot·高校排课
Coder_Oldou1 天前
【经验分享】MySQL线上使用经验
数据库·经验分享·mysql
IT教程资源C1 天前
(N_115)基于springboot,vue教务管理系统
mysql·vue·前后端分离·springboot教务系统
chushiyunen1 天前
mysql性能调优、连接数、问题排查等
数据库·mysql
Predestination王瀞潞1 天前
数据库MySql 8.0.44的安装
数据库·mysql
一只懒鱼a1 天前
搭建kafka集群(安装包 + docker方式)
运维·容器·kafka