文档章节

Laravel数据库读写分离配置

 零下一度wan
发布于 2017/01/18 22:55
字数 483
阅读 98
收藏 0

Laravel数据库读写分离配置

原文地址:http://blog.onlywan.cc/14847498744910.html

###配置范例

'mysql' => [
    'driver'   => 'mysql',  
    'write'    => [  
        'host' => '192.168.1.180',  
    ],  
    'read'     => [
        ['host' => '192.168.1.182'],  
        ['host' => '192.168.1.179'],  
    ],
    ...  
]

或

'mysql' => [
    'driver'   => 'mysql',  
    'write'    => [  
        'host' => '192.168.1.180',  
    ],  
    'read'     => [
        'host' => [
            '192.168.1.182',
            '192.168.1.179'
        ],  
    ],
    ...  
]

扩展配置范例

'mysql' => [
    'driver'   => 'mysql',  
    'write'    => [  
        'host'      => '192.168.1.180',  
        'username'  => 'write',
        'password'   => 'write',
    ],  
    'read'     => [
        [
            'host' => '192.168.1.182',
            'username'  => 'read1',
            'password'   => 'read1',
        ],  
        [
            'host' => '192.168.1.179',
            'username'  => 'read2',
            'password'   => 'read2',
        ],  
    ],
    ...  
]

或者

'mysql' => [
    'driver'   => 'mysql',  
    'write'    => [  
        'host'      => '192.168.1.180',  
        'username'  => 'write',
        'password'   => 'write',
    ],  
    'read'     => [
       'host' => [
           '192.168.1.179',
           '192.168.1.182',
       ],
       'username'  => 'read',
       'password'   => 'read', 
    ],
    ...  
]

公司数据库架构为一主多从,从库访问地址为唯一地址,该处方便负载均衡及扩展从库。所以最终线上采用的配置

'mysql' => [
    'driver'   => 'mysql',  
    'write'    => [  
        'host'      => '192.168.1.180',  
        'username'  => 'write',
        'password'   => 'write',
    ],  
    'read'     => [
       'host' => '192.168.1.179'
       'username'  => 'read',
       'password'   => 'read', 
    ],
    ...   
]

###代码分析 授人以鱼不如授人以渔,之所以配置如此灵活的原因,以及如何查找到这些配置方式。主要通过查找代码,分析代码;相关代码都在下面粘出,这里就不做解释了,代码能说明一切;

路径:vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php

代码:

class ConnectionFactory
{
    ...

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

        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);
    }
    
    ...
    
    /**
     * Get a read / write level configuration.
     *
     * @param  array   $config
     * @param  string  $type
     * @return array
     */
    protected function getReadWriteConfig(array $config, $type)
    {
        if (isset($config[$type][0])) {
            return $config[$type][array_rand($config[$type])];
        }

        return $config[$type];
    }
    
    ...
    
    /**
     * Merge a configuration for a read / write connection.
     *
     * @param  array  $config
     * @param  array  $merge
     * @return array
     */
    protected function mergeReadWriteConfig(array $config, array $merge)
    {
        return Arr::except(array_merge($config, $merge), ['read', 'write']);
    }
    
    ...
}
    
    
class Arr
{
   ...
   
   /**
    * Get all of the given array except for a specified array of items.
    *
    * @param  array  $array
    * @param  array|string  $keys
    * @return array
    */
   public static function except($array, $keys)
   {
       static::forget($array, $keys);
    
       return $array;
   }
   
   ...
   
   /**
    * Remove one or many array items from a given array using "dot" notation.
    *
    * @param  array  $array
    * @param  array|string  $keys
    * @return void
    */
   public static function forget(&$array, $keys)
   {
       $original = &$array;
    
       $keys = (array) $keys;
    
       if (count($keys) === 0) {
           return;
       }
    
       foreach ($keys as $key) {
           $parts = explode('.', $key);
    
           while (count($parts) > 1) {
               $part = array_shift($parts);
    
               if (isset($array[$part]) && is_array($array[$part])) {
                   $array = &$array[$part];
               } else {
                   $parts = [];
               }
           }
    
           unset($array[array_shift($parts)]);
    
           // clean up after each pass
           $array = &$original;
       }
   }
   
   ...
}

© 著作权归作者所有

零下一度wan

粉丝 0
博文 2
码字总数 803
作品 0
私信 提问
Laravel5.5 MySQL配置、读写分离及操作

Laravel 让连接不同数据库以及对数据库进行增删改查操作: 参考:http://laravelacademy.org/post/854.html 配置读写分离 应用的数据库配置位于 (但是数据库用户及密码等敏感信息位于 文件)...

MichaelShu
2018/07/21
254
0
laravel config database

database.php 注释翻译: 个人理解:数据库的默认链接。 注释翻译: 个人理解:数据库的默认链接。关于读写分离可以参考下面文章 作者:学院君 链接:http://laravelacademy.org/tags/读写分...

xiaobing1024
2017/12/13
0
0
Laravel 5 配置数据库主从读写分离和源码分析

一,配置过程: Laravel5读写分离配置比较简单,只需修改config/database.php,下面以MySQL数据库为例 内容如下 'mysql' => [ ] 设置完毕之后,Laravel5默认将select的语句让read指定的数据库...

李佳顺
2018/05/31
144
0
[扩展推荐] Laravel Tenancy —— 多站点架构方案

文章转发自专业的Laravel开发者社区,原始链接:learnku.com/laravel/t/1… Laravel Tenancy 是由 Daniël Klabbers、Paulo Trajano 和 Bertrand Kintanar 发布的扩展包,使你的 Laravel 应用...

Summer__
10/03
0
0
laravel 5.5,关于执行php artisan migrate抛出的Mysql权限错误

现在的问题是, 在navicat客户端中登录mysql-proxy进行任何操作正常 在laravel中执行任何sql语句都会报错 ------------------------------------------------------------------------------...

一冉再
2017/12/06
752
1

没有更多内容

加载失败,请刷新页面

加载更多

如何保证消息不被重复消费

如何保证消息不被重复消费?(如何保证消息消费的幂等性) 举个例子吧。假设你有个系统,消费一条消息就往数据库里插入一条数据,要是你一个消息重复两次,你不就插入了两条,这数据不就错了...

五彩的颜色
19分钟前
6
0
python3.7 django2.2 mysql 异常

错误日志 mysqlclient 1.3.13 or newer is required; File "/Users/huoyinghui/workspaces/drf3/lib/python3.7/site-packages/django/db/utils.py", line 201, in __getitem__ backend =......

hyhlinux
22分钟前
7
0
【2019年8月版】OCP 071认证考试原题-第34题

Choose two. Which two statements are true about the results of using the INTERSECT operator in compound queres? A) Reversing the order of the intersected tables can sometimes af......

oschina_5359
24分钟前
4
0
Dev 日志 | 一次 Segmentation Fault 和 GCC Illegal Instruction 编译问题排查

摘要 笔者最近在重新整理和编译 Nebula Graph 的第三方依赖,选出两个比较有意思的问题给大家分享一下。 Flex Segmentation Fault——Segmentation fault (core dumped) 在编译 Flex 过程中,...

NebulaGraph
24分钟前
6
0
在Windows中安装OpenCV-Python |四

目标 在本教程中 我们将学习在你的Windows系统中设置OpenCV-Python。 下面的步骤在装有Visual Studio 2010和Visual Studio 2012的Windows 7-64位计算机上进行了测试。屏幕截图展示的是VS201...

人工智能遇见磐创
25分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部