专栏首页程序媛生涯TP6怎么对接分布式数据库

TP6怎么对接分布式数据库

在一些大型应用中,一般会使用到分布式数据库。那么,TP6又是怎么对接分布式数据库的呢?想要对接分布式数据库,就要配置相应的参数【deploy】来开启分布式数据库,具体示例如下:

return [
    'default'    =>    'mysql',
    'connections'    =>    [
        'mysql'    =>    [
            // 启用分布式数据库
            'deploy'    =>  1,
            // 数据库类型
            'type'        => 'mysql',
            // 服务器地址 hostname的个数决定了分布式数据库的数量,
            // 默认情况下第一个地址就是主服务器
            'hostname'    => '192.168.1.1,192.168.1.2',
            // 数据库名
            'database'    => 'demo',
            // 数据库用户名
            'username'    => 'root',
            // 数据库密码
            'password'    => '',
            // 数据库连接端口
            'hostport'    => '',
        ],
    ],
];

开启了分布式数据库之后,我们开始修改参数,比如:username,password,hostport,database,dsn,charset等。

关于参数,如果主从服务器的上述参数一致的话,只需要设置一个。如果参数不同,则分别设置,分别设置时支持使用数组定义,示例如下:

return [
    'default'    =>    'mysql',
    'connections'    =>    [
        'mysql'    =>    [
            // 启用分布式数据库
            'deploy'   => 1,
            // 数据库类型
            'type'     => 'mysql',
            // 服务器地址 数组定义法
            'hostname' =>[ '192.168.1.1','192.168.1.2','192.168.1.3','192.168.1.4'],
            // 数据库名
            'database' => 'demo',
            // 数据库用户名
            'username' => 'root,slave,slave,slave',
            // 数据库密码
            'password' => '123456',
            // 数据库连接端口
            'hostport' => '',
            // 数据库字符集
            'charset'  => 'utf8',
        ],
    ],
];

一般情况下,对接分布式数据库的同时,也会开启读写分离,但TP6默认是不开启读写分离的。如果我们需要开启读写分离,就要加一个参数,示例如下:

// 开启读写分离
'rw_separate' => true,

在读写分离的情况下,默认第一个数据库配置是主服务器的配置信息,负责写入数据,也叫写操作。如果我们需要多个主数据库用来写入数据,可以通过以下参数设置。设置之后,会随机连接主数据库,示例如下:

// 设置3个主服务器
'master_num' => 2,

根据上面所示的参数,我们设置了2个主数据库,剩余的都是从数据库,负责读取数据,也叫读操作。如果我们不需要那么多从数据库进行读操作,可以通过以下方式设置,示例代码如下:

// slave_no指定的序号表示hostname中数据库地址的序号,从0开始
'slave_no' => 3,

设置完毕后,我们开始读写数据。在读写操作的过程中,调用查询类或者模型的【CURD】操作,系统会自动判断当前执行的方法是读操作还是写操作,并且会自动连接主数据库和从数据库。

但如果我们用的是原生SQL,那么就需要注意这些规则:写操作必须用数据库的【execute】方法,读操作必须用数据库的【query】方法,否则会发生主从读写错乱的情况。

有一种常见的场景,当我们在大数据量或者特殊的情况下写入数据时,可能会存在同步延迟的情况。这时候,我们可以调用master()方法进行主库查询操作,查看数据是否已经写入,示例代码如下:

Db::name('user')
    ->where('id', 1)
    ->update(['name' => 'thinkphp']);
Db::name('user')
    ->master(true)
    ->find(1);

如果从数据库同步数据太慢,我们可以设置一直通过主库来读取数据,参数设置如下:

// 开启自动主库读取
'read_master' => true,

以上便是TP6对接分布式数据库的过程。分布式数据库是应对大流量应用的一种常用措施,在该应用中比较常见。

本文分享自微信公众号 - 程序媛生涯(bcffl1024),作者:叶匠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何使用TP6连接数据库

    在TP6这个版本中,数据库和模型的操作已经独立到了一个【ThinkORM】库,这个库是默认就有的,也可以卸载。那么,TP6怎么通过这个库来连接数据库呢?

    邂逅千寻
  • H5入门之网页简介和超链接

    我们几乎每天都在浏览网页,那么,网页是怎么做出来的呢?其实,网页一般是由HTML,CSS和JavaScript(简称js)组成的。

    邂逅千寻
  • TP6的控制器是怎么操作的?

    TP6的控制器文件是类文件,所以控制器文件命名规范就跟类文件的一样。控制器文件默认放在【controller】目录下面,如果需要修改目录,可以在【config】...

    邂逅千寻
  • 首届鹅厂DB吐槽大会,约你来战

    导语 | 使用数据库的过程中,总有那么些问题不吐不快?成本高、灾备不好做、运维耗时耗力、半天找不到故障原因?那这边建议您体验云数据库,打开新的“槽点世界”~ ...

    腾讯云数据库 TencentDB
  • 书目和数据库的世界纪录

    写过图书馆和书籍的世界纪录以后,今天还有最后一部分。 与信息处理技术有关的世界纪录。 (图片说明:装置艺术,为一本书通电。) 1. 最早的图书分类法 以前,图书...

    ruanyf
  • 从运维角度浅谈MySQL数据库优化,中小企业DBA必会

    一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。

    数据和云01
  • 从运维角度浅谈MySQL数据库优化,中小企业DBA必会

    一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。

    数据和云
  • Python接口测试之对MySQL的操作(六)

    本文章主要来说python对mysql数据库的基本操作,当然,前提是已经搭建了python环境和搭建了Mysql数据库的环境,python操作m...

    无涯WuYa
  • 奖学金评比系统(数据库系统设计版)

    在奖学金评比过程中,学生综合测评是学校普遍采用的评比手段。对学生实施综合素质测评的目的在于正确评价学生的综合素质,为评奖学金提供依据,实现学生教育管理工作的标准...

    用户1621453
  • 2019年6月数据库流行度排行榜出炉

    DB-Engines 的 2019年6月号数据库流行度排行榜出炉,用八个字概括就是:风气云涌与波澜不惊。

    数据和云01

扫码关注云+社区

领取腾讯云代金券