此文已由作者张镐薪授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

全局序列号

数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence)。

1. 本地文件方式

classpath下有一个sequence_conf.properties文件:

GLOBAL_SEQ.HISIDS=
GLOBAL_SEQ.MINID=1001
GLOBAL_SEQ.MAXID=1000000000
GLOBAL_SEQ.CURID=1000

HISIDS表示历史使用过的值,MINID为ID最小值,MAXID为ID最大值,CURID为当前值。 需要在server.xml加入如下配置:

<system><property name="sequnceHandlerType">0</property></system>

sequnceHandlerType 需要配置为 0,表示使用本地文件配置。 使用示例:

insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);

但是这么做,MyCat就不是无状态中间件,很难去做MyCat集群。而且,这样的id只是纯数字。最后,每次MyCat重新发布,id恢复初始值。所以,不推荐这种用法。

2.数据库方式

在数据库中建立一张表,存放 sequence 名称(name),sequence 当前值(current_value),步长(increment)每次读取多少个 sequence,假设为 K)等信息; server.xml:

<system><property name="sequnceHandlerType">1</property></system>

建表语句:

DROP TABLE IF EXISTS MYCAT_SEQUENCE;CREATE TABLE MYCAT_SEQUENCE (name VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 100, PRIMARY KEY(name)) ENGINE=InnoDB;INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES (‘GLOBAL’, 100000, 100);

创建相关function:

DROP FUNCTION IF EXISTS mycat_seq_currval;DELIMITERCREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf-8DETERMINISTICBEGINDECLARE retval VARCHAR(64);SET retval=“-999999999,null”;SELECT concat(CAST(current_value AS CHAR),“,”,CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;RETURN retval;ENDDELIMITER;– 讴置 sequence 值DROP FUNCTION IF EXISTS mycat_seq_setval;DELIMITERCREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64) CHARSET utf-8DETERMINISTICBEGINUPDATE MYCAT_SEQUENCESET current_value = valueWHERE name = seq_name;RETURN mycat_seq_currval(seq_name);ENDDELIMITER;– 获叏下一个 sequence 值DROP FUNCTION IF EXISTS mycat_seq_nextval;DELIMITERCREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf-8DETERMINISTICBEGINUPDATE MYCAT_SEQUENCESET current_value = current_value + increment WHERE name = seq_name;RETURN mycat_seq_currval(seq_name);ENDDELIMITER;

sequence_db_conf.properties指定 sequence 相关配置在哪个节点上

USER_SEQ=test_dn1

使用示例:

insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);

这样做虽然MyCat为无状态而且id有持久化,并且一次可以取出多个id,通过配置可以有主从切换。但是,id还是纯数字,没有有意义的信息,而且,MyCat主从切换并不可靠,id生成有故障,则整个服务都无法正常进行,这在架构上有单点问题,是不推荐的。

3.本地时间戳方式

ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) server.xml:

<system><property name="sequnceHandlerType">2</property></system>

sequence_time_conf.properties:

WORKID=0-31 任意整数DATAACENTERID=0-31 任意整数

4.通过继承或者重构相关类实现

修改源代码,主要是和MyCATSequnceProcessor相关的类,定制自己的id。之后源代码篇会讲

但是全局序列号还是推荐用独立的id生成器服务(独立于MyCat的服务)去实现最佳!

安装准备

环境

Red Hat Enterprise Linux Server release 6.6 (Santiago) java version "1.7.0_79"

软件

配置并部署zookeeper

只要部署好即可,默认配置,将conf/zoo_sample.cfg 重命名为conf/zoo.cfg。启动后验证下即可(因为目前只为了为监控服务)

配置MyCat

下载MyCat的源代码,并使用maven打包安装:mvn install -Dmaven.test.skip=true. 使用生成的linux下的tar.gz文件,解压。

1. 业务分析

接下来是我们的重点,MyCat的配置,还是拿之前的例子,我们只需要一个逻辑库(schema1),运单库则需要分成3片,客户库需要分成2片,统一由MyCat管理。业务上,客户和快递员查询和自己相关的运单比客户和快递员还有仓管员通过运单号查询相关信息的业务量少的,所以以运单为中心进行分片。  运单表根据运单号哈希取模分片; 运单子母件表作为运单表的子表; 快递员运单关系表作为运单表的子表; 客户运单关系表作为运单表的子表; 快递员信息变动不频繁,而且量不大,但是业务上基本没有需要和快递员join的场景,作为非分片表; 客户表根据客户id做哈希取模; 运单状态信息表,运单状态信息表记录状态的解释信息,做为公共表。

运单根据量放在3个分片节点上,客户根据量也放在两个分片节点上。(这里假设都撑得住未来10年的量,主要要考虑存储量级和tps/qps两个维度,采用涉及到哈希取模的分片规则,最好一开始就估计足量,避免未来的扩容麻烦)

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 selenium下拉框踩坑埋坑
【推荐】 后台服务项目的白盒测试之旅

数据库路由中间件MyCat - 使用篇(3)上篇的更多相关文章

  1. 数据库路由中间件MyCat - 背景篇(2)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MyCat的前世今生 如前文所说,Amoeba.Cobar.MyCat等属于同宗一脉.若Amoeba能继续下 ...

  2. 数据库路由中间件MyCat - 使用篇(1)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单 ...

  3. 数据库路由中间件MyCat - 源代码篇(13)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 4.配置模块 4.2 schema.xml 接上一篇,接下来载入每个schema的配置(也就是每个MyCat ...

  4. 数据库路由中间件MyCat - 源代码篇(7)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 3.4 FrontendConnection前端连接 构造方法: public Fronte ...

  5. 数据库路由中间件MyCat - 源代码篇(15)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. public static void handle(String stmt, ServerConnectio ...

  6. 数据库路由中间件MyCat - 源代码篇(14)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 对于表的dataNode对应关系,有个特殊配置即类似dataNode="distributed(d ...

  7. 数据库路由中间件MyCat - 源代码篇(12)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. NodeList ruleNodes = e.getElementsByTagName("rule ...

  8. 数据库路由中间件MyCat - 源代码篇(1)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 进入了源代码篇,我们先从整体入手,之后拿一个简单流程前端连接建立与认证作为例子,理清代码思路和设计模式.然后 ...

  9. 数据库路由中间件MyCat - 使用篇(4)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 配置MyCat 3. 配置conf/rule.xml 1.5GA版本中的规则配置比较笨,2.0中优化了一些, ...

随机推荐

  1. angularJs自定义模块

    <script type="text/javascript"> var myApp = angular.module("myApp",[]); my ...

  2. python连接redis并插入url

    #!/usr/bin/env python # -*- coding:utf8 -*- import redis ''' 这种连接是连接一次就断了,耗资源.端口默认6379,就不用写 r = redi ...

  3. 使用valgrind进行内存泄漏和非法内存操作检测

    valgrind是一个强大的工具,最常用的功能是用它来检测内存泄漏和非法内存的使用.要想让valgrind报告的更加细致,请使用-g进行编译. 基本命令如下: $ valgrind --tool=me ...

  4. windows10怎么开机启动虚拟机

    将如下脚本添加到windows计划任务中即可 "D:\Program Files (x86)\VMware\VMware Workstation\vmplayer.exe" &qu ...

  5. python关于文件路径和文件名的操作

    os.path.abspath(path) #返回绝对路径(包含文件名的全路径) os.path.basename(path) —— 去掉目录路径获取文件名 os.path.dirname(path) ...

  6. POJ 2976 Dropping tests:01分数规划【二分】

    题目链接:http://poj.org/problem?id=2976 题意: 共有n场考试,每场考试你得的分数为a[i],总分为b[i]. 你可以任意去掉k场考试. 问你最大的 100.0 * ( ...

  7. struts2的通配符与动态方法调用

    1.Action标签中的method属性 我们知道action默认的执行的方法是execute方法,但是一个action只执行一个方法我们觉得有点浪费,我们希望在一个action中实现同一模块的不同功 ...

  8. 《java编程思想》读后笔记:二,吸血鬼数字

    书本p75中一道读后练习思考题,题目如下: 吸血鬼数字是指位数为偶数的数字,可以有一对数字相乘得到,而这对数字各包含成绩的一半位数的数字,其中从最初的数字中选取的数字可以任意排序.一两个0结尾的数字是 ...

  9. STM32中IO口的8中工作模式

    该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两 ...

  10. 集训Day5

    生活还得继续 bzoj3771 题面让我笑了很长时间 给出 n个物品,价值为别为Xi且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? *顺序不同算一种 很傻逼的一个母函数+容斥,用A( ...