457 字
2 分钟
Docker安装mysql,并配置两台服务器主主复制

安装mysql#

在两台服务器上同时进行,这里以mysql 5.7为例:

docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=sadffsafdsfaf \
mysql:5.7

然后将配置文件复制出来

Terminal window
docker cp mysql:/etc/mysql /root/data/mysql/config

docker compose启动mysql

version: '3.9'
services:
mysql:
image: 'mysql:5.7'
environment:
- MYSQL_ROOT_PASSWORD=sadffsdadfsdfa
volumes:
- './data:/var/lib/mysql'
- './config:/etc/mysql'
ports:
- '3306:3306'
container_name: mysql

在server1上,进入config文件夹,创建my.cnf

[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
relay-log=relay-bin
auto_increment_increment=2
auto_increment_offset=1
bind-address=0.0.0.0

在server2上,进入config文件夹,创建my.cnf

[mysqld]
server-id=2
log-bin=mysql-bin
binlog_format=ROW
relay-log=relay-bin
auto_increment_increment=2
auto_increment_offset=2
bind-address=0.0.0.0

启动mysql

Terminal window
docker compose up -d

配置mysql主主复制#

创建复制用户#

两台服务器上运行

Terminal window
docker exec -it mysql mysql -uroot -p -e "
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_password';
FLUSH PRIVILEGES;"

获取主库的二进制日志信息#

在server 1上

Terminal window
docker exec -it mysql mysql -uroot -p -e "SHOW MASTER STATUS;"
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 599 | | | |
+------------------+----------+--------------+------------------+-------------------+

记录 FilePosition,稍后用于 Server 2 配置

配置 Server 2 复制 Server 1#

Terminal window
docker exec -it mysql mysql -uroot -p -e "
CHANGE MASTER TO MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;"

获取 Server 2 的二进制日志信息#

Terminal window
docker exec -it mysql mysql -uroot -p -e "SHOW MASTER STATUS;"
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 599 | | | |
+------------------+----------+--------------+------------------+-------------------+

记录 FilePosition,稍后用于 Server 1 配置

配置 Server 1 复制 Server 2#

Server 1(mysql1) 上执行:

Terminal window
docker exec -it mysql mysql -uroot -p -e "
CHANGE MASTER TO MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;"

检查主主复制状态#

Terminal window
docker exec -it mysql mysql -uroot -p -e "SHOW SLAVE STATUS\G"
  • 确保 Slave_IO_RunningSlave_SQL_Running 都是 Yes

  • Seconds_Behind_Master应该为0或者接近0

测试主主复制状态#

在server 1上插入数据:

Terminal window
docker exec -it mysql mysql -uroot -p -e "CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50)); INSERT INTO test_table (name) VALUES ('Server1');"

在server 2上查询数据

Terminal window
docker exec -it mysql mysql -uroot -p -e "SELECT * FROM test_db.test_table;"

如果数据同步成功,说明 主主复制已正确配置!🎉

Docker安装mysql,并配置两台服务器主主复制
https://blog.gckjoy.com/archives/docker-mysql-cluster/
作者
Echo of Joy
发布于
2025-02-03
许可协议
CC BY-NC-SA 4.0