一. 为什么在分库分表的场景下需要扩容
需要为数据库集群考虑扩容的原因一般有如下两点:
1. 数据库所在服务器的磁盘空间不足。(当然也可以加磁盘)
2. 读写请求并发量超过了数据库集群能承载的极限。
二. 如何扩容
首次进行数据库规划时,尽可能地考虑极限情况。起初可能租用地服务器数量较少,但是我们可以在每一台服务器上部署尽可能多地数据库实例,这点是方便后期扩容的关键。
举个例子,比如刚开始我们只租用了4台服务器,但每台服务器上部署了8个数据库实例和32张数据表。
假如使用Mysql数据库,每台数据库服务器对外最大能承载的并发量为2000,4台服务器就是8000。
由于业务发展,用户量暴增,此时我们可以新增4台数据库服务器,每台旧服务器上分别分出4个库给新服务器。
(每次扩容按照倍数增加数据库服务器的数量)
这种做法的好处在于便于扩展,数据库迁移时不需要额外开发程序,只需要使用专门的工具即可(比如Navicat针对数据库的Restore backup,只是打个比方)。扩容后,整套数据库集群能够抗住8*2000=16000每秒的并发请求,每台数据库服务器的磁盘压力也随之减小了一半。
按照最初在一台服务器上部署8个库,每个库32张表,且尽量不拆表的前提下,极限情况可以部署32个数据库服务器,每台服务器部署1个数据库,每个库有32张表。可以承受约64000QPS,按照每张表500W条数据来算,总计可以存储约50亿条数据。
路由规则可以参考下方,目的在于尽可能地使请求更均匀的发送到每一台服务器的每一张表上:
数据库编号 = 唯一键 % 32
数据表编号 = (唯一键/32) % 32
三. 如何缩容
参考扩容,每次扩容时,使数据库服务器数量减半,同时迁移数据库即可。