小工具      在线工具  汉语词典  css  js  c++  java

使用mycat分表(一致hash)

mycat,java,中间件,mycat,一致性hash 额外说明

收录于:40天前

业务介绍

我们有一个横向分表的业务,本来是想自己搞的,但也想尝试下一些中间件,找到了mycat先试下,
现在是2017/12 , 版本采用 mycat1.6.5

安装及相关内容
https://github.com/MyCATApache/Mycat-Server

mysql准备

创建三个数据库:db1、db2、db3,并将它们添加到此表中:

CREATE TABLE `travelrecord` ( `id` bigint(20) NOT NULL, `user_id` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `traveldate` date DEFAULT NULL, `fee` decimal(10,0) DEFAULT NULL, `days` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

相关配置

cd /alidata/server/mycat/mycat

基本上默认配置 加下小修改就行了,主要是server.xml 和 scheme.xml
server.xml:

    <property name="serverPort">4566</property>
    <property name="managerPort">4567</property>  



    <firewall>
       <whitehost>
          <host host="*" user="abcefg"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>


    <user name="abcefg">
            <property name="password">abcefg2017</property>
            <property name="schemas">TESTDB</property>
    </user>

scheme.xml
按照官网的默认配置修改了下,简单配置:


<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">;
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <!-- auto sharding by id (long) -->
                <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost1" database="db2" />
        <dataNode name="dn3" dataHost="localhost1" database="db3" />

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostS1" url="127.0.0.1:3306" user="mycat" password="mycat123" />

        </dataHost>
      </mycat:schema>

如果你的内存不够,记得更改wrapper.conf中的内存配置。

Mycat服务(用mysql客户端访问):xxxx端口4566,用户xxx,密码xxx2017

实际数据库表地址:xxx端口3306用户mycat密码mycat123(里面有dn1、dn2、dn3)

启动

/xxx/mycat/mycat/bin/mycat start
/xxx/mycat/mycat/bin/mycat stop

mycat的一些策略

mycat的分片规则有很多,可能参考 其文档http://www.mycat.io/document/Mycat_V1.6.0.pdf
这里写图片描述

具体在规则配置上,则是rule.xml中
以下为我取的一个 一致性hash的配置

<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
                <property name="seed">0</property><!-- 默认是0 -->
                <property name="count">4</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
                <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
                <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则 以1代替 -->
        </function>

如果要使用就创建一个tableRule,算法参考这个杂音

        <tableRule name="rule-guid">
                <rule>
                        <columns>device_guid</columns>
                        <algorithm>murmur</algorithm>
                </rule>
        </tableRule>

在表映射的scheme.xml中,是这样引用的

<table name="tx_device_user_jiguang" primaryKey="device_guid" subTables="tx_device_user_jiguang0$0-3" dataNode="dn1" rule="rule-guid" />

一致性哈希分析

我们要使用其一致性hash,但不知道其具体的规则,于是找他们的源码以确认,源码可在其github中找
PartitionByMurmurHash.java
发现这个类的init的时候调用生成bucketMap,

private void generateBucketMap(){
    hash=Hashing.murmur3_32(seed);//计算一致性哈希的对象
    for(int i=0;i<count;i++){
   //构造一致性哈希环,用TreeMap表示
        StringBuilder hashName=new StringBuilder("SHARD-").append(i);
        for(int n=0,shard=virtualBucketTimes*getWeight(i);n<shard;n++){
            bucketMap.put(hash.hashUnencodedChars(hashName.append("-NODE-").append(n)).asInt(),i);
        }
    }
    weightMap=null;
}

使用时,使用

public Integer calculate(String columnValue) {
    SortedMap<Integer, Integer> tail = bucketMap.tailMap(hash.hashUnencodedChars(columnValue).asInt());
    if (tail.isEmpty()) {
        return bucketMap.get(bucketMap.firstKey());
    }
    return tail.get(tail.firstKey());
}

结合一致哈希的逻辑,可以确认generateBucketMap生成了一个主机数量*160(默认值160)的treeMap,其val为主机序列,而calculate方法,输入参数为field value,输出参数为主机序列。

提示,网上很多提到的bucketMapPathrule.xml配置在这里没有作用。看源码,好像有注释。 。 。

. . .

相关推荐

额外说明

day12---(05)登录实现流程

1、单一服务器登录模式 2、单点登录(分布式访问)

额外说明

【算法系列篇】分治-归并

文章目录 前言 什么是归并算法 1. 排序数组 1.1 题目要求 1.2 做题思路 1.3 Java代码实现 2. 数组中逆序对 2.1 题目要求 2.2 做题思路 2.3 Java代码实现 3. 计算右侧小于当前元素的个数 3.1 题目要求 3.2 做

额外说明

查看exe和dll等二进制文件时间戳(生成时间)的工具与方法介绍

目录 1、为何要查看二进制文件的时间戳 2、使用PEViewer工具查看文件的时间戳

额外说明

springboot 整合hbase

前言 作为大数据家族中的重要一员,在大数据以及海量数据存储方面,hbase具有重要的地方,本篇将从java对hbase的操作上,进行详细的说明; HBase 定义 HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库; HBase 数

额外说明

Vert.x - Web Validation 请求校验

一、Web Validation 上篇文章我们学习了 vertx 中使用 thymeleaf、freemarker 模板引擎,本篇文章我们学习下非常常用和实用的 Web Validation 请求校验器,Web Validation 可以用来对照 Spr

额外说明

SpringBoot 调用外部接口

SpringBoot 调用外部接口 一、第一种方式(HttpClient等) 使用插件方式,比如自带的HttpClient,或者OkHttp,甚至是原生的HttpURLConnection 等等,这里以HttpClient为例。 1、封装工具类 简单封装

额外说明

【Python】Python 练习:「技能树-预备知识」② 程序设计思想-2

目录 一、练习题 二、答案解析 (1)正确写法  ① 写法 1 ② 写法 2 ③ 写法 3 (2)错误写法 ① 写法 1 一、练习题 编程语言发明家 贡献者:幻灰龙 小知识: 【已知变量】 每个编程语言都有其内在的编程范式,体现着编程语言设计者的哲学。编

额外说明

Windows系统缺少iacenc.dll文件的问题解决办法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个iacenc.dll文件(挑

额外说明

解决Windows系统目录azroleui.dll文件丢失找不到等问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个azroleui.dll文件

额外说明

甲骨文2

一、用户管理和表空间 注意:做开发时,建立好表空间,建立用户,再通过角色赋权限( grant connect to zhangsan,grant resource to zhangsan) oracle中如何新建数据库 Oracle中的一个数据库实例对应

ads via 小工具