开发者学堂课程【全面讲解开源数据库中间件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”来配置分片的数量。