.1)什么是数据库读写分离
简单的说就是把对数据库读和写的操作分开对应不同的数据库服务器(一般一个Master库,多个slave库),这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。
简而言之,数据库读写分离分为3个部分:
主数据库 处理事务性增、改、删操作(INSERT、UPDATE、DELETE)
从数据库 处理SELECT查询操作(多个从服务器可以采用负载均衡)
数据库复制 被用来把事务性操作导致的变更同步到集群中的从数据库。
.2)经典应用
读写分离目前应用于很多大型网站,如ebay,ebay用的是oracle,主从复制好像是Quest Share Plex(这个不确定,有兴趣的可以自己查找资料看看),我们来看看ebay的读写分离图,
从图我们可以看出,读写分离的控制实际在应用层面,其配置是在数据库层面。
(1)数据的实时性差:数据不是实时同步到只读服务器上的,当数据写入主服务器后,要在下次同步后才能查询到。
(2)数据量大时同步效率差:单表数据量过大时插入和更新因索引,磁盘IO等问题,性能会变的很差。
(3)同时连接多个(至少两个)数据库:至少要连接到两个数据数据库,实际的读写操作是在程序代码中完成的,容易引起混乱
(4)读具有高性能高可靠性和可伸缩:只读服务器,因为没有写操作,会大大减轻磁盘IO等性能问题,大大提高效率;只读服务器可以采用负载均衡,主数据库发布到多个只读服务器上实现读操作的可伸缩性。
注意点:
在进行写操作时,考虑到数据的唯一性,写数据的分配不能使用随机算法,一般采用哈希映射。举个例子,很多网站注册的时候已经注册的用户名不能重复注册,如果使用的是随机算法,用户A注册了用户名为zhangsan,写操作分配到主机A,用户B也注册了用户zhangsan,写操作分配到主机B,那么就很难控制数据的唯一性,建议采用哈希映射,比如说哈希规则为将请求为z的写操作统一分配给主机A,以避免此类情况的产生。
参考资料:
http://tech.it168.com/a2012/0110/1300/000001300144_2.shtml