宝塔使用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 跨节点复制库的核心步骤。根据您的具体需求和环境,细节可能会略有不同。

 

posted @ 2025-11-06 14:06  cidgur  阅读(19)  评论(0)    收藏  举报