02-mycat常用分片规则

目录

一:范围约定分片规则【auto-sharding-long】

二:一致性hash分片规则【sharding-by-murmur】

三:枚举分片规则【sharding-by-intfile】

四:取模分片规则【mode-long】



mycat常用分片规则
一:范围约定分片规则【auto-sharding-long】:字段(项)为数字类型(int)
如0-500W分到分片库1,500W-1000W分到分片库2....

二:一致性hash分片规则【sharding-by-murmur】与mycat子表
1、一致性hash:murmur算法是将字段进行hash后分发到不同的数据库,字段类型支持int和varchar

2、子表的概念:就是把order_item作为订单的子表,保证一条记录的order和order_item在一个分片库上,这样在查询的时候就不用跨库关联查询,在自己的分片库就完成操作了。分片规则是以order主表的id进行分片,如默认分片规则:auto_sharding_long,0-500万、500万-1000万....

3、需要分片的表:orders、order_items、order_status

**在配置分片规则之前,我们要考虑一下,咱们的订单要以那个订单作为分片项,有的人说我们直接用订单的id作为分片项(用范围约定:auto-sharding-long分片规则),但是他合不合理呢?

选择订单id分片

选择订单id分片有什么现象:比如用户A买了一次东西生成了一个订单,这个订单产生了一个订单号、订单id,根据这个订单id进行分片,比如说它分片到dn161这个节点上,但是过了几天后,用户A又下了一个订单,这个时候又产生了一个订单号、订单id,那么根据分片规则它有可能分片到dn132这个节点上,那么就是说一个用户所产生的订单可能坐落在所有的分片上,这个就是做订单id做分片的结果。

有这样一个功能:点击我的订单的时候是不是查询当前的这个用户所有的订单。

那这个时候数据源使用mycat,向mycat发出了这样的一个请求:说我要查询我这个用户的所有订单,查询条件就是orderid=xx,那mycat它会怎么做呢。mycat要在所有的节点上执行这条sql语句,然后把所有的结果集汇拢在一起再返回给服务端,这样很耗性能,节点越多损耗的性能就越多。

范围约定分片规则【auto-sharding-long】:字段(项)为数字类型(int)。

在autopartition-long.txt文件中编写分片规则,根据指定的列的范围进行分片,默认从0节点开始,方法适用于总数可知的分片场景,但是扩展比较麻烦,短时间大量顺序插入会造成单个节点压力过大。

选择用户id分片

选择用户id进行分片又是什么样的现象?那么是不是只要是一个人的(因为用户的id是确定的)订单坐落在一个确定的节点上;比如用户A使用我的用户id进行分片,有可能坐落在dn131上,那以后这个用户所有的订单都会坐落在dn131上。

这个时候我们开发我的订单列表的时候是不是mycat的效率就比较高了(因为数据在同一个节点不需跨库查询),查询我的订单肯定要有一个where条件:user_id=xxx,mycat拿到这条语句的时候呢根据这个userid就能够知道它确定的数据节点把用户A的订单信息全部找出来。这个订单的其它信息:order_item、order_status是订单的子表也一同全都找出来了。

一致性hash分片规则:sharding-by-murmur分片规则,murmur算法是将字段进行hash后分发到不同的数据库,字段类型支持int和varchar。

因此这里使用一致性hash分片规则对order订单表和其子表order_item、order_status进行分片,使插入的数据落在同一个分片库中。

 

4、分布式全局ID使用雪花算法生成全局主键。雪花算法在mycat中的实现

**使用160主机的mycat,user数据库

4.1、修改server.xml配置:cd /opt/mycat/conf

sequnceHandlerType:选择 0本地文件、1数据库、2雪花算法 实现统一id序列

4.2 插入sql进行测试

insert into xs_order(total_amount,order_status) values(66,5);

错误1:生成19位id,需修改xs_order的id字段类型为bigint,长度19

错误2:在分片的时候找不到有效的datanode 数据节点

修改schema.xml的分片规则:将auto-sharding-long 修改为 mod-long分片规则

** 范围分片:生成的19位数大于1000W,不符合

schema.xml:auto-sharding-long -->rule.xml:rang-long -->autopartition-long.txt

4.3 这里使用 取模分片规则,修改schema.xml分片规则为 mod-long,在9066管理端口刷新配置。再重新插入数据进行测试


三:枚举分片规则【sharding-by-intfile】
枚举分片,简单来讲,就是根据某个值,决定这条数据放到哪一个库里面。适合省市区这些不会频繁改变的数

 

 

四:取模分片规则【mode-long】
注意:取模运算-按2-4-8顺序选择主机,2的次方
此分片算法根据id进行十进制取模运算,相比固定的分片hash,这种分片算法在批量插入时会增加事务一致性的难度。

你可能感兴趣的:(mycat常用分片规则,mycat子表,mycat实现雪花算法)