★ 针对常见的互联网业务场景进行数据库架构设计总结
我们的系统会随着业务的膨胀而越发的复杂,数据基数也会越变得越来越大。
如何在数据变为巨量数据之后,依然保持强有力的稳定性和高效的性能,是系统架构的一个重要的目标,下面我们按照数据架构的演进来阐述变化过程。
一般是产品设计之初,或者试运行阶段。
最常见的架构设计如上:
历史数据访问频率比较低,可以放在独立的表或者库中。比如你的去年之前的朋友圈,当有需要的时候才回去翻阅。
但是最近一周内的朋友圈信息(无论是你的还是你朋友发的图文,都是热数据),为了性能,为了你的活跃数据的表更轻便一点,必然要做隔离。
架构如上:
多读少些的场景已经形成了,大量的读操作影响到写数据的性能和稳定性了,为了解决【数据库读写高并发】 的问题而设计。
当然可引入缓存、消息队列等中间件支撑,咱们这边不提。
如上,这是最常见的1主N从,读写分离的数据库模式:
它有如下特点:
典型sharding(水平拆分)方案。
水平拆分又分为库内分表和分库分表,来解决单表中数据量增长出现的压力,这些数据库中的表结构完全相同,我们这边按照分库分表来介绍。
架构如上:
水平分区的数据可以按照这5种策略隔离:
这种策略是通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如我们可以建立一个对表的日期的年份进行分区的策略,这样每个年份都会被聚集在一个区间。
PARTITION BY HASH(YEAR(createtime))
PARTITIONS 10
这种策略是将数据划分不同范围。例如我们可以将一个千万级别的表通过id划分成4个分区,每个分区大约250W的数据,超过750W后的数据统一放在第4个分区。
PARTITION BY RANGE(id) (
PARTITIONP0 VALUES LESS THAN(2500001),
PARTITIONP1 VALUES LESS THAN(5000001),
PARTITIONp2 VALUES LESS THAN(7500001),
PARTITIONp3 VALUES LESS THAN MAXVALUE
)
还有 Key(键值) 、List(预定义列表)、Composite(复合模式) ,请翻开我的这两篇文章:
《MySQL从零到有29:分库分表之Partition功能详解》