Skip to main content
Version: v23.10

MySQL

假设有如下服务器用于设置 MySQL 主从:

  • MySQL 服务器:192.168.1.4 用于作为主库(以下简称 MySQL Master)
  • MySQL 服务器:192.168.1.5 用于作为从库(以下简称 MySQL Slave)

1. 配置 MySQL Master

登录 MySQL Master 192.168.1.4 并切换至工作目录

cd /data/tencent-survey-v23.10

修改 docker-compose-pass.yaml 文件 mysql-server-clustercommand 部分

# 主从模式下, master, slave server-id 不能相同
command:
- --default-authentication-plugin=mysql_native_password
- --server-id=1
- --read-only=0

2. 配置 MySQL Slave

登录 MySQL Slave 192.168.1.5 并切换至工作目录

cd /data/tencent-survey-v23.10

修改 docker-compose-pass.yaml 文件 mysql-server-clustercommand 部分

# 主从模式下, master, slave server-id 不能相同
# slave read-only=1
command:
- --default-authentication-plugin=mysql_native_password
- --server-id=2
- --read-only=1

3. 启动 MySQL 主从模式

3.1 启动 MySQL Master

# 进入 Node 1 192.168.1.4
docker compose -f docker-compose-paas.yaml up mysql-server-cluster

3.2 启动 MySQL Slave

# 进入 Node 2 192.168.1.5
docker compose -f docker-compose-paas.yaml up mysql-server-cluster

3.3 设置主从复制

!!! 注意:是连接到 MySQL Slave 192.168.1.5 执行命令

MySQL 客户端:mysqldocker run --rm -t cdchub.tencentcloudcr.com/public/mysql:8.0-oracle mysql

mysql -h192.168.1.5 -uroot -p${MYSQL_ROOT_PASSWORD} -e \
"CHANGE MASTER TO MASTER_HOST='192.168.1.4', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='${MYSQL_ROOT_PASSWORD}', MASTER_AUTO_POSITION=1;
start slave;"

3.4 检测验证

检测主从复制是否成功

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 9.134.75.215
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000004
Read_Master_Log_Pos: 1081 # 这里要同 MySQL Master 的 show master status 里的信息一致
Relay_Log_File: VM_79_44_centos-relay-bin.000008
Relay_Log_Pos: 451
Relay_Master_Log_File: binlog.000004
Slave_IO_Running: Yes # 这里要 yes
Slave_SQL_Running: Yes # 这里要 yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1081
Relay_Log_Space: 1185
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0 # 这里要 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error: # 这里不要有错误信息
Last_SQL_Errno: 0
Last_SQL_Error: # 这里不要有错误信息
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 63351b8d-310a-11ee-8fa2-52540024952d
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 63351b8d-310a-11ee-8fa2-52540024952d:1-9
Executed_Gtid_Set: 4372da78-310b-11ee-8fb1-5254008eded4:1-5,
63351b8d-310a-11ee-8fa2-52540024952d:1-9
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.01 sec)

检测 read_only 是否设置成功

mysql> SHOW global VARIABLES LIKE '%read_only%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_read_only | OFF |
| read_only | ON |
| super_read_only | OFF |
| transaction_read_only | OFF |
+-----------------------+-------+
4 rows in set (0.01 sec)

检测 server_id 是否设置成功, server_uuid 是否唯一

mysql> SHOW global VARIABLES LIKE '%server_%';
+---------------------------------+--------------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------------+
| innodb_ft_server_stopword_table | |
| server_id | 2 |
| server_id_bits | 32 |
| server_uuid | 4372da78-310b-11ee-8fb1-5254008eded4 |
+---------------------------------+--------------------------------------+
4 rows in set (0.00 sec)

4. 修改数据库连接地址

登录所有应用服务器并切换至工作目录,修改 .env 中以下配置为 MySQL Master 的实际连接信息:

MAIN_HOST=mysql-server:3306
MAIN_DATABASE=ur_main
MAIN_USERNAME=root
MAIN_PASSWORD=$MYSQL_ROOT_PASSWORD

# answer shard1
DB2_HOST=mysql-server:3306
DB2_DATABASE=new_ur
DB2_USERNAME=root
DB2_PASSWORD=$MYSQL_ROOT_PASSWORD

# answer shard2
DB3_HOST=mysql-server:3306
DB3_DATABASE=new_ur
DB3_USERNAME=root
DB3_PASSWORD=$MYSQL_ROOT_PASSWORD

# answer shard3
DB6_HOST=mysql-server:3306
DB6_DATABASE=new_ur
DB6_USERNAME=root
DB6_PASSWORD=$MYSQL_ROOT_PASSWORD

# answer shard4
DB7_HOST=mysql-server:3306
DB7_DATABASE=new_ur
DB7_USERNAME=root
DB7_PASSWORD=$MYSQL_ROOT_PASSWORD

注意,需要在所有应用服务器中重复执行

修改完成后,使用以下命令重启所有应用服务

docker compose -f docker-compose.yaml restart