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

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

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

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

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

推荐文章

浏览器自动播放策略
2024-11-19 08:54:41 +0800 CST
动态渐变背景
2024-11-19 01:49:50 +0800 CST
CSS 特效与资源推荐
2024-11-19 00:43:31 +0800 CST
使用Python实现邮件自动化
2024-11-18 20:18:14 +0800 CST
Vue3 组件间通信的多种方式
2024-11-19 02:57:47 +0800 CST
初学者的 Rust Web 开发指南
2024-11-18 10:51:35 +0800 CST
php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
如何实现虚拟滚动
2024-11-18 20:50:47 +0800 CST
FcDesigner:低代码表单设计平台
2024-11-19 03:50:18 +0800 CST
浅谈CSRF攻击
2024-11-18 09:45:14 +0800 CST
CentOS 镜像源配置
2024-11-18 11:28:06 +0800 CST
js迭代器
2024-11-19 07:49:47 +0800 CST
markdowns滚动事件
2024-11-19 10:07:32 +0800 CST
为什么要放弃UUID作为MySQL主键?
2024-11-18 23:33:07 +0800 CST
总结出30个代码前端代码规范
2024-11-19 07:59:43 +0800 CST
在Vue3中实现代码分割和懒加载
2024-11-17 06:18:00 +0800 CST
html文本加载动画
2024-11-19 06:24:21 +0800 CST
Redis和Memcached有什么区别?
2024-11-18 17:57:13 +0800 CST
在 Vue 3 中如何创建和使用插件?
2024-11-18 13:42:12 +0800 CST
Plyr.js 播放器介绍
2024-11-18 12:39:35 +0800 CST
pip安装到指定目录上
2024-11-17 16:17:25 +0800 CST
Elasticsearch 的索引操作
2024-11-19 03:41:41 +0800 CST
程序员茄子在线接单