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

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

本文介绍如何在宝塔环境下配置分布式数据库,实现 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);
}

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

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

推荐文章

PostgreSQL日常运维命令总结分享
2024-11-18 06:58:22 +0800 CST
MySQL 日志详解
2024-11-19 02:17:30 +0800 CST
php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
IP地址获取函数
2024-11-19 00:03:29 +0800 CST
html流光登陆页面
2024-11-18 15:36:18 +0800 CST
Web浏览器的定时器问题思考
2024-11-18 22:19:55 +0800 CST
利用Python构建语音助手
2024-11-19 04:24:50 +0800 CST
在JavaScript中实现队列
2024-11-19 01:38:36 +0800 CST
php获取当前域名
2024-11-18 00:12:48 +0800 CST
Mysql允许外网访问详细流程
2024-11-17 05:03:26 +0800 CST
使用Rust进行跨平台GUI开发
2024-11-18 20:51:20 +0800 CST
PHP 压缩包脚本功能说明
2024-11-19 03:35:29 +0800 CST
7种Go语言生成唯一ID的实用方法
2024-11-19 05:22:50 +0800 CST
Go 1.23 中的新包:unique
2024-11-18 12:32:57 +0800 CST
Vue3中如何处理跨域请求?
2024-11-19 08:43:14 +0800 CST
Rust 与 sqlx:数据库迁移实战指南
2024-11-19 02:38:49 +0800 CST
html文本加载动画
2024-11-19 06:24:21 +0800 CST
php curl并发代码
2024-11-18 01:45:03 +0800 CST
程序员茄子在线接单