?其中Master负责写 *** 作的负载,也就是说一切写的 *** 作都在Master上进行,而读的 *** 作则分摊到Slave上进行。这样一来的可以大大提高读取的效率。在一般的互联网应用中,经过一些数据调查得出结论,读/写的比例大概在 10:1左右 ,也就是说大量的数据 *** 作是集中在读的 *** 作,这也就是为什么我们会有多个Slave的原因。但是为什么要分离读和写呢?熟悉DB的研发人员都知道,写 *** 作涉及到锁的问题,不管是行锁还是表锁还是块锁,都是比较降低系统执行效率的事情。我们这样的分离是把写 *** 作集中在一个节点上,而读 *** 作其其他的N个节点上进行,从另一个方面有效的提高了读的效率,保证了系统的高可用性。
本文实例分析了Yii实现MySQL多数据库和读写分离的方法。分享给大家供大家参考。具体分析如下: Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 20应用开发所需要的几乎一切功能,也是最强大的框架之一,下文我们来介绍Yii实现MySQL多库和读写分离的方法 前段时间为SNS产品做了架构设计,在程序框架方面做了不少相关的压力测试,最终选定了YiiFramework,至于为什么没选用公司内部的 PHP框架,其实理由很充分,公司的框架虽然是"前辈"们辛苦的积累,但毕竟不够成熟,没有大型项目的历练,犹如一个涉世未深的年轻小伙。Yii作为一个 颇有名气开源产品,必定有很多人在使用,意味着有一批人在维护,而且在这之前,我也使用Yii开发过大型项目,Yii的设计模式和它的易扩展特性足以堪当重任。 SNS同一般的社交产品不同的就是它最终要承受大并发和大数据量的考验,架构设计时就要考虑这些问题, web分布式、负载均衡、分布式文件存储、MySQL分布式或读写分离、NoSQL以及各种缓存,这些都是必不可少的应用方案,本文所讲的就是MySQL 分库和主从读写分离在Yii的配置和使用。 Yii默认是不支持读写分离的,我们可以利用Yii的事件驱动模式来实现MySQL的读写分离。 Yii提供了一个强大的CActiveRecord数据库 *** 作类,通过重写getDbConnection方法来实现数据库的切换,然后通过事件 beforeSave、beforeDelete、beforeFind 来实现读写服务器的切换,还需要两个配置文件dbconfig和modelconfig分别配置数据库主从服务器和model所对应的数据库名称,附代码 DBConfigphp文件如下: 复制代码 代码如下:<php return array( 'passport' => array( 'write' => array( 'class' => 'CDbConnection', 'connectionString' => 'mysql:host=101392;dbname=db1′, 'emulatePrepare' => true, //'enableParamLogging' => true, 'enableProfiling' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8′, 'schemaCachingDuration'=>3600, ), 'read' => array( array( 'class' => 'CDbConnection', 'connectionString' => 'mysql:host=101393;dbname=db1, 'emulatePrepare' => true, //'enableParamLogging' => true, 'enableProfiling' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8′, 'schemaCachingDuration'=>3600, ), array( 'class' => 'CDbConnection', 'connectionString' => 'mysql:host=101394;dbname=db3′, 'emulatePrepare' => true, //'enableParamLogging' => true, 'enableProfiling' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8′, 'schemaCachingDuration'=>3600, ), ), ), ); ModelConfigphp如下: 复制代码 代码如下:<php return array( //key为数据库名称,value为Model 'passport' => array('User','Post'), 'microblog' => array('…'), ); > ActiveRecordphp如下: 复制代码 代码如下:/ 基于CActiveRecord类的封装,实现多库和主从读写分离 所有Model都必须继承些类 / class ActiveRecord extends CActiveRecord { //model配置 public $modelConfig = ''; //数据库配置 public $dbConfig = ''; //定义一个多数据库集合 static $dataBase = array(); //当前数据库名称 public $dbName = ''; //定义库类型(读或写) public $dbType = 'read'; //'read' or 'write' / 在原有基础上添加了一个dbname参数 @param string $scenario Model的应用场景 @param string $dbname 数据库名称 / public function __construct($scenario='insert', $dbname = '') { if (!empty($dbname)) $this->dbName = $dbname; parent::__construct($scenario); } / 重写父类的getDbConnection方法 多库和主从都在这里切换 / public function getDbConnection() { //如果指定的数据库对象存在则直接返回 if (self::$dataBase[$this->dbName]!==null) return self::$dataBase[$this->dbName]; if ($this->dbName == 'db'){ self::$dataBase[$this->dbName] = Yii::app()->getDb(); }else{ $this->changeConn($this->dbType); } if(self::$dataBase[$this->dbName] instanceof CDbConnection){ self::$dataBase[$this->dbName]->setActive(true); return self::$dataBase[$this->dbName]; } else throw new CDbException(Yii::t('yii','Model requires a "db" CDbConnection application component')); } / 获取配置文件 @param unknown_type $type @param unknown_type $key / private function getConfig($type="modelConfig",$key="){ $config = Yii::app()->params[$type]; if($key) $config = $config[$key]; return $config; } / 获取数据库名称 / private function getDbName(){ if($this->dbName) return $this->dbName; $modelName = get_class($this->model()); $this->modelConfig = $this->getConfig('modelConfig'); //获取model所对应的数据库名 if($this->modelConfig)foreach($this->modelConfig as $key=>$val){ if(in_array($modelName,$val)){ $dbName = $key; break; } } return $dbName; } / 切换数据库连接 @param unknown_type $dbtype / protected function changeConn($dbtype = 'read'){ if($this->dbType == $dbtype && self::$dataBase[$this->dbName] !== null) return self::$dataBase[$this->dbName]; $this->dbName = $this->getDbName(); if(Yii::app()->getComponent($this->dbName'_'$dbtype) !== null){ self::$dataBase[$this->dbName] = Yii::app()->getComponent($this->dbName'_'$dbtype); return self::$dataBase[$this->dbName]; } $this->dbConfig = $this->getConfig('dbConfig',$this->dbName); //跟据类型取对应的配置(从库是随机值) if($dbtype == 'write'){ $config = $this->dbConfig[$dbtype]; }else{ $slavekey = array_rand($this->dbConfig[$dbtype]); $config = $this->dbConfig[$dbtype][$slavekey]; } //将数据库配置加到component中 if($dbComponent = Yii::createComponent($config)){ Yii::app()->setComponent($this->dbName'_'$dbtype,$dbComponent); self::$dataBase[$this->dbName] = Yii::app()->getComponent($this->dbName'_'$dbtype); $this->dbType = $dbtype; return self::$dataBase[$this->dbName]; } else throw new CDbException(Yii::t('yii','Model requires a "changeConn" CDbConnection application component')); } / 保存数据前选择 主 数据库 / protected function beforeSave(){ parent::beforeSave(); $this->changeConn('write'); return true; } / 删除数据前选择 主 数据库 / protected function beforeDelete(){ parent::beforeDelete(); $this->changeConn('write'); return true; } / 读取数据选择 从 数据库 / protected function beforeFind(){ parent::beforeFind(); $this->changeConn('read'); return true; } / 获取master库对象 / public function dbWrite(){ return $this->changeConn('write'); } / 获取slave库对象 / public function dbRead(){ return $this->changeConn('read'); } } 这是我写好的类,放在components文件夹里,然后所有的Model都继承ActiveRecord类就可以实现多库和主从读写分离了,至于如何支持原生的SQL也同时使用读写分离,此类都已经实现。 希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
数据库主从同步是指将一个数据库中的数据实时或定期地复制到另一个或多个数据库中的过程,以实现数据的冗余备份、读写分离和负载均衡等功能。通常,主数据库负责写 *** 作(INSERT、UPDATE、DELETE),而从数据库负责读 *** 作(SELECT),这样可以大大提高数据库的并发性能和可用性。
主从同步的原理是通过将主数据库的写 *** 作(binlog)复制到从数据库的relay log,然后从数据库再对relay log进行重放(replay)来实现。这个过程中,从数据库的数据会与主数据库的数据进行同步,并保持一致。同步方式通常有以下几种:
基于binlog的主从同步:主数据库将写 *** 作记录到binlog中,从数据库读取binlog并对其进行重放,从而实现数据同步。
基于GTID的主从同步:GTID是全局事务标识符,主数据库和从数据库都会分配一个唯一的GTID,以便在数据同步过程中进行数据一致性检查。
半同步复制:主数据库将写 *** 作记录到binlog中,从数据库接收到binlog后,向主数据库发送ACK确认消息,主数据库接收到ACK消息后才会认为写 *** 作已经成功完成。
并行复制:主数据库的写 *** 作可以被并行复制到多个从数据库,以提高同步效率和可用性。
主从同步通常用于大型分布式系统、互联网应用程序和在线事务处理(OLTP)系统中,以提高系统的可用性、扩展性和容错性。常见的主流数据库软件,如MySQL、PostgreSQL、Oracle等都支持主从同步功能。
如果回答不够完整,请指出!
希望能帮上忙
1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
3、如果以上两种都不能 *** 作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量大的表进行历史表分离(如交易流水表)
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
7、查看mysql执行日志,看看是否有其他方面的问题
个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑
1 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是实时的业务数据库,从数据库的作用和使用场合一般有几个:
一是作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作;
二是可在从数据库作备份、数据统计等工作,这样不影响主数据库的性能;
2 读写分离,是指读与写分别使用不同的数据库,当然一般是在不同服务器上的;在同一台服务器上的读写环境,估计只是用来测试吧。
一般读写的数据库环境配置为,一个写入的数据库,一个或多个读的数据库,各个数据库分别位于不同的服务器上,充分利用服务器性能和数据库性能;当然,其中会涉及到如何保证读写数据库的数据一致,这个就可以利用主从复制技术来完成。
一般应用场合为:业务吞吐量很大,读数据库(可简单理解为select语句的 比例和影响)的负载较大;
官方的mysql-proxy就是一个实现了读写分离、负载均衡等多个功能的软件。
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。都是解决方法。
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是实时的业务数据库
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL 自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。
对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQ L是开放源码软件,因此可以大大降低总体拥有成本。
以上就是关于MYSQL中的主从数据库什么意思能否详细解释一些,他主要用在什么地方,谢谢全部的内容,包括:MYSQL中的主从数据库什么意思能否详细解释一些,他主要用在什么地方,谢谢、分布式系统中应用程序怎么实现数据库读写分离、数据库主从同步原理+同步方式有哪些。分别用在哪些系统中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)