1.分库分表策略
1.1.垂直分库
按照业务进行分库,将不同的业务数据存储在不同的库中,提高数据库安全性、降低风险,同时还可以根据业务需求进行不同库的读写操作。
1.2.水平分库
按照某个字段(如用户ID、订单ID等)对数据进行水平划分,将相同字段值的数据放到同一个库中,可以减轻单个库的压力,提高数据库性能。
1.3.垂直分表
将一张大表按照字段进行拆分,将不同字段的数据存储在不同的表中,提高数据库读写性能,同时可以减少单个表的数据量,避免表的过度膨胀。
1.4.水平分表
将一张大表按照某个字段(如用户ID、订单ID等)进行水平拆分,将相同字段值的数据存储在同一张表中,可以提高数据库性能,减轻单个表的负载。
2.支持分库分表的中间件
通过中间件实现分库分表,下面是支持分库分表的中间件:
2.1.ShardingSphere
ShardingSphere是一个开源的分布式数据库中间件,提供了分片(分库分表)、读写分离、数据加密等功能,支持主流的关系型数据库,如MySQL、Oracle、SQLServer、PostgreSQL等。ShardingSphere提供了两个版本,一个是Sharding-JDBC,专注于JDBC层的分片,另一个是Sharding-Proxy,提供透明化的数据库代理服务,可以在无需修改任何应用程序代码的情况下,实现数据分片。
2.2.MyCAT
MyCAT是一款开源的高性能分布式数据库系统,支持MySQL。它提供了完善的分库分表解决方案,支持水平拆分和垂直拆分,支持数据分片和数据路由等功能。
2.3.Vitess
Vitess是一个开源的分布式数据库中间件,最初由Youtube开发。它为大规模互联网公司提供了一个高可用、可扩展、易于维护的关系型数据库解决方案。Vitess使用Sharding来分割表格数据并将其存储在不同的节点上,从而实现了分布式数据库的功能。它支持多种数据库作为后端存储,包括MySQL、PostgreSQL和CockroachDB。Vitess提供了很多功能,如自动垂直拆分、负载均衡、自动故障恢复、在线扩容等。
3.手动实现分库分表
除了使用中间件,也可以自己写代码根据自定义的分库分表策略,路由SQL读写请求到不同的数据库。
3.1.简单的水平分库例子
例如存在一个订单表order,想把订单数据根据订单ID(order_id),把订单数据分散到db1、db2、db3、db4 4个数据库。
分库规则如下:
- order_id % 4 = 0 的订单存储在db1中。
- order_id % 4 = 1 的订单存储在db2中。
- order_id % 4 = 2 的订单存储在db3中。
- order_id % 4 = 3 的订单存储在db4中。
关于订单表的读写,必须携带order_id,然后根据order_id的分库规则计算使用那个数据库。不同的业务场景根据实际情况会选择不同的分库分别规则,这里根据求余的方式计算目标库,只是一个简单的例子。
提示:实际业务订单id不会是数据库自增id,通常是通过雪花算法之类的id生成算法生成。