数据库中间件分片的一些思考
这是学习笔记的第 1917 篇文章
今天对一套集群环境进行了分布式改造,通过分片规则对原来的大表进行了多粒度的拆分。
对此我整理了如下的简单的图表:
其实对分片的规则设置,基本就是两种思路来拆分,一种是基于数据库,一种是基于表。
为了进一步的表述,我们先对表的情况做一下梳理,目前的环境中存在的表有两类,一类是固定表,即表的数据量是相对稳定的,数据操作是覆盖型写入的,这类表随着业务的增长会有用户量的提升,比如从2000万用户增长到3000万,但是相对来说增长幅度不大,从改造为分布式方案的思路来说,就是基于表的粒度来拆分的,比如把一张表拆分为40份,在分布式架构中很可能就需要配置40个数据库来对应,扩展力度上相对有限,比如一个表有4亿,拆分为400份,单表的数据量是在100万,如果是4个物理分片节点,那么每个节点对应100个数据库。
另外一类是具有时间属性的,目前的主要是年,季,月,周,日这几类时间维度的表,其中日表是最为常见的,也是目前在分布式改造中使用频率最高的。它的扩展能力是极强的,比如一个日表的划分,每天一个日表,拆分成16份,那么一年下来累计是16*365=5840张表,几乎没有满足不了的场景了。
同时在表名的设计上也有一定的技巧,
对于固定表来说,相对简单,比如:
ü dbo_test_score
ü dbo_test_credit
对于周期表来说,有一些策略和命名规则,比如:
ü tda_test_20190321 --日
ü tma_test_201903 --月
ü twa_test_201901 --周
ü tya_test_2019 --年
ü tqa_test_201901 --季度
按照目前的配置策略,原来的方式表里会有近万张表,而现在的方式只有几十张,全年也就400张左右:
+---------------------+
| Tables in testdb |
+---------------------+
| dbo_grw_test_credit |
| dbo_grw_testscore |
| dbo_grw_testcount |
| dbo_grw_testtime |
| dbo_grw_score |
| tda_grw_20190313 |
| tda_grw_20190314 |
| tda_grw_20190315 |
| tda_grw_20190316 |
| tda_grw_20190317 |
| tda_grw_20190318 |
| tda_grw_20190319 |
| tda_grw_20190320 |
| tma_grw_201903 |
| tma_grw_201904 |
| tqa_grw_201901 |
| tqa_grw_201902 |
| tqa_grw_201903 |
| tqa_grw_201904 |
| twa_grw_201901 |
| twa_grw_201902 |
| twa_grw_201903 |
| twa_grw_201904 |
| twa_grw_201905 |
| tya_grw_2019 |
+---------------------+
25 rows in set (0.00 sec)