9.1 分片规则概述
在数据切分处理中,特别是水平切分中,中间件最终要的两个处理过程就是数据的切分、数据的聚合。选择合适的切分规则,至关重要,因为它决定了后续数据聚合的难易程度,甚至可以避免跨库的数据聚合处理。
前面讲了数据切分中重要的几条原则,其中有几条是数据冗余,表分组(Table Group),这都是业务上规避跨库join的很好的方式,但不是所有的业务场景都适合这样的规则,因此本章将讲述如何选择合适的切分规则。
9.2 Mycat全局表
如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,只要在所有的分片上保存一份数据即可,Mycat 在Join操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,避免跨库Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。
目前Mycat没有做全局表的数据一致性检查,后续版本1.4之后可能会提供全局表一致性检查,检查每个分片的数据一致性。
全局表的配置如下
<table name="t_area" primaryKey="id" type="global" dataNode="dn1,dn2" />
9.3 ER分片表
有一类业务,例如订单(order)跟订单明细(order_detail),明细表会依赖于订单,也就是说会存在表的主从关系,这类似业务的切分可以抽象出合适的切分规则,比如根据用户ID切分,其他相关的表都依赖于用户ID,再或者根据订单ID切分,总之部分业务总会可以抽象出父子关系的表。这类表适用于ER分片表,子表的记录与所关联的父表记录存放在同一个数据分片上,避免数据Join跨库操作。
以order与order_detail例子为例,schema.xml中定义如下的分片配置,order,order_detail 根据order_id进行数据切分,保证相同order_id的数据分到同一个分片上,在进行数据插入操作时,Mycat会获取order所在的分片,然后将order_detail也插入到order所在的分片。
116
<table name="order" dataNode="dn$1-32" rule="mod-long"> <childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="order_id" /> </table>
9.4 多对多关联
有一类业务场景是 “主表A+关系表+主表B”,举例来说就是商户会员+订单+商户,对应这类业务,如何切分?
从会员的角度,如果需要查询会员购买的订单,那按照会员进行切分即可,但是如果要查询商户当天售出的订单,那又需要按照商户做切分,可是如果既要按照会员又要按照商户切分,几乎是无法实现,这类业务如何选择切分规则非常难。目前还暂时无法很好支持这种模式下的3个表之间的关联。目前总的原则是需要从业务角度来看,关系表更偏向哪个表,即“A的关系”还是“B的关系”,来决定关系表跟从那个方向存储,未来Mycat版本中将考虑将中间表进行双向复制,以实现从A-关系表 以及B-关系表的双向关联查询如下图所示:
9.4.1 主键分片vs 非主键分片
当你没人任何字段可以作为分片字段的时候,主键分片就是唯一选择,其优点是按照主键的查询最快,当采用自动增长的序列号作为主键时,还能比较均匀的将数据分片在不同的节点上。
若有某个合适的业务字段比较合适作为分片字段,则建议采用此业务字段分片,选择分片字段的条件如下:
117
尽可能的比较均匀分布数据到各个节点上;
该业务字段是最频繁的或者最重要的查询条件。
常见的除了主键之外的其他可能分片字段有“订单创建时间”、“店铺类别”或“所在省”等。当你找到某个合适的业务字段作为分片字段以后,不必纠结于“牺牲了按主键查询记录的性能”,因为在这种情况下,MyCAT提供了“主键到分片”的内存缓存机制,热点数据按照主键查询,丝毫不损失性能。 <table name="t_user" primaryKey="user_id" dataNode="dn$1-32" rule="mod-long"> <childTable name="t_user_detail" primaryKey="id" joinKey="user_id" parentKey="user_id" /> </table>
对于非主键分片的table,填写属性primaryKey,此时MyCAT会将你根据主键查询的SQL语句的第一次执行结果进行分析,确定该Table 的某个主键在什么分片上,并进行主键到分片ID的缓存。第二次或后续查询mycat会优先从缓存中查询是否有id–>node 即主键到分片的映射,如果有直接查询,通过此种方法提高了非主键分片的查询性能。
本节主要讲了如何去分片,如何选择合适分片的规则,总之尽量规避跨库Join是一条最重要的原则,下一节将介绍Mycat目前已有的分片规则,每种规则都有特定的场景,分析每种规则去选择合适的应用到项目中。
分享到:
相关推荐
《Mycat分片规则详解》 Mycat是一款开源的分布式数据库中间件,它能够实现数据的分片,提高数据库的处理能力。Mycat的分片规则是其核心功能之一,它允许用户根据业务需求自定义数据的分布方式。本文将深入探讨Mycat...
《Mycat分片规则与算法详解》 Mycat,作为一款开源的分布式数据库中间件,其核心功能之一就是实现数据的分片,以提高数据库的读写性能和存储能力。本文将深入探讨Mycat中的分片规则和算法,包括枚举法、固定分片...
《Mycat分片规则详解:哈希算法的应用》 Mycat,作为一个分布式数据库中间件,其核心功能之一就是实现数据的分片,以提高数据库的处理能力和扩展性。在Mycat中,分片规则是至关重要的,它决定了数据如何在多个...
《Mycat从入门到精通之分片规则、场景、策略》是一份全面介绍Mycat数据库中间件的教程资源,包含PPT讲义和相关的练习题,旨在帮助学习者深入理解和掌握Mycat的核心功能——数据分片。在大数据时代,面对海量的数据...
- **数据分片**:通过定义分片规则,Mycat能够自动将数据分配到不同的数据库中。 - **读写分离**:Mycat还支持读写分离,能够将读取请求和写入请求分开处理,进一步提高系统的性能。 - **事务支持**:尽管数据被分散...
总结来说,基于MYCAT实现数据库水平分片,涉及到的主要步骤包括:理解MYCAT的基本概念,设计合理的分片策略,部署MYCAT服务,配置分片规则,以及进行性能测试和故障恢复验证。这个过程需要结合业务需求,选择合适的...
- 需要对数据分布有一定的了解,以便合理设计分片规则。 - 既适用于表也适用于索引。 - 为分片忽略和性能提升提供了可能性。 - **多列表达式分片**: ```sql CREATE TABLE orders (order_num integer, year ...
**2.1 分片规则** 字符串枚举分片是指根据字符串类型的枚举值来进行数据分片的一种方法。与整型枚举分片类似,字符串枚举分片也是基于特定的枚举值来确定数据存储的位置。这种方式适用于记录数较少且相对固定的情形...
然后,可以在模型中指定分片规则: ```ruby class User establish_connection :shard_0 # 或者使用范围分片 # scope :on_shard_0, -> { with_shard(0) } # scope :on_shard_1, -> { with_shard(1) } end ``` ...
它接收客户端请求,根据分片规则将请求发送到正确的分片,并将结果返回给客户端。 - **配置服务器**:负责存储集群的元数据信息,包括分片状态、分片键定义等。通常配置服务器也是副本集的一部分,以确保高可用性。 ...
它提供了一套完整的配置和API接口,使得开发人员能够轻松地定义分片规则,无需复杂的数据库管理和额外的中间件。 1. **分片策略** - **范围分片**:根据数据的某个范围值(如时间戳)将数据分配到不同的分片。 - ...
Myproxy作为一个代理服务,位于应用程序与数据库集群之间,负责接收客户端请求,根据预设的分片规则将请求路由到合适的数据库节点,并将结果返回给客户端。这样,应用程序无需关心数据的分片细节,只需与Myproxy进行...
通过定义表的分片规则来实现分片,每个表可以绑定一个分片规则,每个分片规则指定一个分片字段并绑定一个函数来实现动态分配算法。 #### 部署过程 部署Mycat+MySQL集群的过程主要包括以下步骤: 1. **环境准备**...
rule.xml文件是Mycat的配置文件,用于定义数据的分片规则。下面是一个简单的rule.xml文件示例: ```xml <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <columns>id <algorithm>murmur ...
接下来,我们需要设计一个分片规则,用于决定如何根据分片键将数据分布到不同的表中。一个常见的方法是使用模数(取余)操作。例如,我们可以根据用户ID除以某个数字(如100)的余数来确定数据应该存储在哪个表中。...
首先,数据分片规则的设计需要充分考虑数据的特性和查询需求。不同的分片方式适用于不同的数据集和查询场景。因此,在实际应用中,我们需要根据具体业务需求和系统特点来选择合适的分片方式。 其次,节点动态变化时...
3. **灵活性**:该中间件允许开发者根据业务需求自定义分片策略,可以通过配置文件或编程方式灵活设定分片规则,适应不同的业务场景。 4. **事务管理**:对于跨库跨表的分布式事务,该中间件可能提供了支持,确保...
详细介绍mycat分片的相关分片规则,包括枚举法、固定分片hash算法、范围约定算法、求模法、日期列分区法、通配取模等
MyCAT会根据分片规则将请求路由到相应的分片服务器,存储或读取数据。在案例中,有三个数据库服务器(192.168.4.53, 192.168.4.54, 192.168.4.55),分别使用db1, db2, db3库,客户端(192.168.4.50)通过MyCAT服务...