MyCat - 分片 - 分片规则 - 一致性 hash 算法 | 学习笔记

简介: 快速学习 MyCat - 分片 - 分片规则 - 一致性 hash 算法

开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 一致性 hash 算法】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/756/detail/13274


MyCat - 分片 - 分片规则 - 一致性 hash 算法

一、一致性 hash 算法

一致性 hash 算法实际上是采用了一种 hash 算法。通过 hash 算法算出我们当前插入的数据应该落在哪个分片节点上。一致性 hash 算法有效地解决了分布式数据的拓容问题。

1、配置

我们需要声明一个分片规则 tableRuler,

<tableRule name="sharding-by-murmur">

<rule>

<columns>id</columns>

<algorithm>murmur</algorithm>

</rule>

</tableRule>

上面有一个 sharding-by-murmur,sharding-by-murmur 是这个分片规则的名称。在这里面指定根据哪个字段分片以及分片的算法 murmur,下面有一个分片算法的处理类,这有一个 seed,它是种子,他是创建 murmur_hash 对象的种子,默认是零。我们需要重点关注的是第二个参数 count,count 是我们分片的数量,分片节点的数量是必须要指定的,对于我们当前来说是 3 个分片,所以 count 的数量是 3。还有一个 virtualBucketTimes, 这实际上就是一个实际的数库节点,被映射为这么多虚拟节点,默认是 160 倍,这个一般也不需要操作。重点关注第二个参数 count,不管插入多大的数据量,不管插入多少的数据,他都会根据它内部一致性 hash 算法,将这些数据均匀分散在三个节点上。

2、测试

首先,我们先需要配置一张逻辑表(<table name="tb-order"dataNode="dn1,dn2,dn3"rule="sharding-by-murmur"/>),在这里面声明一个逻辑表,逻辑表的表名叫 tb_order,这有一个 sharding-by-murmur,sharding-by-murmur 就是我们的分片规则。我们来找一下,找 sharding-by-murmur,

<tableRule name="sharding-by-murmur">

<rule>

<columns>id</columns>

<algorithm>murmur</algorithm> 

murmur 下面对应的就是这一块的分片函数,

<function name="murmur"

class="io.mycat.route.function.PartitionByMurmurHash">

<property name="seed">0</property><!--默认是0-->

<property name="count">3</property>

<property name="virtualBucketTimes">160</property>

<propertyname="weightMapFile">weightMapFile</property>

<propertyname="bucketMapPath">/etc/mycat/bucketMapPath</property>

</function>

这个里面 count 需要改为 3,上面这个 sharding-by-murmur 是根据 ID 进行分片,确认一下,就是根据 ID 来分片。虚拟表已经配置好了,并且也已经配置好了对应的分片规则。

接下来,需要重启 my cat 进行测试。重启 my cat,重新连接 my cat (1,2,3,4,5,6),然后 show databases ,use PARTITION_DB,当前这个数据库已经切换过了,show tables,会发现 tb_order 这张表也已经有了,接下来,我们需要创建表结构,

1).创建表

create table tb_order(

id int(11) primary key,

money int(11),

content  varchar(200)

)engine=InnoDB;

执行 SQL 语句,SQL 语句已经执行完毕,在这张表结构当中插入数据,

插入数据:

INSERTINTO tb order(id, money, content)VALUES(1,100,UurD());

INSERTINTO tb-order(id, money, content)VALUES(212,100,vurD());

INSERTINTO tb order(id, money, content)VALUES(312, 100,wurD());

INSERTINTO tb-order(id, money, content)VALUES(412,100,wurD());

INSERTINTO tb-order(id, money, content)VALUES(534,100,wurD());

INSERTINTO tb order(id, money, content)VALUES(621,100,UUID();

INSERTINTO tb-order(id, money, content)VALUES(754563,100,vurD());

INSERTINTO tb-order(id, money, content)VALUES(8123,100,0UID());

INSERTINTO tb-order(id, money, content)VALUES(91213,100,vurD());

INSERTINTO tb-order(id, money, content)VALUES(23232,100,vuro());

INSERTINTO tb-order(id, money, content)VALUES(112321,100,vurD());

INSERTINTO tb-order(id, money, content)VALUES(21221,100,vurD());

INSERTINTO tb order(id, money, content)VALUES(112132,100,υuID());

INSERTINTO tb-order(id, money, content)VALUES(12132,100,UuID());

INSERTINTO tb-order(id, money, content)VALUES(124321,100,wurD());

INSERTINTO tb-order(id, money, content)VALUES(212132,100,vurD());

他们的 ID 是随意指定的,插入完毕之后再来一个 select * from tb_order,数据已经插进去了,那这些数据到底是插入了哪个节点当中呢?select * from tb_order 第一个节点三条数据,select * from tb_order 第二个节点有八条数据,select * from tb_order 第三个节点有五条数据。这不是均匀分散,在插入数据时,他会根据 id 计算他的一致性,在大数据量的情况下,会均匀分散到节点上,刚才只是插入了十几条数据,实际上,它也类似于均匀分散。

一致性 hash 算法,重点知道一个参数“count”来配置分片的数量。

相关文章
|
2月前
|
算法 前端开发 机器人
一文了解分而治之和动态规则算法在前端中的应用
该文章详细介绍了分而治之策略和动态规划算法在前端开发中的应用,并通过具体的例子和LeetCode题目解析来说明这两种算法的特点及使用场景。
一文了解分而治之和动态规则算法在前端中的应用
|
3月前
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
105 11
|
3月前
|
数据可视化 算法 前端开发
基于python flask+pyecharts实现的中药数据可视化大屏,实现基于Apriori算法的药品功效关系的关联规则
本文介绍了一个基于Python Flask和Pyecharts实现的中药数据可视化大屏,该系统应用Apriori算法挖掘中药药材与功效之间的关联规则,为中医药学研究提供了数据支持和可视化分析工具。
117 2
|
3月前
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
107 8
|
3月前
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
|
4月前
|
缓存 负载均衡 算法
(四)网络编程之请求分发篇:负载均衡静态调度算法、平滑轮询加权、一致性哈希、最小活跃数算法实践!
先如今所有的技术栈中,只要一谈关于高可用、高并发处理相关的实现,必然会牵扯到集群这个话题,也就是部署多台服务器共同对外提供服务,从而做到提升系统吞吐量,优化系统的整体性能以及稳定性等目的。
|
4月前
|
数据采集 机器学习/深度学习 算法
Python基于Apriori关联规则算法实现商品零售购物篮分析
Python基于Apriori关联规则算法实现商品零售购物篮分析
163 0
|
5月前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】Apriori算法在关联规则学习中的应用
【机器学习】Apriori算法在关联规则学习中的应用
92 0
|
5月前
|
算法 Java
Java中常用hash算法总结
Java中常用hash算法总结
36 0
|
8天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。