国产分布式数据库排名,数据库的发展简史( 二 )


$this->config['deploy']表示的就是'DB_DEPLOY_TYPE'这个配置选项 , 上面的配置在使用之前都已经经过解析了 , 配置项都在$this->config数组中 。至于是如何解析配置文件的 , 这里我们不做介绍 , 感兴趣的可以参考Think\Db类 。
$this->multiConnect()函数就是用来进行分布式连接的 , 如果'DB_DEPLOY_TYPE'选项设置为1 , 该函数就会执行 。否则直接执行$this->connect()函数 。
'DB_RW_SEPARATE'=>true
true 表示读写分离;false表示读写不分离 。
这里需要注意的是 , 读写分离是以主从式数据库系统为前提的 。该选项设置为true的时候主数据库写 , 从数据库读 。if($this->config['rw_separate']){// 主从式采用读写分离if($master)// 主服务器写入$r =$m;else{if(is_numeric($this->config['slave_no'])) {// 指定服务器读$r = $this->config['slave_no'];}else{// 读操作连接从服务器$r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1));// 每次随机连接的数据库}}}else{// 读写操作不区分服务器$r = floor(mt_rand(0,count($_config['hostname'])-1));// 每次随机连接的数据库}
$this->config['rw_separate'] 为true的时候采用读写分离 , 为false的时候读写不分离 。读写分离为什么必须是主从式的呢?因为从服务器不能写只能读 , 如果向从服务器写入数据的话 , 数据是没法同步的 。这样就会造成数据不一致的情况 。所以说 , 如果我们的系统是主从式的话 , 我们必须采用读写分离 。也就是说DB_RW_SEPARATE选项必须配置为true 。
'DB_MASTER_NUM'=>1
该选项后面的数字表示读写分离后 , 主服务器的数量 。因此该选项也是用于主从式数据库系统 。
下面的代码是选择主服务器 。$m = floor(mt_rand(0,$this->config['master_num']-1));
主从式数据库读取的时候选择从服务器读的核心代码
复制代码 代码如下:$r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1));// 每次随机连接的数据库
其中$this->config['master_num']表示主服务器的数量 。
'DB_SLAVE_NO'=> ''
指定从服务器的序号 , 用于读取数据 。如果不设置 , 则根据主服务器的数量计算书从服务器的数量 , 然后从中随机选取一台进行读取 。if(is_numeric($this->config['slave_no'])) {// 指定服务器读$r = $this->config['slave_no'];}else{// 读操作连接从服务器$r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1));// 每次随机连接的数据库}
以上是对每个选项的作用的实现代码进行了一个简单的说明 。
下面我们来看其连接的部分if($m != $r ){$db_master = array('username' => isset($_config['username'][$m])?$_config['username'][$m]:$_config['username'][0],'password' => isset($_config['password'][$m])?$_config['password'][$m]:$_config['password'][0],'hostname' => isset($_config['hostname'][$m])?$_config['hostname'][$m]:$_config['hostname'][0],'hostport' => isset($_config['hostport'][$m])?$_config['hostport'][$m]:$_config['hostport'][0],'database' => isset($_config['database'][$m])?$_config['database'][$m]:$_config['database'][0],'dsn' => isset($_config['dsn'][$m])?$_config['dsn'][$m]:$_config['dsn'][0],'charset' => isset($_config['charset'][$m])?$_config['charset'][$m]:$_config['charset'][0],);}$db_config = array('username' => isset($_config['username'][$r])?$_config['username'][$r]:$_config['username'][0],'password' => isset($_config['password'][$r])?$_config['password'][$r]:$_config['password'][0],'hostname' => isset($_config['hostname'][$r])?$_config['hostname'][$r]:$_config['hostname'][0],'hostport' => isset($_config['hostport'][$r])?$_config['hostport'][$r]:$_config['hostport'][0],'database' => isset($_config['database'][$r])?$_config['database'][$r]:$_config['database'][0],'dsn' => isset($_config['dsn'][$r])?$_config['dsn'][$r]:$_config['dsn'][0],'charset'=> isset($_config['charset'][$r])?$_config['charset'][$r]:$_config['charset'][0],);return $this->connect($db_config,$r,$r == $m ? false : $db_master);