1. 目录结构
demo
|-- docker-compose.yml
|-- source
|-- data
|-- conf
|-- source.cnf
|-- replica_1
|-- data
|-- conf
|-- replica.cnf
2. 配置文件
-
docker-compose.yml
利用 docker 来进行本地测试,比使用虚拟机性价比更高,也更加方便。
version: '3' services: # 源库 db_source: image: mysql:8 volumes: - "./source/data:/var/lib/mysql" # 数据备份 - "./source/conf:/etc/mysql/conf.d" # 配置文件,需提前写好,下面会给出🌰 environment: - MYSQL_ROOT_PASSWORD=password # 副本库1,可以有多个 db_replica_1: image: mysql:8 volumes: - "./replica_1/data:/var/lib/mysql" - "./replica_1/conf:/etc/mysql/conf.d" environment: - MYSQL_ROOT_PASSWORD=password
-
source.cnf
这是源库的配置文件。
-
log-bin
启用二进制日志。 -
server-id
给源库设置 ID,集群内必须唯一 -
innodb_flush_log_at_trx_commit
和sync_binlog
提高主从复制的耐用性和一致性
[mysqld] log-bin=mysql-bin server-id=1001 innodb_flush_log_at_trx_commit=1 sync_binlog=1
-
-
replica.cnf
这是副本的配置文件,副本不需要启用二进制日志,只需要确保 ID 唯一即可。
[mysqld] server-id=1002
3. 启动 docker 容器
docker-compose up -d
4. 获取源库的二进制日志坐标
-
进入源库容器
$ docker-compose exec db_source mysql -u root -p Enter password: # 输入密码 password 即可。
-
获取二进制日志的文件名(File)和坐标(Position),这个窗口就不要动了,接下来有用。
mysql > SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 73 | test | manual,mysql | +------------------+----------+--------------+------------------+
5. 给副本库设置复制源
-
进入副本库容器
$ docker-compose exec db_replica_1 mysql -u root -p Enter password: # 输入密码 password 即可。
-
设置复制源
- SOURCE_HOST 源库的 ip 或者域名
- SOURCE_POST 源库的端口
- SOURCE_USER 源库中,用来执行复制的用户
- SOURCE_PASSWORD 源库中,用来执行复制的用户的密码
- SOURCE_LOG_FILE 上一节从源库中获取二进制日志的文件名(File)
- SOURCE_LOG_POS 上一节从源库中获取的二进制日志的坐标(Position)
- GET_SOURCE_PUBLIC_KEY 因为 mysql8 的密码加密使用的是 caching_sha2_password,所以要启用基于 RSA 密钥对的密码交换,这个参数只接收 0 或 1。
Ps. 这一段解释就像:It's a cat!
mysql> CHANGE REPLICATION SOURCE TO -> SOURCE_HOST='db_source', -> SOURCE_PORT=3306, -> SOURCE_USER='root', -> SOURCE_PASSWORD='password', -> SOURCE_LOG_FILE='mysql-bin.000003', -> SOURCE_LOG_POS=73, -> GET_SOURCE_PUBLIC_KEY=1;
-
开启复制
mysql> START REPLICA;
网友评论