MySQL运维10-Mycat分库分表之一致性哈希分片

一、一致性哈希分片

一致性哈希分片的实现思路和我们之前介绍的水平分表中的取模分片是类似的。只不过取模分片,采用的是利用主键和分片数进行取模运算,然后根据取模后的结果,将数据写入到不同的分片数据中。但是这种分片方式有一个局限性就只能对id是整形的数据使用,如果id是个uuid类型这个的非整形的字段,就没有办法使用取模的方式进行分片了。这时候就可以采用一致性hash算法分片,其分片的原则是根据id 哈希运算之后,然后再决定写入到哪个分片,所以我认为一致性哈希的分表方式是对取模分片的补充。

一致性哈希分片是将主键采用哈希算法,将数据分布到不同的数据库节点上,以实现分布式存储和查询。

说明1:一致性哈希的规则是 rule="sharding-by-murmur"

说明2:在function标签中只需要修改count属性的值即可,即有几个数据节点就改为几。

二、准备数据库

说明1:在三个数据节点上都先创建好hash_db数据库

三、配置schema.xml

说明1:逻辑库为hash_db

说明2:逻辑表为tb_hash

说明3:分片规则为 rule="sharding-by-murmur"

说明4:dn10对应的是dbhost1即192.168.3.90分片

说明5:dn11对应的是dbhost2即192.168.3.91分片

说明6:dn12对应的是dbhost3即192.168.3.92分片

四、配置server.xml

说明1:增加 root 用户对 hash_db 的操作权限

五、配置rule.xml

说明1:在一致性哈希分片的rule.xml中name=count这个属性,要修改为我们指定的3个数据节点

六、一致性哈希分片测试

首先重启Mycat

登录Mycat

查看逻辑库和逻辑表

这里的tb_hash只是逻辑库,而在MySQL中还并没有tb_hash这个表,需要在Mycat中创建

复制代码
create table tb_hash (id varchar(255) primary key, name varchar(20));

插入一条数据,然后查看数据节点中对应的数据变化

复制代码
insert into tb_hash (id, name) values ("1fc74326-9fd3-45f5-949e-33339f618dbf",'张三');

说明1:id经过hash算法之后,数据存在了192.168.3.92数据节点上了,继续插入数据测试。

复制代码
insert into tb_hash (id, name) values ("9f08bab8-4abe-43e4-97c5-41efcfa45e75",'李四');

说明2:id经过hash算法之后,数据存在了192.168.3.91数据节点上了,继续插入数据测试

复制代码
insert into tb_hash (id, name) values ("7355535e-e1ce-421c-8715-29f41a91dca3",'王五');

说明3:id经过hash算法之后,数据存在了192.168.3.90数据节点上了,继续插入三条数据测试

复制代码
insert into tb_hash (id, name) values ("87558171-e5ce-4b1d-8cde-d911a625b8c9",'赵六');
insert into tb_hash (id, name) values ("596a6d86-6c79-4ffa-8de4-db0a537713a5",'侯七');
insert into tb_hash (id, name) values ("6fc23dd4-9733-4511-9427-bdeea9383b50",'孙八');  

说明4:一致性hash会根据id键hash运算之后决定写入到哪个分片,如果数据量足够大的话,其会尽量保证数据的负载均衡,但不是绝对的,因为这取决于id哈希运算后的结果。

说明5:在Mycat上进行数据查询,是全集查询的,一致性哈希分片是水平分库分表的一种。