第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

文章目录

    • 1.固定Hash算法分片的概念
      • 1.1.固定Hash算法的概念
      • 1.2.固定Hash算法是如何将数据路由到分片节点的
    • 2.使用固定Hash算法分片对某张表进行水平拆分
      • 2.1.在所有的分片节点中创建表结构
      • 2.2.配置Mycat实现固定Hash算法分片的水平分表
        • 2.2.1.配置Schema配置文件
        • 2.2.2.配置Rule分片规则配置文件
        • 2.2.3.配置Server配置文件
        • 2.2.4.重启Mycat
      • 2.3.写入数据观察分片效果

1.固定Hash算法分片的概念

1.1.固定Hash算法的概念

固定Hash算法类似于十进制的求模运算,但是固定Hash算法是为二进制进行运算的,固定Hash运算会将依据的字段转换成耳机10位的二进制数字,然后与二进制1111111111进行位&运算。

位于运算时这个样子的:例如8的二进制是1000,7的二进制是0111,求1000和0111的位&运算,计算方式就是按照第一个二进制的每一位与第二个二进制的每一位进行相乘,如1*0=0 0*1=0 0*1=0 0*1=0 ,最后得出1000和0111的位&运算是0000。

固定Hash算法会将依据的字段内容转换成二进制数,然后与1111111111进行位运算,任何二进制数与1111111111进行位运算最终的结果都会在0000000000和1111111111之间,转换成十进制数也就是0-1023。

我们可以将分片策略设置0-255之间划分到分片1,256-512之间划分到分片2,512-1023划分到分片3,当依据字段被固定Hash转换成2进制数并且位运算完后,得到一个十进制数时,根据十进制数所在的分片,将数据写入到对应的分片节点中。

如下图所示,当字段值为1时,转换成二进制数与10个1进行位运算,最后在转换成十进制数,刚好也是1,0~255之间划分到分片1上,此时这条数据就会被划分到分片1节点上。

image-20220715205222179

固定Hash算法的特点:

  • 如果是取模分片,连续的值可能会分配到不同的分片中,而固定Hash算法会将连续的值可能分配到同一个分片中,降低事务处理的难度。
  • 可以均匀的分配,也可以非均匀分配。
  • 分片字段必须是数字类型。

1.2.固定Hash算法是如何将数据路由到分片节点的

我们会在定义分片策略时,一共有3个分片节点,例如定义第一个节点存储位运算结果0-255之间的数据,第二个节点处理256-511之间的数据,第三个节点处理512到1023之间的数据,此时前两个节点分别处理256个数组。,第三个节点则处理512个数组。

在0-255之间数组的结构中,会记录上第一个分片节点的ID0,255-511之间的数组的结构中,记录第二个分片节点的ID1,512-1023之间的数组结构中,记录第三个分片节点的ID2。

例如当字段值为515,经过固定Hash算法运算,将515转换成二进制数,与1023的二进制数进行位运算,最后的出来位运算的结果是十进制数515,515位于512-1023数组之间,此时就会拿导512-1023数组对应的分片ID号,然后将这条数据写入到对应的分片节点中。

image-20220715205802785

2.使用固定Hash算法分片对某张表进行水平拆分

需求:目前有一张tb_longhash 表,表中的id一列的值是数字类型,我们按照这个字段进行固定Hash算法分片。

2.1.在所有的分片节点中创建表结构

分片依旧是2个,还是之前垂直分库分表时使用的两套双主双从集群。

#在分片1节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_longhash (id int,name varchar(200),firstchar char(1));#在分片2节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_longhash (id int,name varchar(200),firstchar char(1));

2.2.配置Mycat实现固定Hash算法分片的水平分表

2.2.1.配置Schema配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/"><!--定义逻辑库 库名叫做db_shopping 该逻辑库关联dn1这个数据节点--><schema name="db_2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><!--固定Hash算法分片--><table name="tb_longhash" dataNode="dn1,dn2" rule="sharding-by-long-hash"/></schema>  <!--定义数据节点 也就是分片 一个分片会关联一个数据主机组 然后对应真实的数据库名称--><dataNode name="dn1" dataHost="mysqlcluster-1" database= "db_2" />          <dataNode name="dn2" dataHost="mysqlcluster-2" database= "db_2" />          <!--定义数据主机 在这个标签下定义具体的读写操作路由的数据库实例地址 schema、table划分如何指定的是该数据主机关联的数据节点 那么对应的库、表都会被存储在数据主机定义的数据库实例中--><dataHost name="mysqlcluster-1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    <heartbeat>select user()</heartbeat>  <!--定义写操作路由的数据库实例--><writeHost host="c1-1-master3306" url="192.168.20.11:3306" user="root" password="123456"><!--定义读操作路由的数据库实例--><readHost host="c1-1-slave3308" url="192.168.20.11:3308" user="root" password="123456" /></writeHost> <!--备用的主库 也是提供写操作的数据库,当主库c1-1-master3306故障后 备用库开始提供写操作--><writeHost host="c1-2-master3306" url="192.168.20.12:3306" user="root" password="123456"><!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务--><readHost host="c1-2-slave3308" url="192.168.20.12:3308" user="root" password="123456" /></writeHost> </dataHost>  <dataHost name="mysqlcluster-2" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    <heartbeat>select user()</heartbeat>  <writeHost host="c2-1-master3307" url="192.168.20.11:3307" user="root" password="123456"><readHost host="c2-1-slave3309" url="192.168.20.11:3309" user="root" password="123456" /></writeHost> <!--备用主库db3 主库db1故障后 开始提供写操作--><writeHost host="c2-2-master3307" url="192.168.20.12:3307" user="root" password="123456"><!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务--><readHost host="c2-2-slave3309" url="192.168.20.12:3309" user="root" password="123456" /></writeHost> </dataHost>  </mycat:schema>
2.2.2.配置Rule分片规则配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml<tableRule name="sharding-by-long-hash"><rule><columns>id</columns><!--关联固定hash的函数--><algorithm>sharding-by-long-hash</algorithm></rule> </tableRule> <function name="sharding-by-long-hash" class="io.mycat.route.function.PartitionByLong"><!--定义分片节点个数 书写方式和下面的partitionLength有对应关系 例如partitionCount为1,1 partitionLength为512,512 就表示前1个分片节点承载512个数组 后1个分片节点承载512个数组--><property name="partitionCount">2,1</property>         <!--常见的有分片数量为,书写是这么写的:2,1 表示前两个节点分别承载多少个数组,具体承载多少个数组由partitionLength定义:256,512 连起来的意思就是说前两个分片分别承载256个数组,后一个分片承载512个数组--><!-- 数组的总长度为1024 指定每个节点的数组数之后 多个数组相加起来必须等于1024--> <property name="partitionLength">256,512</property></function>	
2.2.3.配置Server配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/server.xml<user name="root" defaultAccount="true"><!--登录用户的密码--><property name="password">123456</property><!--该用户登录后可以显示那些Schema--><property name="schemas">db_2</property></user>
2.2.4.重启Mycat
[root@mysql-1 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

2.3.写入数据观察分片效果

先插入5条连续的数据。

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_longhash (id,name,firstChar) values(1,'aa','Q');
mysql> insert into tb_longhash (id,name,firstChar) values(2,'nn','B'); 
mysql> insert into tb_longhash (id,name,firstChar) values(3,'ss','J'); 
mysql> insert into tb_longhash (id,name,firstChar) values(4,'ee','S'); 
mysql> insert into tb_longhash (id,name,firstChar) values(5,'hh','L'); 

可以看到数据全写入到了分片1中,这是因为1-5这个数字位运算后,还是1-5,当然会落在第一个分片中,0-511会写入到第一个分片,511-1023会写入到第二个分片。

image-20220715212012071

下面我们写入的数据id值给大一些,511-1023之间,观察效果。

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_longhash (id,name,firstChar) values(777,'uuu','L');
mysql> insert into tb_longhash (id,name,firstChar) values(1000,'uuu','L');

777和1000位运算后,属于512-1023之间的数据,此时会被路由到分片2中,水平分表成功。

image-20220715212324090

我们再观察一种现象,如果数大于1023呢,会写入到哪里?答案是写入到第一个分片,相当于第二轮了。

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_longhash (id,name,firstChar) values(1118,'uuu','L');
mysql> insert into tb_longhash (id,name,firstChar) values(1999,'uuu','L');

我们又分表插入了1118和1999这两台数据,1118属于第二轮的0-511之间的数据,路由到分片1,1999属于第二轮的512-1023的数据,路由到分片2。

image-20220715212443024

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unityprotobuf自动生成C#

Release Protocol Buffers v3.19.4 protocolbuffers/protobuf GitHub 导入Source code 里面的 csharp/src/Google.Protobuf 进入Unity 拷贝其他版本的 System.Runtime.CompilerServices.Unsafe进入工程 使用protoc-3.19.4-win32 里面的exe去编译proto文件为C# using Sys…

MybatisPlus-Generator自定义模版生成CRUD、DTO、VO、Convert等

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 如标题所言&#xff0c;本篇文章介绍如何使用MybatisPlus-Generator自定义模版生成CRUD、DTO、V…

Redis实战——查询缓存缓存穿透、雪崩、击穿

目录 为什么要使用缓存缓存的作用缓存的成本如何使用缓存缓存模型和思路缓存更新策略数据库和缓存不一致解决方案数据库和缓存不一致采用什么方案对比删除缓存与更新缓存如何保证缓存与数据库的操作同时成功/同时失败先操作缓存还是先操作数据库&#xff1f; 实现商铺缓存与数据…

Tensorflow笔记(二):激活函数、优化器等、神经网络模型实现(商品销量预测)

import tensorflow as tf import numpy as np from tqdm import tqdm# ----------------------------- tensor常用函数2 ----------------------------------- a tf.constant([1, 2, 3, 1, 2]) b tf.constant([0, 1, 3, 4, 5]) c tf.where(tf.greater(a, b), a, b) # 若a&g…

Linux下的多线程编程:原理、工具及应用(4)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …

RuoYi-Vue开源项目2-前端登录验证码生成过程分析

前端登录验证码实现过程 生成过程分析 生成过程分析 验证码的生成过程简单概括为&#xff1a;前端登录页面加载时&#xff0c;向后端发送一个请求&#xff0c;返回验证码图片给前端页面展示 前端页面加载触发代码&#xff1a; import { getCodeImg } from "/api/login&q…

Spring6--基础概念

1. 概述 1.1. Spring是什么 Spring 是一套广泛应用于 Java 企业级应用开发领域的轻量级开源框架&#xff0c;由 Rod Johnson 创立&#xff0c;旨在显著降低 Java 企业应用的复杂性&#xff0c;缩短开发周期&#xff0c;并提升开发效率。Spring 不仅适用于服务器端开发&#x…

三个案例,带你看懂智能时代支撑降本增效的底层逻辑

2003年&#xff0c;“神舟五号”成功登上太空&#xff0c;2007年&#xff0c;乔布斯初代苹果发布会&#xff0c;2016年“天宫二号”与“神州十一号”自动交会对接成功&#xff0c;2022年ChatGPT横空出市。 科技发展速度令人惊叹&#xff0c;一不留神就步入了下一个科技时代&am…

【vue elementUI】el-select和弹出框el-option样式调整,::v-deep失效

组件自带样式&#xff1a; 修改后样式&#xff1a; 注意修改弹出框样式需要修改一个属性&#xff1a; 此属性默认值为true&#xff0c;此时可以看到弹出框是放在外面的&#xff0c;没有在el-select里面。此时设置弹窗样式会不生效&#xff0c;::v-deep无效。 需要将此属性改为f…

JavaScript练手小技巧:数字反转时钟

样式基于博主的这篇文章&#xff1a; CSS3技巧38&#xff1a;3D 翻转数字效果-CSDN博客 既然可以实现翻转数字了&#xff0c;肯定就可以跟 JS 相结合去完成一些数字展示效果。 比如&#xff0c;数字反转时钟。 为了方便&#xff0c;所有 HTML 数字根据时间动态生成。因此&a…

vue3 element plus 上传下载

文章目录 上传下载 上传 /* html */ <el-upload v-model"fileId" class"avatar-uploader" ref"exampleUploadRef" :file-list"fileList" :show-file-list"false" action"/ys-three-year/ThreeReport/uploadFile&q…

Coarse-to-Fine Latent Diffusion for Pose-Guided Person Image Synthesis阅读笔记

连更&#xff01;&#xff01; 0 Abstract 先前的姿势引导图像合成方法简单的将人的外观与目标姿势进行对齐&#xff0c;这容易导致过拟合&#xff0c;因为缺乏对source person image的high-level semantic understanding&#xff1b;文章开发了一种新的训练范式&#xff1a;…

mudo服务器测试一

目录 长连接测试 测试代码 客户端 服务端 超时连接测试 测试代码 客户端 服务端 错误请求测试 测试代码 场景一 客户端 服务端 场景二 客户端 服务端 长连接测试 测试代码 /*长连接测试1: 创建一个客户端持续给服务器发送数据,直到超过时间看是否正常*/ #inc…

实用工具推荐----geek 卸载软件的神器

Geek Uninstaller 是一款软件卸载工具。它提供简单易用的界面和强大的卸载功能&#xff0c;能快速扫描和识别应用程序&#xff0c;并彻底删除与之相关的文件和注册表项&#xff0c;确保完全清除应用程序。它还可以监视应用程序安装过程&#xff0c;并记录创建的文件和注册表项…

计算机组成原理练习-计算机性能指标

CPU时间与IO时间 ------------------------------------------------------------------------------------------------------------------------------- 1.假定基准程序A在某计算机上的运行时间为100秒&#xff0c;其中90秒为CPU时间&#xff0c;其余 为l/O时间。若CPU速度…

WebGIS之实现查询地区天气并让地区高亮

一.预览>> 二.思路>> 根据搜索框的内容来进行页面视角的切换&#xff0c;对应的地区高亮&#xff0c;右边有关天气的地方实时更新&#xff0c;并且因为代码体量非常小&#xff0c;并没有选择在框架下完成。直接一个html文件搞定了&#xff0c;但实际上还是有一些坑…

带有超令牌采样的视觉转换器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;带有超令牌采样的视觉转换器1、研究背景2、方法提出3、优势4、实验5、贡献 二、StokenAttention代码学习 摘要 本周主要阅读了CV…

Elasticsearch数据存储优化方案

优化Elasticsearch数据存储有助于提升系统性能、降低成本、提高数据查询效率以及增强系统的稳定性和可靠性。通常我们再优化Elasticsearch数据存储会遇到一些问题&#xff0c;导致项目卡壳。以下是优化Elasticsearch数据存储的一些重要作用&#xff1a; 1、问题背景 在某些场景…

AI系统性学习03—ChatGPT开发教程

文章目录 1、OpenAI关键概念⭐️2、OpenAI SDK介绍3、OpenAI API KEY&API 认证3.1 REST API安全认证 4、OpenAI模型⭐️4.1 模型分类4.2 GPT44.3 GPT-3.54.4 Embeddings 5、OpenAI快速入门6、Function calling(函数调用)⭐️⭐️⭐️6.1 应用场景6.2 支持function calling的…

打破传统,拥抱未来:解锁企业数字化转型成功的11把金钥匙

数字化转型是一个持续的过程&#xff0c;需要企业不断地适应新技术和市场变化。企业如何提高转型成功的可能性&#xff0c;并在竞争激烈的市场中保持领先地位。今天我们来解锁企业数字化转型成功的11把金钥匙。 清晰的战略目标&#xff1a; 首先&#xff0c;企业需要明确数字化…