一、简介

  • 实现方式:一致性hash分片,利用一个分片节点对应一个或者多个虚拟hash桶的思想,尽可能减少分片扩展时的数据迁移。
  • 优点:有效解决了分布式数据库的扩容问题;
  • 缺点:在横向扩展的时候,需要迁移部分数据;由于虚拟桶倍数与分片节点数都必须是正整数,而且要服从"虚拟桶倍数×分片节点数 = 设计极限",因此在横向扩容的过程中,增加分片节点并不是一台一台地加上去的,而是以一种因式分解的方式增加,因此有浪费物理计算力的可能性;

二、一致性hash分片

实现步骤:

【a】创建数据库和表

create database hash01;
create table user(id bigint not null primary key,name varchar(20));
create database hash02;
create table user(id bigint not null primary key,name varchar(20));

【b】配置server.xml

<user name="root"><property name="password">0905</property><property name="schemas">TESTHASH</property><!-- 表级 DML 权限设置 --><!--            <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           -->
</user><user name="user"><property name="password">user</property><property name="schemas">TESTHASH</property><property name="readOnly">true</property>
</user>

【c】配置分片规则rule.xml

<function name="murmur"class="io.mycat.route.function.PartitionByMurmurHash"><property name="seed">0</property><!-- 默认是0 --><property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --><property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --><!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1>代替 --><property name="bucketMapPath">/etc/mycat/bucketMapPath</property>    <!--    用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function><tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule>
</tableRule>

【d】schema.xml配置分片表、分片节点等

<schema name="TESTHASH" checkSQLschema="true" sqlMaxLimit="1000"><table name="user" dataNode="dn$1-3" primaryKey="id" rule="sharding-by-murmur" />
</schema><dataNode name="dn1" dataHost="dataHost01" database="hash01" />
<dataNode name="dn2" dataHost="dataHost01" database="hash02" />
<dataNode name="dn3" dataHost="dataHost01" database="hash01" /><dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.179.131:3306" user="root" password="0905" />
</dataHost>

【e】测试插入数据:

重启mycat:

  • cd /bin
  • ./mycat restart
  • mysql -uroot -p0905 -h192.168.179.130 -P8066
insert into user(id,name) values(1111111,database());
insert into user(id,name) values(2222222,database());
insert into user(id,name) values(3333333,database());
insert into user(id,name) values(4444444,database());
insert into user(id,name) values(8960000,database());

explain select * from user;

  • 可见,如果不使用分片字段进行查询,那么sql语句将会发往所有分片。
explain select * from user where id = 1111111;

可见,如果使用分片字段进行查询,那么sql语句只会发往该条数据对应的分片。

【f】下面我们测试一下指定分片节点的权重

修改rule.xml:

<function name="murmur"class="io.mycat.route.function.PartitionByMurmurHash"><property name="seed">0</property><!-- 默认是0 --><property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --><property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --><property name="weightMapFile">murmurhash-mapfile.txt</property><!-- 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,
否则以1代替 --><property name="bucketMapPath">/etc/mycat/bucketMapPath</property><!--    用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>

  • vim murmurhash-mapfile.txt
  • datanode index = 权重
0=2
1=1

配置dn0即第一个节点的权重稍微大一点,然后测试插入数据:

insert into user(id,name) values(6666666,database());
insert into user(id,name) values(7777777,database());
insert into user(id,name) values(8888888,database());
insert into user(id,name) values(9999999,database());

可见,配置的权重越高,数据被分配到该节点的几率就越大。

【g】原理图

节点扩展时:

MyCat分片规则之一致性hash分片相关推荐

  1. Mycat(三)——几种分片规则 分库 一致性hash的原理及使用

    文章目录 Mycat分片规则 取模 分库 schema.xml 分片枚举 schema.xml 测试 问题: 固定hash分片 优点 范围约定分片 按日期分区 按天分 一致性HASH 解决什么问题? ...

  2. MyCat分片规则(全局表,ER分片表,多对多关联,主键分片VS非主键分片),MyCat常用的分片规则(15中分片规则),自定义MyCat分片规则,其它术语

    1 MyCat分片规则 数据切分中重要的几条原则,其中有几条数据冗余,表分组(Table Group). 1.1全局表 如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或数据量 ...

  3. mysql 分区 mycat 分片_Mysql系列六:(Mycat分片路由原理、Mycat常用分片规则及对应源码介绍)...

    一.Mycat分片路由原理 我们先来看下面的一个SQL在Mycat里面是如何执行的: select * from travelrecord where id in(5000001, 10000001) ...

  4. MySql使用MyCat分库分表(四)分片规则

    视频学习地址:17-尚硅谷-垂直分库_哔哩哔哩_bilibili 笔记参考地址:MySQL 分库分表 | xustudyxu's Blog (frxcat.fun) 分片规则 范围分片 介绍 根据指定 ...

  5. MySQL运维篇之Mycat分片规则

    3.5.3.Mycat分片规则 3.5.3.1.范围分片 根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片. 示例: 可以通过修改autopartition-long.tx ...

  6. 【MySQL | 运维篇】06、MySQL 分库分表之 MyCat 分片规则

    目录 一.范围分片 1. 介绍 2. 配置 schema.xml逻辑表配置: schema.xml数据节点配置: rule.xml分片规则配置: 二.取模分片 1. 介绍 2. 配置 schema.x ...

  7. mycat 常用分片规则使用详解

    前言 在上一篇,详细了解了使用mycat进行数据库的垂直拆分和表的水平拆分,本篇在此基础上继续探讨mycat的常用分片规则. 什么是分片规则? 分片规则就是按照一定的规则(算法),将数据分散存储到多个 ...

  8. mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置

    一.前言 本文将基于主从复制,读写分离的环境基础上进行一个简单的分片(分库分表)配置 二.Mycat分片配置 mycat分片主要在scheam.xml,rule.xml这2个表中配置 ① scheam ...

  9. mycat分表之ER表分片、范围分片、取模分片、日期分片、全局表等

    概述 数据库进行水平分表时,需要按照一定规则对数据进行分片. Mycat的分片策略可以分为两种: 连续分片和离散分片. 连续分片常用的有分片规则有: 范围分片. 日期分片. 优点:如果进行范围查询,比 ...

  10. Mycat分片规则详解

    1.分片枚举 通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下: <tab ...

最新文章

  1. anaconda学习python_python深度学习笔记1-Anaconda软件安装
  2. android+5.q,MSM8909+Android5.1.1电池管理(2)--qpnp-linear-charger.txt驱动学习概要
  3. 深度 | 数据仓库分层存储技术揭秘
  4. 1秒获取Power BI Pro帐号
  5. HDU 4983 Goffi and GCD(数论)
  6. 艾司博讯:拼多多拼单人数不够怎么取消
  7. 环路滤波(二):HEVC去方块滤波
  8. 2548. 大胖子走迷宫 (时间bfs)
  9. 前端表格里的数据不换行
  10. 搭建web服务端网络共享及实时备份(只能用堡垒机连接)
  11. OnlyBill 简易记账软件(续)
  12. VSPD V9版(Virtual Serial Port Driver 9.0)
  13. 外国人眼中最好的五个第三方 DNS 服务器
  14. 自我修炼是优秀领导者的最高层次--张一鸣
  15. 金立拍卖211宗外观设计专利 起拍价2.11万元
  16. 2021-2027全球与中国呼吸道病原菌核酸检测试剂盒市场现状及未来发展趋势
  17. 聊一聊 vscode 的代码格式化
  18. 【原】Oracle 11.2.0.1 64bit for RHEL6.0 Server x86_64 静默安装
  19. RFID定位技术在智能仓库中的应用--新导智能
  20. ASP.NET编程技术-用ASP.NET开发Web服务的五则技巧

热门文章

  1. TL摄像头如何放到html去直播,使用flash插件来调用pc的摄像头如何将它嵌入到TML页面中...
  2. 点击列表高亮_办公小技巧:妙用条件格式 高亮显示查询结果
  3. 极客大学架构师训练营 性能优化 进程 线程 锁 存储 分布式数据库 第14课 听课总结
  4. 375.猜数字大小II
  5. react轮播图插件_React 基础面试题 - 和你随便聊聊 React
  6. ubuntu删除了python恢复_ubuntu卸载python 后如何修复
  7. 2015-11-19 22:34:54
  8. POJ 3667 Hotel (线段树区间合并)
  9. 降维系列之 LDA 线性判别分析
  10. n倍角公式的行列式形式与证明