数据库的读写分离

转:http://www.cnblogs.com/qlee/archive/2011/04/08/2009738.htmlhtml

 

随着一个网站的业务不断扩展,数据不断增长,数据库的压力也会愈来愈大,对数据库或者SQL的基本优化可能达不到最终的效果,咱们能够采用读写分离的策 略来改变现状。读写分离如今被大量应用于不少大型网站,这个技术也不足为奇了。ebay就作得很是好。ebay用的是oracle,据说是用Quest Share Plex 来实现主从复制数据。mysql

     读写分离简单的说是把对数据库读和写的操做分开对应不一样的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操做,从数据库提 供读操做,其实在不少系统中,主要是读的操做。当主数据库进行写操做时,数据要同步到从的数据库,这样才能有效保证数据库完整性。Quest SharePlex就是比较牛的同步数据工具,据说比oracle自己的流复制还好,MySQL也有本身的同步数据技术。mysql只要是经过二进制日志来复制数据。经过日志在从数据库重复主数据库的操做达到复制数据目的。这个复制比较好的就是经过异步方法,把数据同步到从数据库。web

      主数据库同步到从数据库后,从数据库通常由多台数据库组成这样才能达到减轻压力的目的。读的操做怎么样分配到从数据库上?应该根据服务器的压力把读的操做分配到服务器,而不是简单的随机分配。mysql提供了MySQL-Proxy实现读写分离操做。不过MySQL-Proxy好像好久不更新了。oracle能够经过F5有效分配读从数据库的压力。sql

上面说的数据库同步复制,都是在从同一种数据库中,若是我要把oracle的数据同步到mysql中,其实要实现这种方案的理由很简单,mysql免费,oracle太贵。好像Quest SharePlex也实现不了改功能吧。好像如今市面尚未这个工具吧。那样应该怎么实现数据同步?其实咱们能够考虑本身开发一套同步数据组件,经过消息,实现异步复制数据。其实这个实现起来要考虑不少方面问题,高并发的问题,失败记录等。其实这种方法也能够同步数据到memcache中。据说oracle的Stream也能实现,不过没有试过。数据库

读写分离,基本的原理是让主数据库处理事务性增、改、删操做(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操做。数据库复制被用来把事务性操做致使的变动同步到集群中的从数据库。缓存

       为何要分库、分表、读写分?服务器

       单表的数据量限制,当单表数据量到必定条数以后数据库性能会显著降低。数据多了以后,对数据库的读、写就会不少。分库减小单台数据库的压力。接触过几个分库分表的系统,都是经过主键进行散列分裤分表的。这类数据比较特殊,主键就是惟一的获取该条信息的主要途径。好比:京东的订单、财付通的交易记录等。。。该类数据的用法,就是经过订单号、交易号来查询该笔订单、交易。并发

        还有一类数据,好比用户信息,每一个用户都有系统内部的一个userid,与userid对应的还有用户看到的登陆名。那么若是分库分表的时候单纯经过userid进行散列分库,那么根据登陆名来获取用户的信息,就没法知道该用户处于哪一个数据库中。oracle

       或许有朋友会说,咱们能够维护一个email----userid的映射关系,根据email先查询到userid,在根据userid的分库分表规则到对应库的对应表来获取用户的记录信息。这么作是能够的,可是这个映射关系的条数自己也是个瓶颈,原则上是没有减小单表内数据的条数,算是一个单点。而且要维护这个映射关系和用户信息的一致性(修改登陆名、多登陆名等其余特殊需求),最大一个缘由,其实用户信息是一个读大于写的库,web2.0都是以用户为中心,全部信息都和用户信息相关联,因此对用户信息拆分仍是有必定局限性的。异步

       对于这类读大于写而且数据量增长不是很明显的数据库,推荐采用读写分离+缓存的模式,试想一下一个用户注册、修改用户信息、记录用户登陆时间、记录用户登陆IP、修改登陆密码,这些是写操做。可是以上这些操做次数都是很小的,因此整个数据库的写压力是很小的。惟一一个比较大的就是记录用户登陆时间、记录用户登陆IP这类信息,只要把这些常常变更的信息排除在外,那么写操做能够忽略不计。因此读写分离首要解决的就是常常变化的数据的拆分,好比:用户登陆时间、记录用户登陆IP。这类信息能够单独独立出来,记录在持久化类的缓存中(可靠性要求并不高,登录时间、IP丢了就丢了,下次来了就又来了)

        以oracle为例,主库负责写数据、读数据。读库仅负责读数据。每次有写库操做,同步更新cache,每次读取先读cache在读DB。写库就一个,读库能够有多个,采用dataguard来负责主库和多个读库的数据同步。

0

相关文章
相关标签/搜索