数据库分库/分表/读写分离

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

       为何要分库、分表、读写分?数据库

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

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

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

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

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

 
3
相关文章
相关标签/搜索