KING 博主等级

一帆风顺 ⛵️⛵️⛵️

docker-compose 搭建mysql8.4主从复制

钟晓川
2024-10-14 / 0 点赞 / 233 阅读

准备docker-compose.yml

services:
  # 主
  mysql-master:
    image: mysql:8.4.2
    container_name: mysql-master
    # network_mode: host
    privileged: true
    environment:
      - "MYSQL_ROOT_PASSWORD=123456"
      - "TZ=Asia/Shanghai"
    networks:
      - mysql
    volumes:
      - /opt/docker/mysql/master/data:/var/lib/mysql
      - /opt/docker/mysql/master/conf:/etc/mysql/conf.d
    ports:
      - 53306:3306
  # 从1
  mysql-slave01:
    image: mysql:8.4.2
    container_name: mysql-slave01
    # network_mode: host
    privileged: true
    environment:
      - "MYSQL_ROOT_PASSWORD=123456"
      - "TZ=Asia/Shanghai"
    networks:
      - mysql
    volumes:
      - /opt/docker/mysql/slave01/data:/var/lib/mysql
      - /opt/docker/mysql/slave01/conf:/etc/mysql/conf.d
    # links:
    #   - mysql-master:mysql-master
    # depends_on:
    #   - mysql-master
    ports:
      - 53307:3306
  # 从2
  mysql-slave02:
    image: mysql:8.4.2
    container_name: mysql-slave02
    # network_mode: host
    privileged: true
    environment:
      - "MYSQL_ROOT_PASSWORD=123456"
      - "TZ=Asia/Shanghai"
    networks:
      - mysql
    volumes:
      - /opt/docker/mysql/slave02/data:/var/lib/mysql
      - /opt/docker/mysql/slave02/conf:/etc/mysql/conf.d
    # links:
    #   - mysql-master:mysql-master
    # depends_on:
    #   - mysql-master
    ports:
      - 53308:3306

networks:
  mysql:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "10.10.0.0/16"

运行

docker-compose up -d
  • 查看mysql容器创建以及启动是否成功
docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED      STATUS      PORTS                                                      NAMES
8a89563c8f7c   mysql:8.4.2   "docker-entrypoint.s…"   3 days ago   Up 2 days   33060/tcp, 0.0.0.0:53308->3306/tcp, [::]:53308->3306/tcp   mysql-slave02
3579350270fc   mysql:8.4.2   "docker-entrypoint.s…"   3 days ago   Up 2 days   33060/tcp, 0.0.0.0:53306->3306/tcp, [::]:53306->3306/tcp   mysql-master
49c5141c0189   mysql:8.4.2   "docker-entrypoint.s…"   3 days ago   Up 2 days   33060/tcp, 0.0.0.0:53307->3306/tcp, [::]:53307->3306/tcp   mysql-slave01

配置my.cnf

  • Master
[mysql]
# 设置mysql客户端默认字符集
default-character-set=UTF8MB4
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
# 设置3306端口
port=3306
# 允许最大连接数
max_connections=200
# 允许连接失败的次数
max_connect_errors=10

# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=UTF8MB4
# 开启查询缓存
explicit_defaults_for_timestamp=true
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 等待超时时间秒
wait_timeout=60
# 交互式连接超时时间秒
interactive-timeout=600
# 使用mysql_native_password验证密码
mysql_native_password=on

# 主服务器唯一ID
server-id=4
# 启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 设置需要复制的数据库需要复制的主数据库名字
binlog-do-db=myDatabase
binlog_format=ROW

[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/var/run/mysql/mysql.pid
  • Slave
[mysql]
# 设置mysql客户端默认字符集
default-character-set=UTF8MB4
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
# 设置3306端口
port=3306
# 允许最大连接数
max_connections=200
# 允许连接失败的次数
max_connect_errors=10

# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=UTF8MB4
# 开启查询缓存
explicit_defaults_for_timestamp=true
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 等待超时时间秒
wait_timeout=60
# 交互式连接超时时间秒
interactive-timeout=600
#使用mysql_native_password验证密码
mysql_native_password=on

# 从服务器唯一ID
server-id=44
# 启用中继日志
relay-log=mysql-relay
# 使得更新的数据写进二进制日志中
log-slave-updates=1

# 需要主从复制的数据库 ,如多个则重复配置
replicate-do-db=myDatabase
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) ,如多个则重复配置
binlog-ignore-db=mysql
# 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
# 配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
binlog_expire_logs_seconds=2592000
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件
relay_log=replicas-mysql-relay-bin
log_slave_updates=ON
# 防止改变数据(只读操作,除了特殊的线程)
read_only=ON

[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/var/run/mysql/mysql.pid

重启docker容器

docker-compose restart

创建用户并授权

  • 进入容器Master
docker exec -it mysql-master bash
mysql -uroot -p123456

### 切换mysql数据库
use mysql;

### 创建用户slave并授权,slave为用户名,通配符%表示任意ip,密码为123456
create user 'slave'@'%' identified with mysql_native_password by '123456';

### 给slave用户授权
grant replication slave on *.* to 'slave'@'%';

### 刷新权限
flush privileges;

### 查询主服务器状态,并记录File和Position的值
show binary log status;
  • 进入容器Slave
docker exec -it mysql-slave bash
# 如若之前同步过可执行改行代码
STOP REPLICA;
RESET REPLICA;

CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.98.137',
SOURCE_PORT=53306,
SOURCE_USER='slave',
SOURCE_PASSWORD='123456',
SOURCE_LOG_FILE='mysql-bin.000003',
SOURCE_LOG_POS=1623;

# 开始复制主服务器数据
START REPLICA;
 
# 查看从库复制情况
SHOW REPLICA STATUS\G;

验证

主库中配置的:设置需要复制的数据库的名字 binlog-do-db=myDatabase
从库中配置的:replicate-do-db=myDatabase 设置需要复制的主数据库名字

在主库中创建数据库和表

CREATE DATABASE myDatabase;

CREATE TABLE `student` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO student VALUES(NULL, '张三', 20)

到此成功结束~

0