zoukankan      html  css  js  c++  java
  • mysql实现读写分离

    一、环境介绍:
    LNMP

    vmware workstation pro配置了3个虚拟机,均安装了LNMP环境:

    Pro  :192.168.0.105        Pro2:192.168.0.106

    Pro3:192.168.0.107      

    二、Mysql主从复制同步的实现
    https://blog.csdn.net/m_nanle_xiaobudiu/article/details/81086243

    三、Mysql读写分离
    1、原理

    (1)让master数据库处理增删改操作(create、insert、delete,update)。

    (2)让slave数据库处理读操作(select)。

    注:mysql读写分离的前提是mysql主从复制,这样可以保证在master上修改数据,slave同步后,web应用可以读取到slave端的数据。

    2、实现方式

    Mysql读写分离可以基于第三方插件,也可以通过后端修改代码实现,具体实现读写分离的常见方式有四种

    注:由于插件方式性能较低,且每种插件都有其一定缺点,所以建议在后端做读写分离

    (1)Mysql-Proxy 读写分离

    (2)Amoeba 读写分离

    (3)Mycat 读写分离

    (4)基于程序读写分离(推荐)

    3、读写分离的实现

      

    <?php
    class Db
    {
        private $res;
        function __construct($sql)
        {
            $queryStr = strtolower(trim(substr($sql,0,6)));
            if ($queryStr == 'select') {
                //如果是查询操作(select),则连接从数据库(slave)
                $res = $this->slave_select($sql);
                $this->res = $res;
            } else {
                //如果是增删改操作(create、insert、delete,update),则连接主数据库(master)
                $res=$this->master_excute($sql);
                $this->res = $res;
            }
     
        }
     
        /**
         * slave从库返回sql查询结果
         * @param $sql
         * @return array
         */
        private function slave_select($sql)
        {
            //该处只是随机获取slave节点的ip,当然,还可以采用其他算法获取slave_ip
            $slave_server = $this->get_slave_ip();
            $dsn = "mysql:host=$slave_server;dbname=test";
            $user = 'root';
            $pass = '123456';
            $pdo = new PDO($dsn, $user, $pass);
            return $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
        }
     
        /**
         * master主库返回sql执行结果
         * @param $sql
         * @return int
         */
        private function master_excute($sql)
        {
            $master_server = '192.168.0.102';
            $dsn = "mysql:host=$master_server;dbname=test";
            $user = 'root';
            $pass = '123456';
            $pdo = new PDO($dsn, $user, $pass);
            return $pdo->exec($sql);
        }
     
        /**
         * 随机获取slave-ip
         * @return mixed
         */
        private function get_slave_ip()
        {
            $slave_ips = ['192.168.0.104','192.168.0.105','192.168.0.106','192.168.0.107','192.168.0.108'];
            $count = count($slave_ips)-1;
            $random_key = mt_rand(0,$count);
            return $slave_ips[$random_key];
        }
     
        /**
         * 获取结果
         * @return int
         */
        public function get_res()
        {
            return $this->res;
        }
     
     
    }
     
    

      

  • 相关阅读:
    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析
    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析
    PAT 1152 Google Recruitment
    PAT 1092 To Buy or Not to Buy
    PAT 1081 Rational Sum
    PAT 1084 Broken Keyboard
    PAT 1077 Kuchiguse
    PAT 1073 Scientific Notation
  • 原文地址:https://www.cnblogs.com/flzs/p/14855535.html
Copyright © 2011-2022 走看看