数据库软件架构,到底要设计些什么?
副标题[/!--empirenews.page--]
一、基本概念 概念一:单库 概念二:分片 分片解决“数据量太大”这一问题,也就是通常说的“水平切分”。 一旦引入分片,势必面临“数据路由”的新问题,数据到底要访问哪个库。路由规则通常有3种方法: (1)范围:range
(2)哈希:hash
(3)统一路由服务:router-config-server
大部分互联网公司采用的方案二:哈希路由。 概念三:分组 分组解决“可用性,性能提升”这一问题,分组通常通过主从复制的方式实现。 互联网公司数据库实际软件架构是“既分片,又分组”: 数据库软件架构,究竟设计些什么呢,至少要考虑以下四点:
二、如何保证数据的可用性? 解决可用性问题的思路是:冗余。
数据的冗余,会带来一个副作用:一致性问题。 1. 如何保证数据库“读”高可用? 冗余读库。 2. 冗余读库带来什么副作用? 读写有延时,数据可能不一致。 上图是很多互联网公司mysql的架构,写仍然是单点,不能保证写高可用。 3. 如何保证数据库“写”高可用? 冗余写库。 采用双主互备的方式,可以冗余写库。 4. 冗余写库带来什么副作用? 双写同步,数据可能冲突(例如“自增id”同步冲突)。 如何解决同步冲突,有两种常见解决方案:
阿里云的RDS服务号称写高可用,是如何实现的呢? 他们采用的就是类似于“双主同步”的方式(不再有从库了)。 仍是双主,但只有一个主提供读写服务,另一个主是“shadow-master”,只用来保证高可用,平时不提供服务。 master挂了,shadow-master顶上,虚IP漂移,对业务层透明,不需要人工介入。 这种方式的好处:
不足是:
画外音:所以,高可用RDS还挺贵的。 三、如何扩展读性能? 提高读性能的方式大致有三种,第一种是增加索引。 这种方式不展开,要提到的一点是,不同的库可以建立不同的索引。 如上图:
第二种扩充读性能的方式是,增加从库。 这种方法大家用的比较多,存在两个缺点:
第三种增加系统读性能的方式是,增加缓存。 常见的缓存架构如下:
如果系统架构实施了服务化:
业务层不直接面向db和cache,服务层屏蔽了底层db、cache的复杂性。 不管采用主从的方式扩展读性能,还是缓存的方式扩展读性能,数据都要复制多份(主+从,db+cache),一定会引发一致性问题。 四、如何保证一致性? 主从数据库的一致性,通常有两种解决方案: (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |