枚举分片容错性动态扩展

枚举分片之前的《mycat字符串枚举分片示例》中已经介绍过。

使用这种分片策略之后碰到了一个问题:
场景:
使用连锁店的店铺编号枚举分片(第1至第100分布店分在第一个分片,第101至第250分店),全国的连锁店会不断增加。在还没有来得及往配置文件中配置新的店铺编号时,新店铺的数据无法插入到mycat中(mycat会抛出异常can't find datanode for sharding column:SHOP_NO val:SHOP1002 ),而且店铺可能今天加一个新店,明天再加一个新店,难道维护人员每天来给你修改这个枚举店铺编号的配置文件?


解决办法:
不识别的枚举值,路由到一个默认的节点,这样,mycat将新店铺的数据全部插入到默认节点。当不识别的店铺编号达到一定的数量后,比如新增了1000个店铺后,新增一个数据节点,将默认节点上的那1000个店铺的数据整体迁移到新节点上。枚举分片的迁移非常容易,两个命令搞定:
1、默认节点的mysql服务器上执行导出:

mysqldump -uroot -p123456 databasename shop --where=" shop_no in ('shop1001','shop1002'.....,'shop2000') " > /data/shop.sql


2、新节点的mysql服务器上执行导入:

mysql -uroot -p123456 databasename <  /data/shop.sql


修改的代码:
为了支持该方案,对org.opencloudb.route.function.PartitionByFileMap类做修改,增加一个属性

defaultNode,如下:

    /*** 默认节点:小于0表示不设置默认节点,大于等于0表示设置默认节点* * 默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点*                如果不配置默认节点(defaultNode值小于0表示不配置默认节点),碰到*                不识别的枚举值就会报错,*                like this:can't find datanode for sharding column:column_name val:ffffffff    */private int defaultNode = -1;

defaultNode的默认值为-1表示不配置默认节点,如果要配置默认节点,需要从配置文件配置defaultNode的值,一般是从rule.xml中配置: 

<function name="sharding-by-string-enumFunc" class="org.opencloudb.route.function.PartitionByFileMap"><property name="mapFile">partition-by-shop_no-enum.txt</property><property name="type">1</property><property name="defaultNode">0</property> <!-- 表示默认节点为第一个节点 -->
</function>

private void initialize() 方法根据defaultNode的值往map中增加defaultNode:

//设置默认节点
if(defaultNode >= 0) {app2Partition.put(DEFAULT_NODE, defaultNode);
}

public Integer calculate(String columnValue) 方法:

Integer pid = app2Partition.get(value);
if (pid != null) {rst = pid;
} else {rst =app2Partition.get(DEFAULT_NODE);
}
return rst;

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

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

相关文章

JavaScript常见的运算符

一、运算符和运算元 1.认识运算符 在小学的时候我们就学习了各种运算符&#xff0c;比如加号 、乘号 *、减号 - 、除号/ 几乎所有的编程语言都有各种各样的运算符(也被称之为操作符&#xff0c;operators) 初次接触这些运算符, 你会感觉种类繁多, 难以记忆.但是并不需要特别…

Kotlin判断null比较let布尔值Boolean

Kotlin判断null比较let布尔值Boolean class MyData {val count: Int? 2023val number: Int? null }fun main(args: Array<String>) {val data MyData()val year 2022if (data.count ! null) {if (data.count > year) {println("data.count ! null")}}…

CSS 盒子模型

前言 盒子模型-组成 CSS盒子模型是一种用来描述元素在页面布局中占据空间的模型。它将每个元素看作由内容区域、内边距、边框和外边距组成的一个矩形框。 盒子模型的组成部分包括&#xff1a; 内容区域&#xff08;Content&#xff09;&#xff1a;显示元素的实际内容&#xf…

无涯教程-Android - Frame Layout函数

Frame Layout 旨在遮挡屏幕上的某个区域以显示单个项目&#xff0c;通常&#xff0c;应使用FrameLayout来保存单个子视图&#xff0c;因为在子视图彼此不重叠的情况下&#xff0c;难以以可扩展到不同屏幕尺寸的方式组织子视图。 不过&#xff0c;您可以使用android:layout_grav…

Axure RP 8.1.0.3400(原型设计工具)

Axure RP 8是一款原型设计工具&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户创建高质量的网页、移动应用和桌面软件原型。以下是Axure RP 8的一些特色介绍&#xff1a; 强大的交互设计&#xff1a;Axure RP 8支持创建复杂的动画和过渡效果&#xff0c;让你的原型更…

2023 js逆向爬虫 有道翻译 代码

前置条件&#xff1a;nodejs环境、安装 crypto 和 python3环境 js.js文件&#xff1a; const crypto require("crypto")function decode(resp_data) {g_o ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHlg_n ydsecre…

微信短链跳转到小程序指定页面调试

首先说下背景&#xff1a;后端给了短链地址&#xff0c;但是无法跳转到指定页面。总是在小程序首页。指定的页面我们是h5页面。排查步骤如下&#xff1a; 1、通过快速URL Scheme 编译。上部普通编译 下拉找到此选项。 、 2、按照小程序的要求的URL Scheme输入。另外后端给的…

Redis7之介绍(一)

1. 是什么 Redis:REmote Dictionary Server(远程字典服务器&#xff09; Remote Dictionary Server( 远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c;例如String、Hash、List、…

PlantUML文本绘制类图

记录下文本绘制类图的语法 参考 https://juejin.cn/post/6844903731293585421 类的UML表示 使用UML表示一个类&#xff0c;主要由三部分组成。类名、属性、方法。其中属性和方法的访问修饰符用 - 、# 、 表示 private、protected、public。 如图所示&#xff0c;表示A类有一个…

Unity3D 2021 使用 SharpZipLib 遇到的安卓打包 I18N 相关问题

在 Unity3D 中&#xff0c;使用 ICSharpCode.SharpZipLib.dll 来做压缩和解压缩&#xff0c;但打包安卓后遇到问题&#xff0c;原因是字符编码程序集被裁减掉了导致。 根据网上搜索&#xff0c;将 UnityEditor 对应目录下的 I18N开头的&#xff0c;比如 I18N.CJK.dll 等系列文…

筑牢数据隐私安全底线,ADSCOPE通过ISO隐私信息管理体系认证!

数字时代&#xff0c;信息安全尤其是数据隐私信息保护已经成为社会共识。近日&#xff0c;ADSCOPE&#xff08;上海倍孜网络技术有限公司&#xff09;已通过相关组织机构评审&#xff0c;符合ISO/IEC 27701&#xff1a;2019标准&#xff0c;获得隐私信息管理体系认证证书&#…

在Linux系统上使用Nginx作为图片服务器

在Linux系统上使用Nginx作为图片服务器的步骤如下&#xff1a; 1. 关闭防火墙和Selinux&#xff1a; # 临时关闭防火墙 sudo systemctl stop firewalld.service# 永久关闭防火墙 sudo systemctl disable firewalld.service# 临时关闭SELinux setenforce 0# 永久关闭SELinux sud…

Django基础5——ORM中间程序

文章目录 一、基本了解二、ORM基本操作2.1 连接数据库2.1.1 使用sqlite数据库2.1.2 使用MySQL数据库 2.2 对数据库操作2.2.1 增&#xff08;前端数据——>数据库&#xff09;2.2.2 查&#xff08;数据库——>前端展示&#xff09;2.2.3 改&#xff08;修改数据&#xff0…

已知两地经纬度,计算两地直线距离

文章目录 1 原理公式2 代码实现2.1 JavaScript2.2 C2.3 Python2.4 MATLAB 1 原理公式 在地球上&#xff0c;计算两点之间的直线距离通常使用地理坐标系&#xff08;例如WGS84&#xff09;。计算两地直线距离的公式是根据经纬度之间的大圆距离&#xff08;Great Circle Distanc…

node 项目搭建

1. 初始化项目 cmd 执行 cnpm init -y 创建README.md 依赖安装 1. 数据库 和 框架 mysql express cnpm install mysql express --save 2. 后端跨域 cors cnpm i cors 3. 安装 body-parser 声明引用 用于接收前端 post 过来的数据 cnpm install --save body-parser 4…

C语言练习4(巩固提升)

C语言练习4 选择题 前言 面对复杂变化的世界&#xff0c;人类社会向何处去&#xff1f;亚洲前途在哪里&#xff1f;我认为&#xff0c;回答这些时代之问&#xff0c;我们要不畏浮云遮望眼&#xff0c;善于拨云见日&#xff0c;把握历史规律&#xff0c;认清世界大势。 选择题 …

shell脚本监控ip和端口的运行状态并触发邮件告警

ping端口shell代码 ping不通发邮件通知 直到ping通再次发送成功邮件 #!/bin/bash Datedate -d "today" "%Y-%m-%dT%H-%M-%S" #echo "根据当前时间创建日志文件" mkdir -p /log/Ping/ping_server touch /log/Ping/${Date}_ping_server.log ip_li…

shell常用脚本

1、Java项目重启脚本 #!/bin/bash# 定义一个函数来结束进程和启动新进程 function restart(){JAR_NAME$1 # jar包LOG_NAME$2 # 日志JVM_ARGS$3 # jvm 参数PID$(ps -ef | grep java | grep ${JAR_NAME} | awk { print $2 })if [[ ! -z "$PID" ]]; thenecho "…

js--记录

js循环对象顺序错乱 // for (var key in produce) {// dateList.push(key)// arr1.push(produce[key])// }// for (var key in rate) {// arr2.push((rate[key]) * 100)// }// console.log(dateList);Object.keys(produce).sort().forEach(item > {console.log(item, …

postgresql-字符函数

postgresql-字符函数 字符串连接字符与编码字符串长度大小写转换子串查找与替换截断与填充字符串格式化MD5 值字符串拆分字符串反转 字符串连接 concat(str, …)函数用于连接字符串&#xff0c;并且忽略其中的 NULL 参数&#xff1b;concat_ws(sep, str, …) 函数使用指定分隔…