Mycat 数据分片--取模函数源码阅读:
package io.mycat.route.function;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.mycat.config.model.rule.RuleAlgorithm;
/**
* number column partion by Mod operator
* if count is 10 then 0 to 0,21 to 1 (21 % 10 =1)
* @author wuzhih
*
*/
public class PartitionByMod extends AbstractPartitionAlgorithm implements RuleAlgorithm {
private int count;
@Override
public void init() {
}
public void setCount(int count) {
this.count = count;
}
@Override
public Integer calculate(String columnValue) {
//columnValue = NumberParseUtil.eliminateQoute(columnValue);
try {
BigInteger bigNum = new BigInteger(columnValue).abs();
return (bigNum.mod(BigInteger.valueOf(count))).intValue();
} catch (NumberFormatException e){
throw new IllegalArgumentException(new StringBuilder().append("columnValue:").append(columnValue).append(" Please eliminate any quote and non number within it.").toString(),e);
}
}
@Override
public int getPartitionNum() {
int nPartition = this.count;
return nPartition;
}
private static void hashTest() {
PartitionByMod hash=new PartitionByMod();
//初始化机器节点的数量为11
hash.setCount(11);
hash.init();//空方法暂无实际意义
//数组用来统计每个节点存储的数据条数,数组下标从0开始编号,刚好和机器编号相同
int[] bucket=new int[hash.count];
//Map存储节点数据的片键,其中key为机器编号0-10,
// Value为分库分表对应的键值,例如以ID为主键的一系列集合
Map<Integer,List<Integer>> hashed=new HashMap<>();
int total=1000_0000;//数据量
int c=0;
for(int i=100_0000;i<total+100_0000;i++){//假设分片键从100万开始
c++;//计数器统计循环的次数
//核心思想 i%count 取模,取模之后的余数值范围为0-count-1,其值对应的就是机器的节点编号
//键值为0即刚好是count的整数倍
int h=hash.calculate(Integer.toString(i));
//计数器,统计落在节点h上的数据量
bucket[h]++;
//从Map中取出节点H中存储的片键集合容器List,第一次肯定为空
List<Integer> list=hashed.get(h);
if(list==null){
list=new ArrayList<>();
hashed.put(h, list);
}
//把落在节点H中的数据扔到集合容器里面
list.add(i);
}
System.out.println(c+" "+total);
double d=0;
c=0;
int idx=0;
System.out.println("index bucket ratio");
//bucket中的值就是数据落在每个节点的数量,下标就是机器编号
for(int i:bucket){
//变量d是一个分布率求和统计,i代表落在节点的数量,total代表数据总数
d+=i/(double)total;
//统计各个节点的数据总和
c+=i;
//输出:机器节点下标 节点上数据总数 节点中数据占总数的比例
System.out.println("机器编号:"+(idx++)+",数据总数: "+i+" ,占比例: "+(i/(double)total));
}
System.out.println("分布率求和:"+d+" 各节点数据总数即路由总数: "+c);
System.out.println("****************************************************");
//取出在节点0的数据进行重新分布
rehashTest(hashed.get(0));
}
private static void rehashTest(List<Integer> partition) {
PartitionByMod hash=new PartitionByMod();
//注意节点0上的数据都是11的整数倍,现在机器节点达到110,
//所以节点1上的数据重新路由会落在11,22,33,99上面
//机器编号为0---109
hash.count=110;//分片数
hash.init();
//新数组用来统计每个节点存储的数据条数,数组下标从0开始编号,刚好和机器编号相同
int[] bucket=new int[hash.count];
int total=partition.size();//数据量
int c=0;
for(int i:partition){//假设分片键从100万开始
c++;
int h=hash.calculate(Integer.toString(i));
bucket[h]++;
}
System.out.println(c+" "+total);
c=0;
int idx=0;
System.out.println("index bucket ratio");
for(int i:bucket){
c+=i;
System.out.println(idx+++" "+i+" "+(i/(double)total));
}
}
public static void main(String[] args) {
hashTest();
//PartitionByMod partitionByMod = new PartitionByMod();
//partitionByMod.count=8;
//partitionByMod.calculate("\"6\"");
//partitionByMod.calculate("\'6\'");
}
}
结果验证:
疑问:各个节点分布数据的比例总和 为什么不是100%,而是99.9999%是因为机器存储浮点数的误差导致。
相关推荐
1. 数据分片:mycat2能够将大型数据库横向分割成多个小的数据节点,通过数据分片技术,实现海量数据的分布式存储,有效提升查询和写入性能。 2. 读写分离:mycat2支持主从复制的读写分离模式,将读操作分散到从库上...
mycat2(original-mycat2-1.22-release-jar-with-dependencies.jar)
1. **bin** 目录:包含了MyCat的启动脚本(如`mycat-start.sh`、`mycat-stop.sh`)、日志清理脚本等。 2. **conf** 目录:存放MyCat的配置文件,如`schema.xml`(定义数据节点和表的分片策略)、`server.xml`...
"mycat2" 和 "mycat" 指的是MyCat 2,这是一个开源的、基于Java语言开发的数据库中间件,常被用作数据库的分片工具,以实现大数据量下的高性能读写。"mycat2-install" 标签表明这是关于MyCat 2的安装相关知识,意味...
mycat2(mycat2-1.22-release-jar-with-dependencies.jar)
Mycat2是其最新版本,提供了一种更高效、更稳定的数据分片策略,使得在分布式环境下的数据管理和处理更为便捷。本文将围绕Mycat2 v1.21-2022-4-7源码进行深入探讨,旨在帮助开发者理解其核心机制,以便更好地利用这...
Mycat2 v1.21-2022-4-7源码(Mycat2-1.21-2022-4-7.zip)
mycat2(mycat2-1.22-release-jar-with-dependencies-2022-6-9.jar)
1. 数据分片:Mycat通过将大型数据库拆分为多个小的数据片,分布在不同的服务器上,实现了数据的水平扩展。这种策略可以有效地分散数据访问压力,提高查询效率,尤其是在面对海量数据时。 2. 读写分离:Mycat支持...
mycat2(mycat2-1.20-jar-with-dependencies.jar)
Mycat-server-1.6-RELEASE-20161028204710-linux.tar
此外,“15.MyCat - 订单模块 - 根据条件分页订单数据.avi”和“27.MyCat - 分片 - 微服务连接MyCat.avi”则展示了在订单模块这样的具体场景下,如何利用MyCat进行条件分页查询以及微服务与MyCat的无缝对接。...
mycat2(mycat2-1.22-test-jar-with-dependencies-2022-3-30.jar)
1. 解压`Mycat-server-1.6.7.5-release-20210616151418-win.tar.gz`,获取Mycat的服务器端程序。 2. 修改`conf/server.xml`配置文件,配置数据库连接信息、分片规则等。 3. 初始化Mycat,执行`bin/startup.sh`启动...
通过对Mycat-Server-1.6源码的学习,开发者可以了解其内部工作机制,优化SQL执行效率,定制分片策略,甚至为Mycat添加新的功能。同时,源码阅读也有助于提升数据库中间件的开发能力,对于分布式数据库系统的理解和...
mycat2-1.14
Mycat的核心设计理念是将单一的大数据库分解为多个小数据库,通过数据路由、读写分离、分片策略等手段,实现高并发、高可用的数据存储和访问。 在标题"Mycat-server-1.6.7.6-release-windows-linux.rar"中,我们...
《Mycat-server-1.6.6.1在Linux环境下的部署与应用》 Mycat是一款开源的分布式数据库中间件,它主要用于解决大数据环境下单机数据库的性能瓶颈问题,实现了数据的分布式存储和处理。Mycat-server-1.6.6.1是其在2018...
2. 初始化Mycat:运行`./mycat-start.sh`启动Mycat服务,首次启动会自动创建系统表。 四、Mycat配置 Mycat的配置主要通过修改conf目录下的相关配置文件完成: 1. server.xml:这是Mycat的主要配置文件,包含了...
- **配置文件**:主要配置文件包括 `server.xml`、`schema.xml` 和 `dataNode.xml`,它们定义了 Mycat 服务器的基本设置、数据库分片规则和数据节点信息。 - **启动与停止**:通过执行 `bin/mysqld.sh start` 启动...