返回

Docker 搭建 MySQL 8 异步及半同步复制:稳定高效的数据库复制方案

后端

在 Docker 中设置 MySQL 8 的异步和半同步复制

简介

MySQL 复制是一种将数据从主数据库同步到一个或多个从数据库副本的过程。它有各种实现方式,包括异步复制和半同步复制。本文将指导您使用 Docker 在 MySQL 8 中设置这两种复制类型。

异步复制

步骤 1:配置主库

  • 拉取 MySQL 8 镜像:docker pull mysql:8.0.27
  • 创建并启动主库容器:
docker run --name mysql-master -e MYSQL_ROOT_PASSWORD=my-password -d mysql:8.0.27 --default-authentication-plugin=mysql_native_password

步骤 2:配置从库

  • 拉取 MySQL 8 镜像:docker pull mysql:8.0.27
  • 创建并启动从库容器:
docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=my-password -d mysql:8.0.27 --default-authentication-plugin=mysql_native_password

步骤 3:启用二进制日志并配置复制

  • 在主库上启用二进制日志:SET GLOBAL binlog_format = 'ROW';
  • 在从库上配置复制:
    • 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,添加以下配置:
      • server-id=2
      • log-bin
      • binlog-do-db=my_database
      • binlog-ignore-db=information_schema
    • 重启从库:service mysql restart
  • 在主库上创建复制用户:CREATE USER 'repl'@'%' IDENTIFIED BY 'my-password';
  • 在主库上授予复制权限:GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  • 在从库上启动复制:
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl', MASTER_PASSWORD='my-password', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4;

步骤 4:测试异步复制

  • 在主库上创建表格:CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY (id));
  • 在主库上插入数据:INSERT INTO test (name) VALUES ('Hello, world!');
  • 在从库上查询数据:SELECT * FROM test;

半同步复制

步骤 1:配置主库和从库

  • 在主库上启用半同步复制:SET GLOBAL rpl_semi_sync_master_enabled = 1;
  • 在从库上配置半同步复制:
    • 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,添加以下配置:
      • server-id=2
      • log-bin
      • binlog-do-db=my_database
      • binlog-ignore-db=information_schema
      • rpl_semi_sync_slave_enabled = 1
    • 重启从库:service mysql restart
  • 创建复制用户和授予权限(与异步复制相同)

步骤 2:启动半同步复制

  • 在从库上启动复制:
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl', MASTER_PASSWORD='my-password', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4, MASTER_HEARTBEAT_PERIOD=1;

步骤 3:测试半同步复制

  • 在主库上创建表格:CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY (id));
  • 在主库上插入数据:INSERT INTO test (name) VALUES ('Hello, world!');
  • 在从库上查询数据:SELECT * FROM test;

结论

通过这些步骤,您可以在 Docker 中设置 MySQL 8 的异步复制和半同步复制。选择哪种复制类型取决于您的性能和数据一致性要求。

常见问题解答

  • 异步复制和半同步复制有什么区别?
    • 异步复制不会等待从库确认数据写入,而半同步复制会。这使半同步复制具有更高的数据一致性,但性能也较低。
  • 何时应该使用异步复制?
    • 当性能是首要考虑因素,并且数据一致性不是关键时。
  • 何时应该使用半同步复制?
    • 当数据一致性比性能更重要时。
  • 如何监控复制状态?
    • 使用 SHOW SLAVE STATUS 命令从从库获取复制状态信息。
  • 如何解决复制问题?
    • 检查错误日志并尝试重新启动从库。如果您遇到问题,请参阅 MySQL 文档以获取更多帮助。