目录
一、全局序列号介绍
1、本地文件方式
2、数据库方式
3、本地时间戳方式
4、分布式 ZK ID 生成器
5、ZK 递增方式
6、其它方式
二、准备工作
环境
1、在 MySQL 建库
2、在 MySQL 建表
3、配置schema.xml 文件(按月分表)
4、配置 rule.xml 文件
5、配置 server.xml 文件
6、重新启动 mycat
7、查看表分片情况
三、配置方式详解
1、本地文件方式
1.1 修改配置文件 server.xml,指定加密方式为本地文件方式
1.2 在 schema.xml 文件中配置,增加表 t_im_msg_wf,msg_id 为主键,在 mycat_wf$1-3 分片上,分片方式为sharding-by-month
1.3 修改 sequence_conf.properties 文件中做如下配置:
1.4 重新启动 mycat
1.5 插入数据测试
1.6 测试成功总结
2、数据库方式
3、本地时间戳方式
3.1 修改配置文件 server.xml 配置
3.3 在 schema.xml 文件中配置,增加表 t_im_msg_wf,msg_id 为主键,在 mycat_wf$1-3 分片上,分片方式为sharding-by-month
3.4 重启 mycat
3.5 插入测试数据
3.6 测试成功总结
4、分布式 ZK ID 生成器
4.1 配置 zookeeper
4.2 配置 mycat
4.3 上面三个文件修改完成后,复制conf下的所有文件到 conf/zkconf/目录下,并授权
4.4 初始化
4.5 启动 mycat
4.6 测试mycat ZK 分布式ID生成器
4.7 测试成功总结
5、ZK 递增方式(配置同 4)
5.1 配置 sequence_distributed_conf.properties 通过配置文件配置InstanceID
5.2 配置 sequence_distributed_conf.properties 中 INSTANCEID=ZK 就是从ZK 上获取InstanceID
5.3 测试成功总结
一、全局序列号介绍
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局 sequence,并且提供了包含本地配置和数据库配置等多种实现方式。
1、本地文件方式
使用服务器本地磁盘文件的方式
2、数据库方式
使用专用数据库方式
3、本地时间戳方式
使用时间戳算法方式
4、分布式 ZK ID 生成器
基于 ZK 与本地配置的分布式 ID 生成器(可以通过 ZK 获取集群(机房)唯一 InstanceID,也可以通过配置文件配置 InstanceID)
5、ZK 递增方式
另一种 ZK 生成方式
6、其它方式
二、准备工作
MySQL:5.7.16
MyCAT:1.6.5
Zookeeper:3.4.9
JDK:1.8.0_144
1、在 MySQL 建库
|
2、在 MySQL 建表
|
3、配置schema.xml 文件(按月分表)
|
4、配置 rule.xml 文件
|
5、配置 server.xml 文件
|
6、重新启动 mycat
|
7、查看表分片情况
|
三、配置方式详解
1、本地文件方式
配置方式:
在sequence_conf.properties文件中做如下配置:
|
其中HISIDS 表示使用过的历史分段(一般无特殊需要可不配置),MINID 表示最小ID 值,MAXID 表示最大
ID 值,CURID 表示当前ID 值。
server.xml 中配置
|
注:sequnceHandlerType 需要配置为0,表示使用本地文件方式;1 表示专用数据库方式。
使用示例:
|
缺点:当MyCAT 重新发布后,配置文件中的sequence 会恢复到初始值(重启 MyCAT 需要重新配置sequence_conf.properties文件)。
优点:本地加载,读取速度较快。
【本地文件方式详细配置及测试】
1.1 修改配置文件 server.xml,指定加密方式为本地文件方式
|
1.2 在 schema.xml 文件中配置,增加表 t_im_msg_wf,msg_id 为主键,在 mycat_wf$1-3 分片上,分片方式为sharding-by-month
|
1.3 修改 sequence_conf.properties 文件中做如下配置:
|
1.4 重新启动 mycat
1.5 插入数据测试
插入一条使用T_IM_MSG_WF序列号的数据
|
查看序列号使用
|
根据分区间多插入一些数据
|
这些数据在分片上的情况
|
1.6 测试成功总结
|
2、数据库方式
|
|
3、本地时间戳方式
ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加)
即换算成十进制为19位数的long类型,每毫秒可以并发12位二进制的累加。
3.1 修改配置文件 server.xml 配置
|
3.2 修改 sequence_time_conf.properties 文件配置
|
3.3 在 schema.xml 文件中配置,增加表 t_im_msg_wf,msg_id 为主键,在 mycat_wf$1-3 分片上,分片方式为sharding-by-month
|
3.4 重启 mycat
3.5 插入测试数据
插入一条使用本地时间戳方式的数据
|
查看时间戳方式的使用
|
根据分区键多插入一些数据
|
这些数据在分片上的情况
|
3.6 测试成功总结
|
4、分布式 ZK ID 生成器
配置选项:
|
原理说明:
Zk 的连接信息统一在myid.properties 的zkURL 属性中配置。
基于ZK 与本地配置的分布式ID 生成器(可以通过ZK 获取集群(机房)唯一InstanceID,也可以通过配置文件配置InstanceID)ID 结构:long 64 位,ID 最大可占63 位
|
|
|
|
一共63 位,可以承受单机房单机器单线程1000*(2^6)=640000 的并发。
无悲观锁,无强竞争,吞吐量更高
配置文件:sequence_distributed_conf.properties,只要配置里面:INSTANCEID=ZK 就是从ZK 上获取InstanceID。
4.1 配置 zookeeper
zookeeper是hadoop的一个子项目
一般生产上需要配置zookeeper集群,奇数个节点,至少三个节点
为了测试mycat的相关特性,我们只搭建一个单节点的zookeeper
安装Zookeeper:
|
注意:防火墙的配置自行处理
ZooKeeper 分布式模式(搭建生产网络或夸机房分布式的时候再进行补充)
4.2 配置 mycat
修改 myid.properties 文件(注意真正的配置文件中不要再配置参数后再加#的注释,并且检查参数后是否有空格)
|
修改 server.xml 文件
|
修改 sequence_distributed_conf.properties 文件
只要配置里面:INSTANCEID=ZK 就是从ZK 上获取InstanceID,否则通过配置文件配置InstanceID。
NSTANCEID=ZK #代表使用zk
CLUSTERID=010 #与myid.properties中的CLUSTERID设置的值相同
|
4.3 上面三个文件修改完成后,复制conf下的所有文件到 conf/zkconf/目录下,并授权
# cp *.txt *.xml *.properties zkconf/
# chown -R zkconf/
4.4 初始化
# cd /data/mycat-1.6.5/mycat/bin
# ./init_zk_data.sh
4.5 启动 mycat
先使用console看看启动是否正常
|
正常之后再正常启动
|
4.6 测试mycat ZK 分布式ID生成器
插入一条使用ZK 分布式ID生成器方式的数据
|
查看ZK 分布式ID生成器方式的使用
|
根据分区键多插入一些数据
|
这些数据在分片上的情况
|
4.7 测试成功总结
只是ID 非递增。
5、ZK 递增方式(配置同 4)
|
5.1 配置 sequence_distributed_conf.properties 通过配置文件配置InstanceID
|
插入多条使用递增ZK 分布式ID生成器方式的数据,并查看
|
5.2 配置 sequence_distributed_conf.properties 中 INSTANCEID=ZK 就是从ZK 上获取InstanceID
|
插入多条使用递增ZK 分布式ID生成器方式的数据,并查看
|
这些数据在分片上的情况
|
5.3 测试成功总结
分布式ZK ID生成器还是很强大,这为数据库跨机房双活提供了新的方案,使得双A机房架构下的数据最终一致性有了新的思路。