【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文目录
本文导读
一、MyCat分库分表拆分策略——垂直分库
二、MyCat分库分表拆分策略——水平分表分片规则
1、水平分表的分片规则
2、分片规则详细说明及配置
2.1、按照范围分片
2.2、取模分片
2.3、一致性hash分片
2.4、枚举分片
总结
本文导读
MyCat 的分片规则配置在conf目录下的 rule.xml 文件中定义,学习本文,首先需要复习上一篇:MyCAT三大配置文件详解 的重点知识。
MyCat 拆分策略包含垂直拆分和水平拆分,作垂直拆分时,一般做垂直分库;水平拆分,一般情况下只会进行水平拆分表。垂直分表和水平分库很复杂一般也不会在生产环境中使用,本文仅做了解和基于面试做配置和原理解析。
一、MyCat分库分表拆分策略——垂直分库
垂直分库就是,在数据库中每个表对应于不同的业务,根据业务垂直切分对表进行分类,并将其分发到不同的数据库,从而分担不同数据库的压力。此时需要在多个MySQL服务器中创建数据库,要实现以上功能就需要在 MyCat 的 schema.xml 文件中进行配置。
简单来说,一个电商部门有很多业务场景,例如秒杀、营销、商品、库存、B端管理、订单、交易、配送、售后、结算等等,垂直分库就是不同的业务模块小组单独使用一个库。
仅针对 schema.xml配置文件的核心配置,有关dataHost中的配置和mycat环境的部署,请参阅上一篇
<!-- 逻辑库 --><schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><!-- 逻辑表的名字, 逻辑表下的节点,逻辑表数据存入节点的规则 --><table name="TB_ORDER" dataNode="dn1" rule="auto-sharding-long"/><table name="TB_GOODS" dataNode="dn2" rule="auto-sharding-long"/><table name="TB_delivery" dataNode="dn3" rule="auto-sharding-long"/></schema><!-- 节点名称,节点关联的物理主机位置,关联数据库名称 --><dataNode name="dn1" dataHost="dhost1" database="db01"/><dataNode name="dn2" dataHost="dhost2" database="db01"/><dataNode name="dn3" dataHost="dhost3" database="db01"/>
二、MyCat分库分表拆分策略——水平分表分片规则
如果一个表有多条数据,此时单表具有性能上线,水平拆分的目的是根据一定的路由规则将数据分配给不同的数据库和表,提高数据库性能。
1、水平分表的分片规则
在mycat中,主要提供了9中不同的分片规则,他们分别是:按照范围分片、取模分片、一致性hash分片、枚举分片、应用指定算法分片、固定hash算法分片、字符hash解析分片、按天分片、按自然月份分片。
2、分片规则详细说明及配置
2.1、按照范围分片
mycat的默认分片规则:根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。
<!-- schema.xml文件 rule="auto-sharding-long" 可以看出分片规则是auto-sharding-long --><schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><!-- rule.xml文件,可以看出是 根据 id 的值进行分片,具体的分片算法是 rang-long --><tableRule name="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule></tableRule><function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property></function>
2.2、取模分片
根据指定的字段及其配置范围以及数据节点的相应情况,确定数据属于哪个分区。
<!-- schema.xml文件 -->
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<!-- rule.xml文件,可以看出是 id为指定的字段,具体的分片算法是 mod-long -->
<tableRule name="mod-long"><rule><columns>id</columns><algorithm>mod-long</algorithm></rule>
</tableRule>
<!-- 有多少个主机节点,count的值就应该为多少 count = "3" 就是根据指定的字段对 3 进行取模 -->
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"><property name="count">3</property>
</function>
2.3、一致性hash分片
假如表的id值是一个uuid,这样就不能够范围查询或者取模运算了,这样子就可以使用一致性hash分片效果会比较好,根据id的一致性hash值来确定将数据分配到哪一个数据节点。
所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。
<!-- schema.xml文件 -->
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur"/>
</schema><!-- rule.xml文件,可以看出是 id为指定的字段,分片算法为 murmur -->
<tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule>
</tableRule><!-- function中一般一需要修改一个配置 count 的值,有多少个数据节点就设置成多少,其他的使用默认值即可 -->
<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><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
</function>
2.4、枚举分片
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="sharding-by-enumstatus" /><rule><columns>status</columns><algorithm>hash-int</algorithm></rule>
总结
MyCat 的分片规则配置在conf目录下的 rule.xml 文件中定义,学习本文,首先需要复习上一篇:MyCAT三大配置文件详解 的重点知识。
MyCat 拆分策略包含垂直拆分和水平拆分,作垂直拆分时,一般做垂直分库;水平拆分,一般情况下只会进行水平拆分表。垂直分表和水平分库很复杂一般也不会在生产环境中使用,本文仅做了解和基于面试做配置和原理解析。
相关文章:
【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公…...
OpenWrt路由器设置域名动态解析手把手教程
文章目录0、前言1、准备工作2、详细步骤2.1、OpenWrt路由器软件包安装2.2、防火墙放行入站数据(修改为“接受”并保存应用)2.3、域名解析服务商对域名的解析设置2.4、路由器中动态域名插件的设置0、前言 因为一直用着内网穿透(zerotier或者是…...
java流浪动物救助系统(毕业设计)
项目类型:Java web项目/Java EE项目(非开源) 项目名称:基于JSPServlet的流浪动物救助网站[dwjz_web] 进行源码获取 用户类型:双角色(爱心人士、管理员) 项目架构:B/S架构 设计思…...
阿里代码规范插件中,Apache Beanutils为什么被禁止使用?
在实际的项目开发中,对象间赋值普遍存在,随着双十一、秒杀等电商过程愈加复杂,数据量也在不断攀升,效率问题,浮出水面。 问:如果是你来写对象间赋值的代码,你会怎么做? 答…...
NFC enable NFC使能流程
同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 NFC enable NFC使能流程 认识nfc系统如何工作,最好的方法就是了解nfc的各个流程,…...
Redis实例绑定CPU物理核优化Redis性能
进入本次Redis性能调优之前,首先要知道CPU结构也会影响Redis的性能。接下来,具体了解一下!为什么CPU结构也会影响Redis的性能?主流的 CPU 架构一个 CPU 处理器中一般有多个物理核,每个物理核都可以运行应用程序。每个物…...
STC15中断系统介绍
STC15中断系统介绍✨本篇参考来源于STC官方stc15系列手册:538页- 589页。(文末提供该摘取部分的文档资料) 🎉在官方提供的手册资料中,一个系列一份手册,手册内容涵盖了数据手册和参考手册以及例程案例。对于学习着来说…...
力扣HOT100 11-15
11.盛水最多的容器 思路:最大水量 底边 * 高度。较短的一边控制最大水量,因此,采用双指针的方式,左、右指针指向开始和末尾,逐个向中间移动,判断左右指针所指向的高度哪个更低,它就向中间移动一…...
深入浅出单调栈与单调队列
目录一、单调栈情形一:寻找一个数左边第一个小于它的数情形二:寻找一个数左边第一个小于它的数的下标情形三:寻找一个数右边第一个大于它的数情形四:寻找一个数右边第一个大于它的数的下标二、单调栈的应用2.1 单调栈模板题I2.2 单…...
深入C语言——实现可变参数函数
文章目录初步示例函数解析最大值函数初步示例 stdarg.h提供了C语言对可变参数的支持,先举一个简短的例子 //testStdArg.c #include <stdarg.h> #include <stdio.h>void printIntList(int N, ...){va_list args; //存放...所代表的参数va_start(…...
41-Dockerfile-Dockerfile简介
Dockerfile简介前言Dockerfile 简介基础知识使用Dockerfile 构建镜像步骤Dockerfile 构建过程Dockerfile基本结构Dockerfile示例总结前言 本篇开始来学习下Dockerfile相关的用法 Dockerfile 简介 Dockerfile : 是用来构建 Docker 镜像的文本文件,是有一条条构建镜…...
【408】操作系统 - 刻骨铭心自测题1(上)
文章目录OS练习题第一部分:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17&am…...
【老卫拆书】009期:Vue+Node肩挑全栈!《Node.js+Express+MongoDB+Vue.js全栈开发实战》开箱
今天刚拿到一本新书,叫做《Node.jsExpressMongoDBVue.js全栈开发实战》,做个开箱。 外观 先从外观上讲,这本是全新的未开封的,膜还在。 这本书介绍从技术原理到整合开发实战,以丰富的项目展现全栈开发的一个技巧。 …...
【LeetCode】动态规划总结
动态规划解决的问题 动态规划和贪心的区别: 动态规划是由前一个状态推导出来的; 贪心是局部直接选最优的。 动态规划解题步骤 状态定义:确定dp数组以及下标的含义状态转移方程:确定递推公式初始条件:dp如何初始化遍历…...
CAS详解.
CAS这个机制就给实现线程安全版本的代码,提供了一个新的思路,之前通过加锁,把多个指令打包成整体,来实现线程安全。现在就可以考虑直接基与CAS来实现一些修改操作,也能保证线程安全(不需要加锁)…...
Mock.js初步使用(浏览器端)
Mock.js:生成随机数据,拦截 Ajax 请求。官方地址:http://mockjs.com/第一个demodemo.html<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>mockjs demo</title> </head> <…...
opencv保存图片
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...
【c++】数据类型
文章目录整型实型科学计数法sizeof关键字字符型字符串类型转义字符bool布尔类型c规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存。 整型 作用:整型变量表示的是整数类型的数据。 实型 float f3.14; //默…...
Elasticsearch的写的底层原理
前面有一篇文章讲解了Elasticsearch的读写搜索过程,有的人感觉不太理解,今天我们再来看看这些过程的原理 写数据底层原理 首先是将数据写入到内存buffer中,在这里的时候,数据是搜索不到。他同时会将数据写入到translog日志文件中…...
【网络编程】Java中的Socket
文章目录前言socket是什么?Java中的SocketJava实现网络上传文件前言 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
