宝塔使用docker做mysql主从同步 读写分离
第一部分 启动mysql镜像 如果不使用docker 请忽略此步
1、在宝塔使用docker 安装 mysql:5.7
2、启动时设置 命名(mysql_slave)、允许外部ip访问、设置好密码,按照默认方式启动
3、启动后会在 /www/dk_project/dk_app/mysql/mysql_slave 目录下生成数据卷的挂载映射
4、停止该容器,并进行 /www/dk_project/dk_app/mysql/mysql_slave 目录下,将data目录mv至其它盘符,如果有其它磁盘可以转至其它磁盘目录
5、(如果磁盘够大,可以不做这一步)将转移后的data 目录回写至 /www/dk_project/dk_app/mysql/mysql_slave/docker-compose.yml 配置文件中,
将 - ${APP_PATH}/data/:/var/lib/mysql
替换成 - 转移后的data目录:/var/lib/mysql
第二部分 修改 Master 配置
1、编辑主服务器上的 my.cnf (通常是 /etc/my.cnf 或 /etc/mysql/my.cnf,宝塔应用商店 mysql 点击设置-配置文件)。
[mysqld]
# 服务器唯一ID,在整个复制集群中必须唯一
server-id = 1
# 启用二进制日志,并指定日志文件名前缀
log_bin = mysql-bin
# 可选:指定需要复制的数据库(多个则写多行),不指定则复制所有库
binlog_do_db = db_name
# 可选:为了数据一致性,推荐使用行格式
binlog_format = mixed
# 重启 MySQL 服务
# 让配置生效。
2、创建用于复制的用户
登录主服务器的 MySQL,创建一个专门用于从服务器连接和复制的用户。
sql
mysql -u root -p
-- 创建用户 ‘repl',并允许从 ‘192.168.1.11’ 登录,密码为 ‘SlavePass123!’
CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'SlavePass123!';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';
-- 刷新权限
FLUSH PRIVILEGES;
锁定数据库并获取主节点状态
为了防止数据发生变化,先锁定。
(
如果是innodb 可以不用锁定,通过 --single-transaction参数开启事务
参数说明:
--master-data=2:将 CHANGE MASTER TO 语句以注释形式包含在备份文件中
--master-data=1:将 CHANGE MASTER TO 语句以非注释形式包含(会自动执行)
--single-transaction:对 InnoDB 表使用事务保证一致性,避免锁表
--flush-logs:备份前刷新日志,创建新的 binlog 文件
mysqldump -u root -p db_name --master-data=2 --single-transaction --flush-logs > master_dump.sql
执行后,直接跳过以下3-4步骤进入第三分部
)
sql
-- 锁定表,禁止写操作
FLUSH TABLES WITH READ LOCK;
-- 查看主节点状态,记录下 File 和 Position 的值,从服务器配置时需要
SHOW MASTER STATUS;
输出会类似于:
text
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | db_name | |
+------------------+----------+--------------+------------------+
记下 File (mysql-bin.000001) 和 Position (107)。
3、 备份并导出数据
如果主服务器上已有数据,需要先导出一份给从服务器。
mysqldump -u root -p db_name > master_dump.sql
4、 数据导出后,即可解锁。
UNLOCK TABLES;
第三部分: 修改 Slave 配置
1、导入数据
将主服务器的备份文件拷贝到从服务器,并导入。
bash
# 在从服务器上执行
mysql -u root -p db_name < master_dump.sql
2、修改 MySQL 配置文件
编辑从服务器上的 my2.cnf
ini
[mysqld]
# 服务器唯一ID,必须与主服务器和其他从服务器不同
server-id = 2
# 可选:启用中继日志
relay-log = mysql-relay-bin
# 可选:允许从服务器将其重放的中继日志记录到自己的二进制日志中,用于链式复制
log_bin = mysql-bin
# 可选:指定需要复制的数据库
replicate_do_db = db_name
# 重启 MySQL 服务
# 让配置生效
3、 配置复制链路
登录从服务器的 MySQL,告诉它主服务器是谁,以及从哪里开始复制。
sql
mysql -u root -p
STOP SLAVE; -- 先停止 Slave 进程
CHANGE MASTER TO
MASTER_HOST='192.168.1.10', -- 主服务器 IP
MASTER_PORT=3306, -- 主服务器 端口
MASTER_USER='repl', -- 复制用户
MASTER_PASSWORD='SlavePass123!', -- 复制用户密码
MASTER_LOG_FILE='mysql-bin.000001', -- 第4步记录的 File 或者 使用 --single-transaction 备份的sql文件中头部有相关注释
MASTER_LOG_POS=107; -- 第4步记录的 Position 或者 使用 --single-transaction 备份的sql文件中头部有相关注释
4、 启动 Slave 进程
sql
START SLAVE;
-- 查看 Slave 状态
SHOW SLAVE STATUS\G
-- 验证复制
-- 在 SHOW SLAVE STATUS\G 的输出中,检查以下两个关键字段:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
-- 如果这两个值都是 Yes,说明复制正在正常运行。
第四部分 最终测试:
在主服务器的 your_database_name 中创建一个新表或插入一条新记录。
在从服务器上查询,检查变化是否已经同步过来。
其他复制拓扑
链式复制 (A -> B -> C):可以减轻主服务器的压力。
主主复制:两个服务器互为主从,都可以接受写操作。需要特别小心自增主键冲突等问题,配置更复杂。
多源复制:一个从服务器可以从多个主服务器复制数据。
注意事项
版本兼容性:主从服务器的 MySQL 大版本最好一致,从节点版本可以高于主节点,反之则不推荐。
网络:确保主从节点之间的网络通畅,防火墙开放了 MySQL 端口(默认3306)。
数据一致性:在设置复制前,确保主从服务器的初始数据是一致的。
监控:定期检查 SHOW SLAVE STATUS 来监控复制状态,处理可能出现的错误。
以上流程涵盖了搭建 MySQL 跨节点复制库的核心步骤。根据您的具体需求和环境,细节可能会略有不同。
Talk is cheap, show me the code.

浙公网安备 33010602011771号