laravel实现mysql读写分离(二)

这篇具有很好参考价值的文章主要介绍了laravel实现mysql读写分离(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现原理

Laravel5 读写分离主要有两个过程:
第一步,根据 database.php 配置,创建写库和读库的链接 connection
第二步,调用 select 时先判断使用读库还是写库,而 insert/update/delete 统一使用写库

主要文件:Illuminate/Database/Connectors/ConnectionFactory.php

1:判断 database.php 是否配置了读写分离数据库

/**
 * Establish a PDO connection based on the configuration.
 *
 * @param  array   $config
 * @param  string  $name
 * @return \Illuminate\Database\Connection
 */
public function make(array $config, $name = null)
{
    $config = $this->parseConfig($config, $name);
    // 如果配置了读写分离,则同时创建读库和写库的链接
    if (isset($config['read'])) {
        return $this->createReadWriteConnection($config);
    }
    // 如果没有配置,默认创建单个数据库链接
    return $this->createSingleConnection($config);
}

2:看看如何创建读库和写库的链接

/**
 * Create a single database connection instance.
 *
 * @param  array  $config
 * @return \Illuminate\Database\Connection
 */
protected function createReadWriteConnection(array $config)
{
    // 获取写库的配置信息,并创建链接
    $connection = $this->createSingleConnection($this->getWriteConfig($config));
    // 创建读库的链接
    return $connection->setReadPdo($this->createReadPdo($config));
}

3:多个读库如何选择

/**
 * Get the read configuration for a read / write connection.
 *
 * @param  array  $config
 * @return array
 */
protected function getReadConfig(array $config)
{
    $readConfig = $this->getReadWriteConfig($config, 'read');

    // 如果数组即多个读库,那么通过随机函数array_rand()挑一个,默认取第一个
    if (isset($readConfig['host']) && is_array($readConfig['host'])) {
        $readConfig['host'] = count($readConfig['host']) > 1
            ? $readConfig['host'][array_rand($readConfig['host'])]
            : $readConfig['host'][0];
    }
    return $this->mergeReadWriteConfig($config, $readConfig);
}

4:写库也是随机选择的

/**
 * Get a read / write level configuration.
 *
 * @param  array   $config
 * @param  string  $type
 * @return array
 */
protected function getReadWriteConfig(array $config, $type)
{

    // 如果多个,那么通过随机函数array_rand()挑一个
    if (isset($config[$type][0])) {
        return $config[$type][array_rand($config[$type])];
    }
    return $config[$type];
}

总结:
1:可以设置多个读库和多个写库,或者不同组合,比如一个写库两个读库
2:每次只创建一个读库链接和一个写库链接,从多个库中随机选择一个;文章来源地址https://www.toymoban.com/news/detail-438133.html

到了这里,关于laravel实现mysql读写分离(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql进阶2——prosysql实现mysql读写分离

    基本了解: 实现数据库读写分离的中间件很多,比如Mycat、Cobar、Atlas、TDDL、Proxysql等等。 ProxySQL 可以灵活配置路由规则,不仅可以实现最简单的读写分离,还可以将读/写都分散到多个不同的组,以及实现分库 sharding (分表sharding的规则比较难写,但也能实现)。 这种模式的读

    2024年02月15日
    浏览(38)
  • MariaDB MaxScale实现mysql8读写分离

    MaxScale 是干什么的? MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 MaxScale 实验环境 中间件 192.168.142.139 MaxScale 22.08.4 主服务器 192.168.142.146 mysql 8.0.30 从服务器 192.16

    2024年03月09日
    浏览(45)
  • spring多数据源动态切换的实现原理及读写分离的应用

    AbstractRoutingDataSource 是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能、可扩展性、灵活性。 多租户支持:对于多租户的应用,根据当前租户来选择其对应的数据源,实现租户级别的隔离和数据存储。 分库分表:为了

    2024年02月14日
    浏览(39)
  • 使用ProxySql实现Mysql的读写分离 详细安装步骤 亲测可行

    主机ip 说明 192.168.168.109 ProxySql 192.168.168.77 mysql master(主) 192.168.168.78 mysql slave(从)   在192.168.168.109机器上操作 在192.168.168.109机器上操作 报错 在192.168.168.109机器上操作 在192.168.168.109机器上操作 在192.168.168.109机器上操作 在192.168.168.109机器上操作 管理员登录 ProxySQL 前提也需

    2024年01月18日
    浏览(69)
  • 分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离 (三)

            本篇主要说明:                 1. 因为这个mysql版本是8.0,所以当其中一台mysql节点挂掉之后,主从同步,甚至双向数据同步都失效了,所以本篇主要记录下当其中的节点挂掉之后如何再次生效。 另外推荐大家使用mysql5.7的版本,这样当其他节点失效后就不

    2024年02月14日
    浏览(39)
  • 分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(二)

            说明:如果实现了docker部署mysql并完成主从复制的话再继续,本篇文章主要说明springboot配置实现Shardingjdbc进行读写分离操作。 如果没实现docker部署mysql实现主从架构的话点击我 application.yml配置设置连接池全局属性 shardingjdbc读写分离配置(qiyu-db-sharding.yaml) 同时这

    2024年02月15日
    浏览(41)
  • 基于k8s搭建mysql5.7主从集群实现读写分离

    一,准备工作 1,拥有一个运行中的k8s集群 2,拥有一个ceph分布式存储集群,此mysql集群基于ceph块存储,部署方案可参考我前面的rook部署ceph方案 二,集群搭建 1,创建存储类storageclass       将此 StorageClass 定义保存为 storageclass.yaml : 创建存储类   2,MySQL 部署包含一个 Con

    2024年02月08日
    浏览(42)
  • python 实现对MySQL 主从复制与读写分离 --2023博客之星候选--城市赛道

    在Python中,可以使用 pymysql 库来实现对MySQL主从复制和读写分离的代码封装。以下是一个简单的示例: 在上述示例中,创建了一个名为 MySQLReplication 的类,该类用于封装主从数据库连接和执行查询的功能。在类的初始化方法中,传入主数据库和从数据库的配置信息,并创建连

    2024年02月11日
    浏览(45)
  • Laravel 使用rdkafka_laravel详细教程(实操避坑)

    首先要看版本兼容问题,我的是Laravel5.6,PHP是7.3.13,所以需要下载兼容此的rdkafka,去 Packagist 搜索 kafka ,我用的是 enqueue/rdkafka选择里面0.10.5版本, 在 Laravel 项目中,通过 Composer 安装  enqueue/rdkafka  扩展包。在项目根目录下的  composer.json  文件中,添加以下依赖项: 也可

    2024年01月25日
    浏览(50)
  • 第100讲:MHA+Atlas实现MySQL主从复制读写分离分布式集群

    Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。 Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来

    2024年02月21日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包