分库分表的一般做法
一般会使用三种算法:
- 哈希分库分表:根据分库分表键算出一个哈希值,根据这个哈希值选择一个数据库。最常见的就是数字类型的字段作为分库分表键,然后取余。比如在订单表里,可以按照买家的ID除以8的余数进行分表
- 范围分库分表:将某个数据按照范围大小进行分段。比如说根据ID,
[0,1000)
在一张表,[1000,2000)
在另外一张表。最常见的应该是按照日期进行分库分表,比如每个月一张表 - 中间表:引入一个中间表来记录数据所在的目标表。一般是记录主键到目标表的映射关系。
这三者并不互斥,也就是说可以考虑使用哈希分库分表,同时引入一个中间表;也可以先进行范围分库分表,再引入一个中间表。
分库分表中间件的形态
- SDK形态:通过依赖的形式引入代码里,比如Java的依赖ShardingSphere
Proxy形态:独立部署的分库分表中间件,对于所有的业务方来说,就像一个普通的数据库,业务方的查询发送过去后,就会执行分库分表,发起实际的查询,再把查询结果返回给业务方。ShardingSphere也支持这种形态。
Sidecar形态:提供了一个分库分表的Sidecar,但是现在并没有非常成熟的产品
Sidecar是一种分库分表中间件的形态。它是一个理论上的概念,指的是一个独立的组件,为应用程序提供分库分表的功能。在这种形态下,Sidecar作为应用程序的伴随服务运行,类似于服务网格中的Sidecar容器,它与应用程序实例部署在一起,但作为独立的进程运行。
其中,SDK形态的性能最好,但是和语言强耦合。
Proxy形态性能最差,因为所有的数据库查询都发送给它了,很容易成功性能瓶颈。尤其单机部署Proxy的话,还面临着单节点故障的问题。优点是跟编程语言无关,部署一个Proxy之后可以给使用不同编程语言的业务使用。同时,业务方可以轻易地从单库单表切换到分库分表。