编程 宝塔搭建 TP6 分布式数据库:主从同步、读写分离

2024-11-19 09:12:07 +0800 CST views 1042

本文介绍如何在宝塔环境下配置分布式数据库,实现 MySQL 主从同步与 TP6 框架的读写分离功能。

前提条件

  1. MySQL 版本一致。
  2. MySQL 中的数据一致。

主从服务器信息

  • 主服务器IP:192.168.16.135
  • 从服务器IP:192.168.16.137

在两台虚拟机中安装宝塔并关闭防火墙,确保两台服务器可以互相通信。

systemctl stop firewalld.service

1. 配置主服务器 MySQL

在主服务器上进行如下配置:

  1. 编辑 MySQL 配置文件 /etc/my.cnf,在 [mysqld] 属性组下添加以下内容:

    [mysqld]
    # [必须] 启用二进制日志
    log-bin=mysql-bin 
    # [必须] 服务器唯一ID,一般取IP最后一段
    server-id=135
    
  2. 重启 MySQL 服务,并进入 MySQL 命令行:

    sudo systemctl restart mysqld
    mysql -u root -p
    
  3. 创建用于主从同步的用户:

    -- 创建帐户 'slave',允许从任何IP访问
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
    -- 或者仅允许从特定IP访问
    -- GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.16.137' IDENTIFIED BY '123456';
    
  4. 查询主服务器状态以获取 FilePosition 信息:

    SHOW MASTER STATUS;
    

2. 配置从服务器 MySQL

在从服务器上进行如下配置:

  1. 编辑 MySQL 配置文件 /etc/my.cnf,在 [mysqld] 属性组下添加以下内容:

    [mysqld]
    # [可选] 启用二进制日志 
    log-bin=mysql-bin 
    # [必须] 服务器唯一ID,一般取IP最后一段
    server-id=137
    
  2. 重启 MySQL 服务,并进入 MySQL 命令行:

    sudo systemctl restart mysqld
    mysql -u root -p
    
  3. 配置从服务器同步主服务器的数据:

    CHANGE MASTER TO 
        MASTER_HOST='192.168.16.135',
        MASTER_USER='slave',
        MASTER_PASSWORD='123456',
        MASTER_LOG_FILE='mysql-bin.000019',
        MASTER_LOG_POS=3887;
    

    其中 MASTER_LOG_FILEMASTER_LOG_POS 是从主服务器的 SHOW MASTER STATUS 命令中获取的值。

  4. 启动从服务器复制功能并检查状态:

    START SLAVE;
    SHOW SLAVE STATUS\G;
    

    确认 Slave_IO_RunningSlave_SQL_Running 均为 Yes

3. TP6 配置分布式数据库

database.php 中配置主从数据库:

// 省略其他配置
'connections' => [
    'mysql' => [
        'type'            => 'mysql',
        // 主库配置
        'hostname'        => '192.168.16.135',
        'database'        => 'your_database',
        'username'        => 'your_username',
        'password'        => 'your_password',
        'hostport'        => '3306',
        // 读写分离配置
        'slave'           => [
            [
                'hostname' => '192.168.16.137',
                'database' => 'your_database',
                'username' => 'your_username',
                'password' => 'your_password',
                'hostport' => '3306',
            ],
        ],
        'read_master'     => true, // 开启自动主库读取
    ],
],

测试读写分离

使用以下代码测试 TP6 的读写分离功能:

public function add() {
    $data = [];
    for ($i = 0; $i < 5; $i++) {
        array_push($data, ['name' => 'name_' . ($i + 1)]);
    }
    $res = Db::name("student")->insertAll($data);  // 主库
    dump('插入成功条数: ' . $res);
}

public function list() {
    $res = Db::table('student')->where('id', '=', 1)->find();  // 从库
    dump($res);
    
    $row = Db::table('student')->where('id', '=', $res['id'])->update(['name' => 'name_4']);  // 主库
    echo $row;
    
    $res2 = Db::table('student')->where('id', '=', 1)->master(true)->find();  // 强制读取主库
    dump($res2);
}

通过配置和代码示例,可以看到读写操作分别使用了不同的服务器,实现了数据库的读写分离和主从同步。

复制全文 生成海报 数据库 分布式系统 开发

推荐文章

向满屏的 Import 语句说再见!
2024-11-18 12:20:51 +0800 CST
介绍Vue3的静态提升是什么?
2024-11-18 10:25:10 +0800 CST
12 个精选 MCP 网站推荐
2025-06-10 13:26:28 +0800 CST
随机分数html
2025-01-25 10:56:34 +0800 CST
智能视频墙
2025-02-22 11:21:29 +0800 CST
一个有趣的进度条
2024-11-19 09:56:04 +0800 CST
使用Vue 3实现无刷新数据加载
2024-11-18 17:48:20 +0800 CST
go命令行
2024-11-18 18:17:47 +0800 CST
如何优化网页的 SEO 架构
2024-11-18 14:32:08 +0800 CST
Linux 常用进程命令介绍
2024-11-19 05:06:44 +0800 CST
go错误处理
2024-11-18 18:17:38 +0800 CST
Vue3中的事件处理方式有何变化?
2024-11-17 17:10:29 +0800 CST
mysql int bigint 自增索引范围
2024-11-18 07:29:12 +0800 CST
开源AI反混淆JS代码:HumanifyJS
2024-11-19 02:30:40 +0800 CST
Rust async/await 异步运行时
2024-11-18 19:04:17 +0800 CST
Go 接口:从入门到精通
2024-11-18 07:10:00 +0800 CST
JavaScript设计模式:组合模式
2024-11-18 11:14:46 +0800 CST
前端代码规范 - Commit 提交规范
2024-11-18 10:18:08 +0800 CST
MySQL数据库的36条军规
2024-11-18 16:46:25 +0800 CST
如何配置获取微信支付参数
2024-11-19 08:10:41 +0800 CST
程序员茄子在线接单