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

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

全局序列号

数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(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. svn服务器 vim 修改 authz passwd 添加用户

    进入svn服务器 vim 修改 authz passwd 添加用户 SVN服务器之------2,配置PhpStorm连接SVN服务器(其他IDE大同小异) - 学到老死 - 博客园 https:// ...

  2. Tomcat学习笔记【1】--- WEB服务器、JavaEE、Tomcat背景、Tomcat版本

    本文主要讲学习Tomcat需要知道的基础知识. 一 Web服务器 1.1 简介 Web服务器可以解析HTTP协议.当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面 ...

  3. 如何利用Windows System Image Manager制作一个answer file

    打开Windows System Image Manager 从菜单中创建一个新的Answer File 在窗体左下部的Windows Image处右键,选择菜单Select Windows Imag ...

  4. hdoj 1116 Play on Words 【并查集】+【欧拉路】

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  5. Java for LeetCode 095 Unique Binary Search Trees II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  6. webpack笔记1

    1.设置多个入口起点 多用于提取公共类库 a.利用commonChunkPlugin const webpack= require('webpack'); const path = require(' ...

  7. 用vector代替实现二维数组

    vector可以用来模拟数组,当然也可以用来模拟二维数组: 定义如:vector<int>a[100];   相当于定义了一个100行的数组,当每行的大小是不确定的 模板应用如下: #in ...

  8. hdu1015 —— 回溯

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015 因为之前看了下刘汝佳的<算法入门经典>,就用类似打印全排列,八皇后的方法做.本以为不 ...

  9. 勤于思考:Objective-C特性的扩展

    赋值 assign:直接赋值.默认 @interface Car : NSObject { NSString *_name; } @property (assign,nonatomic) NSStri ...

  10. kettle 设置变量

    以下只是本人在使用过程中一些经验,可能有误解不对的地方,希望大家指正. 这个控件可以在job中调用,也可以在transformation中使用.下面将分别说明在两个不同任务中调用时的使用方法和需要注意 ...