一文带你读懂分库分表,分片,Sharding的许多概念
分库是将一个库拆分为多个库,分表就是将一个表拆分为多个表。分库分表有垂直拆分和水平拆分。垂直拆分一般是按照业务将表分到不同的库中(此种不在本发的讨论范围)。水平拆分是将表的数据拆分到多个表中(此种为本发明的研究对象)。当一个表存的数据太多时,可以将表的数据拆分到多个表中,这些拆分后的表可以在同一个数据库也可以不在同一个数据库,会有:只分表,只分库,和分库分表三种类型,如图1所示。图1所示的分库分表,就是将一个orders表拆分为4个表,orders0、orders1在库ds0, orders2、orders3在库ds1。其中orders0到orders3是实际表/物理表,而0、1、2、3是实际表的下标/后缀;而orders则为基本表(基本表名)。关联表(主表与从表),指存在主外键关系的主表与从表,按照一定的DB设计原则将数据存放到两张表中。如:orders,orders_item; users,users_item;它们一般都是有外键关系(未必使用外键约束)。此外,还有不需要分片的,只存在一个库中的表,为原始表/未分片表,因为并不是所有的表都是要分片的;广播表指所有的分片数据库中都存在的表(同一广播表,在每个节点都有一个,且数据也一样),表结构及其数据在每个数据库中均完全一致。 适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。分片键,即用来寻找到对应库和表的表中字段;分片键包括分库键和分表键。分库键,指表的字段中,使用其值,按一定算法找到唯一数据库的字段。如,orders订单表中,userid(用户id),可以作为分库键。分表键指表的字段中,使用其值,按一定算法找到唯一实际表的字段。比如orders订单表中,userid(用户id),可以作为分表键。数据节点为数据分片的最小单元,由数据源名称和实际表组成,如:ds1.orders1。完整的数据结点(fullNodes),指某一基本表所涉及的所有数据库和对应的实际表。数据源(ds)是指配置了数据库url,用户名,密码等信息的源,在Java中是指javax.sql.DataSource。数据源与数据库对应,在不引起混淆的情况下,可以将该两个名词视为同义词。路由到的库与表种类即分库分表种类或分片种类,根据分片键找到的库与表的个数,分为:一库一表、一库多表、多库多表、全库全表。分片指分库分表,并通过一定的方法找到或操作所要的数据。分片的框架或装置,要让使用者在有分片的情况下,操作的数据与未分片时,感觉是一样的;当然打印的日志,可以提示有哪个节点执行了什么操作。
Bee, 一个具有分片功能的ORM框架,简单易用,功能强大.
除了分片配置信息,分片对使用者透明,系统是否分片,对使用者来说无需增加过多额外成本,掌握配置规则即可使用。进行分片升级,对原有系统更改小,引用接口模块的接口不需要调整。分片时,执行的sql语句与未分片时对比,差别小。分片的sql语句,易于在数据库客户端工具中进行格式化。分片节点结构变动后,可以不转移旧的数据。
一个表的分片配置信息,只需要一行:
ShardingConfig.addShardingBean(Orders.class,new ShardingBean("ds[0..1].orders[0..3]", "orderid"));