环境描述:centos7 , docker v20.10.22 , docker-compose v1.25.1 , mysql5.7
主数据库:192.168.148.104:3311
从数据库:192.168.148.104:3312
从数据库:192.168.148.104:3313

编辑 docker-compose-mysql.yml 文件

version: '3.8'
services:
  mysql-01:
    container_name: mysql-01
    image: mysql:5.7
    #    build:
    #      context: ./mysql
    ports:
      - "3311:3306"
    volumes:
      - /root/order/mysql1/conf:/etc/mysql/conf.d
      - /root/order/mysql1/logs:/logs
      - /root/order/mysql1/data:/var/lib/mysql
    command: [
      'mysqld',
      '--innodb-buffer-pool-size=80M',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_unicode_ci',
      '--default-time-zone=+8:00',
      '--lower-case-table-names=1'
    ]
    environment:
      MYSQL_ROOT_PASSWORD: 123456

  mysql-02:
    container_name: mysql-02
    image: mysql:5.7
    #    build:
    #      context: ./mysql
    ports:
      - "3312:3306"
    volumes:
      - /root/order/mysql2/conf:/etc/mysql/conf.d
      - /root/order/mysql2/logs:/logs
      - /root/order/mysql2/data:/var/lib/mysql
    command: [
      'mysqld',
      '--innodb-buffer-pool-size=80M',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_unicode_ci',
      '--default-time-zone=+8:00',
      '--lower-case-table-names=1'
    ]
    environment:
      MYSQL_ROOT_PASSWORD: 123456


  mysql-03:
    container_name: mysql-03
    image: mysql:5.7
    #    build:
    #      context: ./mysql
    ports:
      - "3313:3306"
    volumes:
      - /root/order/mysql3/conf:/etc/mysql/conf.d
      - /root/order/mysql3/logs:/logs
      - /root/order/mysql3/data:/var/lib/mysql
    command: [
      'mysqld',
      '--innodb-buffer-pool-size=80M',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_unicode_ci',
      '--default-time-zone=+8:00',
      '--lower-case-table-names=1'
    ]
    environment:
      MYSQL_ROOT_PASSWORD: 123456



我们先去创建三个数据库需要映射挂载的目录

路径大家可以自己改

mkdir -p /root/order/{mysql1,mysql2,mysql3}/{conf,logs,data}

编写MySQL配置文件

主MySQL配置 MySQL1( vim /root/order/mysql1/conf/my.cnf )

  [ mysql ]
  default-character-set=utf8
  [mysqld]
  init_connect='SET collation_connection = utf8_unicode_ci'
  init_connect='SET NAMES utf8'
  character-set-server=utf8
  collation-server=utf8_unicode_ci
  skip-character-set-client-handshake
  skip-name-resolve

  server_id=888800001                     #指定集群id
  log-bin=mysql-bin             #打开二进制日志功能
  read-only=0                    #关闭只读,可读可写
 # binlog-do-db=test_db    #指定要复制那一个
 # binlog-do-db=bigdata    #指定不复制哪一个

从MySQL配置文件 MySQL2 ( vim /root/order/mysql2/conf/my.cnf )

  [client]
  default-character-set=utf8
  [mysql]
  default-character-set=utf8
  [mysqld]
  init_connect='SET collation_connection = utf8_unicode_ci'
  init_connect='SET NAMES utf8'
  character-set-server=utf8
  collation-server=utf8_unicode_ci
  skip-character-set-client-handshake
  skip-name-resolve

  server_id=888800002             #注意此处id不能与主节点相同
  log-bin=mysql-bin
  read-only=1                     #只读
  # binlog-do-db=admin            #需要复制的
  # replicate-ignore-db=mysql     #不需要复制的

从MySQL配置文件 MySQL3 ( vim /root/order/mysql3/conf/my.cnf )

  [client]
  default-character-set=utf8
  [mysql]
  default-character-set=utf8
  [mysqld]
  init_connect='SET collation_connection = utf8_unicode_ci'
  init_connect='SET NAMES utf8'
  character-set-server=utf8
  collation-server=utf8_unicode_ci
  skip-character-set-client-handshake
  skip-name-resolve

  server_id=888800003             #注意此处id不能与主节点相同
  log-bin=mysql-bin
  read-only=1                     #只读
  # binlog-do-db=admin            #需要复制的
  # replicate-ignore-db=mysql     #不需要复制的


准备好这些以后,我们就运行 docker-compose-mysql.yml (我这里是在idea 直接运行 ,也可以放到服务器运行)

2023-02-10T02:14:26.png

启动以后主服务器操作

登录主服务器数据库 运行下面几条sql 语句
-- 创建slave用户

CREATE USER 'guanxi_slave'@'%';

-- 设置密码

ALTER USER 'guanxi_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

-- 授予复制权限

GRANT REPLICATION SLAVE ON *.* TO 'guanxi_slave'@'%';

-- 刷新权限

FLUSH PRIVILEGES;

查看主节点状态: (最后这条语句不能在Navicat 或者其他数据库可视化工具运行 他们不支持那个G参数传递 我们直接xshell上面运行)
-- 查看状态(不需要分号)

show master status\G

2023-02-10T02:22:01.png

从服务器操作(登录数据库操作)

change master to master_host='192.168.148.104',master_user='guanxi_slave',master_password='123456',master_port=3311,master_log_file='mysql-bin.000001',master_log_pos=154;

上面语句参数说明:
MASTER_HOST:主库ip,
MASTER_USER:上面主库配置从服务器登录的用户密码时配置的用户名
MASTER_PASSWORD: 上面主库配置从服务器登录的用户密码时配置的用户密码
MASTER_LOG_FILE:主库的数据库日志文件, 参考上面show master statusG; 得出的File 字段的值,
MASTER_LOG_POS:参考上面show master statusG; 得出的Position 字段的值

开启主从复制并查看状态:

START SLAVE;

-- 查看状态(不需要分号)

SHOW SLAVE STATUS\G

2023-02-10T02:28:14.png

我们看到 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 这样子就成功了

从服务器3 也是一样操作

配好以后创建几个库表试试看
2023-02-10T07:31:26.png

扩展

-- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。

stop slave; 

-- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;

-- 解决数据不一致的时候进行操作的 报错的问题

stop slave;

set global sql_slave_skip_counter=1; 

start slave;