创建目录和配置文件

  1. mkdir -p mysql_master_slave/{mysql_3306/config,mysql_3307/config} \
  2. && touch mysql_master_slave/mysql_3306/config/my.cnf \
  3. && touch mysql_master_slave/mysql_3307/config/my.cnf \
  4. && touch mysql_master_slave/docker-compose.yml

编辑配置文件

mysql_3306/config/my.cnf

  1. [mysqld]
  2. # 解决docker启动连接慢的问题
  3. skip-name-resolve
  4. server-id=1
  5. port=3306
  6. default-storage-engine=INNODB
  7. character_set_server=utf8
  8. init_connect='SET NAMES utf8'
  9. lower_case_table_names=1
  10. max_connections=200
  11. max_connect_errors=10
  12. # 开启二进制日志
  13. log-bin=mysql-bin
  14. log_bin-index=mysql-bin.index
  15. log_bin_trust_function_creators=ON
  16. binlog-format=ROW
  17. # 设置自增起始偏移量
  18. auto_increment_offset=1
  19. # 设置自增步长
  20. auto_increment_increment=1
  21. # 开启慢查询日志
  22. slow_query_log=ON
  23. # 设置慢查询时间阈值
  24. long_query_time=1
  25. # 设置慢查询日志文件位置
  26. slow_query_log_file=/var/lib/mysql/slow_query.log
  27. # 要同步的数据库
  28. # binlog-do-db=db_name_01
  29. # binlog-do-db=db_name_02
  30. # 忽略同步的数据库
  31. # binlog-ignore-db=db_name_03
  32. # binlog-ignore-db=db_name_04

mysql_3307/config/my.cnf

  1. [mysqld]
  2. # 解决docker启动连接慢的问题
  3. skip-name-resolve
  4. server-id=2
  5. port=3307
  6. default-storage-engine=INNODB
  7. character_set_server=utf8
  8. init_connect='SET NAMES utf8'
  9. lower_case_table_names=1
  10. max_connections=200
  11. max_connect_errors=10
  12. # 开启二进制日志
  13. log-bin=mysql-bin
  14. log_bin-index=mysql-bin.index
  15. log_bin_trust_function_creators=ON
  16. binlog-format=ROW
  17. # 设置自增起始偏移量
  18. auto_increment_offset=1
  19. # 设置自增步长
  20. auto_increment_increment=1
  21. # 开启慢查询日志
  22. slow_query_log=ON
  23. # 设置慢查询时间阈值
  24. long_query_time=1
  25. # 设置慢查询日志文件位置
  26. slow_query_log_file=/var/lib/mysql/slow_query.log
  27. # 使更新的数据写进二进制日志中
  28. log-slave-updates=1
  29. # 开启中继日志
  30. relay-log=mysql-relay
  31. relay-log-index=mysql-relay.index
  32. # 如果salve库名称与master库名相同,使用本配置
  33. # replicate-do-db=db_name
  34. # 如果master库名[mastdemo]与salve库名[mastdemo01]不同, 使用以下配置[需要做映射]
  35. # replicate-rewrite-db=db_name -> db_name_rewrite
  36. # 如果不是要全部同步[默认全部同步], 则指定需要同步的表
  37. # replicate-wild-do-table=db_name.table_name_01
  38. # replicate-wild-do-table=db_name.table_name_02

mysql_master_slave/docker-compose.yml

  1. version: '3'
  2. services:
  3. mysql_3306:
  4. image: mysql:8.0.21
  5. container_name: mysql_3306
  6. ports:
  7. - 3306:3306
  8. privileged: true
  9. volumes:
  10. - ./mysql_3306/config:/etc/mysql/conf.d
  11. - ./mysql_3306/data:/var/lib/mysql
  12. - ./mysql_3306/logs:/var/log/mysql
  13. environment:
  14. - MYSQL_ROOT_PASSWORD=root
  15. - MYSQL_USER=admin
  16. - MYSQL_PASSWORD=admin
  17. - TZ=Asia/Shanghai
  18. mysql_3307:
  19. image: mysql:8.0.21
  20. container_name: mysql_3307
  21. ports:
  22. - 3307:3307
  23. privileged: true
  24. volumes:
  25. - ./mysql_3307/config:/etc/mysql/conf.d
  26. - ./mysql_3307/data:/var/lib/mysql
  27. - ./mysql_3307/logs:/var/log/mysql
  28. environment:
  29. - MYSQL_ROOT_PASSWORD=root
  30. - MYSQL_USER=admin
  31. - MYSQL_PASSWORD=admin
  32. - TZ=Asia/Shanghai
  33. networks:
  34. default:
  35. external:
  36. name: service_network

启动服务

  1. docker-compose up -d

主从配置

主节点操作

  1. -- 创建用来同步的用户, 并授权
  2. CREATE USER 'repl_user' @'%' IDENTIFIED WITH mysql_native_password BY '123456';
  3. GRANT replication slave, replication client, file ON *.* TO 'repl_user' @'%';
  4. -- 刷新权限
  5. FLUSH PRIVILEGES;
  6. -- 查看主节点同步状态
  7. SHOW MASTER STATUS;

image.png

从节点操作

  1. -- 设置主节点信息
  2. CHANGE MASTER TO master_host = '192.168.56.11',
  3. master_port = 3306,
  4. master_user = 'repl_user',
  5. master_password = '123456',
  6. master_log_file = 'mysql-bin.000003',
  7. master_log_pos = 870;
  8. -- 开启slave
  9. START SLAVE;
  10. -- 查看主从同步状态
  11. SHOW SLAVE STATUS;

开启半同步

mysql主从架构默认采用[异步]的方式进行数据同步, 为了提高数据一致性, 可以设置为[半同步]

安装插件

  1. -- master安装插件
  2. install plugin rpl_semi_sync_master soname 'semisync_master.so';
  3. -- slave安装插件
  4. install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  5. -- 查看插件
  6. show plugins;

启动半同步

  1. -- 查看半同步开启状态
  2. show global variables like 'rpl_semi%';
  3. -- 先启动从库 1-启用, 0-禁止
  4. set global rpl_semi_sync_slave_enabled = 1;
  5. -- 再启动主库
  6. set global rpl_semi_sync_master_enabled = 1;
  7. set global rpl_semi_sync_master_timeout = 10000; -- 设置半同步超时时间, 单位为毫秒