Docker + Mysql 主从集群搭建

本文详细介绍了如何在Docker环境下配置MySQL主从集群,实现数据的读写分离。通过设置不同的server-id,配置binlog,创建数据库连接账号,以及进行主从同步设置,确保数据在主库和从库间的有效复制。同时,文章还提供了验证同步的步骤,确保主从数据库的实时一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、简介

本文介绍的是在 docker 中部署 mysql 主从集群,实现读写分离。
数据文件和配置文件均进行外部映射

二、原理

  • master 更新数据被写到 binlog
  • slave 发起连接,连接到 master
  • master 创建 binlog dump 线程,并把 binlog 发送到 slave
  • slave 启动,创建 I/O 线程,用于读取 master 发送的 binlog,并写到 relay log内
  • slave 创建 sql 线程,从 relay log 中读取,从 ExecMasterLog_Pos 位置开始执行读取到的事务,并写入 slave

三、搭建

请添加图片描述

2.1 master 配置

master 配置文件 master-cnf

[mysqld]
# 设置同一局域网内server-id必须具有唯一性
server-id=1

# 指定复制哪些数据库
binlog-do-db=test

# 指定不复制哪些数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys

# 开启二进制日志功能, 并设置日志文件名, 文件名可随意起名
log-bin=mysql-bin

# 设置 binlog 日志格式, 其值可谓 row(默认)、statement、mixed
binlog_format=statement

# 设置每隔多少次事务提交操作才会将这些操作写入二进制日志文件
sync_binlog=1

# 默认使用 “mysql_native_password” 插件认证
default_authentication_plugin=mysql_native_password

2.2 slave 数据库配置

slave 配置文件 slave-cnf

[mysqld]
# 设置同一局域网内server-id必须具有唯一性
server-id=2

# 开启二进制日志功能, 并设置日志文件名, 文件名可随意起名
# log-bin=mysql-slave-bin

# 指定中继日志
relay-log=slave-relay-bin

# 默认使用 “mysql_native_password” 插件认证
default_authentication_plugin=mysql_native_password	

2.3 创建master 和 slave 数据库

  • docker-compose.yml
version: '3.7'
services:
  master: # 主数据库
    image: mysql:latest
    container_name: mysql-master
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_TCP_PORT=3336
    ports:
      - "3336:3336"
    networks:
      - backend
    volumes:
      - ./mysql-master.cnf:/etc/mysql/my.cnf # 配置文件映射
      - ./data/master:/var/lib/mysql # 数据文件映射

  slave01: # 从数据库
    image: mysql:latest
    container_name: mysql-slave01
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_TCP_PORT=3337
    ports:
      - "3337:3337"
    networks:
      - backend
    volumes:
      - ./mysql-slave.cnf:/etc/mysql/my.cnf  # 配置文件映射
      - ./data/slave01:/var/lib/mysql # 数据文件映射

networks:
  backend:
    name: master_slave
  • 启动 docker 镜像

    # 切换到数据库配置文件目录根下 cmd 执行
    docker compose up -d
    
  • master 中创建 slave 连接账号

    # 可以使用 navicat 连接 master 数据库 执行 sql
    create user 'master'@'%' identified by '123456';
    grant replication slave, replication client on *.* to 'master'@'%';
    
  • 查看 master 主节点状态并记录状态

    # 可以使用 navicat 连接 master 数据库 执行 sql
    show master status;
    

    ps:下图 file 名称要与 .cnf 文件中配置的 log-bin 的名称一致

    请添加图片描述

    1. 如果不一致查看 docker 内镜像启动日志,如果有以下,则代表我们映射的配置文件未生效

      mysql: [Warning] World-writable config file ‘/etc/mysql/my.cnf‘ is ignored.
      
    2. 在 docker 容器内 执行

      cd /etc/mysql  # 切换到配置文件目录
      ls -l # 查看配置文件的权限信息
      
    3. 将更改配置文件权限

      chmod 644 my.cnf	
      
    4. 删除 docker 容器的对外映射的 data 信息和镜像,重新部署

2.4 主从同步设置

同步操作都在子节点进行

  • 关闭同步

    stop slave;
    
  • 设置同步信息
    如果 master 和 slave 在不在同一个机器或者不在同一个docker容器内:

    change master to 
    master_host="xxx.xxx.xxx.xxx",  # master IP 地址
    master_port=3336,        # master 对外映射端口
    master_user='master',
    master_password='123456',  # master中为slave设置的用户名
    master_log_file='mysql_bin.000003', # 对照上面master查询到的信息中 file
    master_log_pos=676, # 对照上面master查询到的信息中position
    master_connect_retry=30;
    

    如果 master 和 slave 在同一个docker容器内:

    change master to 
    master_host="mysql-master",  # 容器中 master 的容器名称
    master_port=3336,        # master 对外映射端口
    master_user='master',  # master中为slave设置的用户名
    master_password='123456'
    master_log_file='mysql_bin.000003', # 对照上面master查询到的信息中 file
    master_log_pos=676, # 对照上面master查询到的信息中position
    master_connect_retry=30;
    
  • 开启同步

    start slave;
    

四、验证同步

  • master 数据库

    根据 master 配置文件中,需要同步的数据库是 test,则创建 test数据库,再创建表 插入数据

  • slave 数据库

    查看 test 数据库以及内部数据

  • 结果

    master 中创建的数据库和表以及数据,在 slave 中都能找到,则完成同步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值