全局序列号相关测试
mycat github上
https://github.com/MyCATApache/Mycat-Server
master分支进行全局序列号测试,经过测试,在多次版本更新后功能没有被损坏
https://github.com/MyCATApache/Mycat-Server
1.6.6-druid 分支进行本地文件方式的全局序列号测试
新版1.66-druid分支问题,因为更新druid版本1.10,因为mysql的语法是没有next value for mycatseq_xxxx这样的语法的,而sql server/ oracle是支持这种sql的..druid升级后,对MySQL的语法要求更为严格.考虑之后全局序列号这个功能统一使用函数调用的语法在mycat中表示.
SQLYOG上使用全局序列号的问题
1.6分支的全局序列号功能在sqlyog图形化客户端中的表现如下图
有警告提示,经过查看后端mysql的数据以及抓包分析,发现mysql中存有正确的插入结果,查看sqlyog的日志,发现sqlyog发送了带有explain的语句导致出现该警告
结论
可以忽略此警告
以下是使用数据库方式获取全局序列号通讯过程的一些抓包截图
Mycat发出获取数据库中全局序列号用到的SQL
数据库返回序列表中的当前id与步长
Mycat使用上述获得的id作为当前sql中插入语句所需的自增id组装成新的sql发送给数据
结论
本地文件方式,数据库方式, 本地时间戳方式, 分布式ZK ID生成器, Zk递增方式,这五种方式,其中数据库方式最为实用.本地文件方式因为存在当MyCAT重新发布后,配置文件中的sequence会恢复到初始值的瑕疵,并不实用.而本地时间戳方式, 分布式ZK ID生成器生成的id是64位二进制数,存在占用空间大,而且id本身掺杂一些其他的信息,导致使用该id作为分片主键存在一定的数据分布混乱的问题,可能需要获取数据之后进行排序.
Zk递增方式采用的是zookeeper作为全局id的方式进行递增,通讯开销大,性能较差,不建议使用.
分布式ZK ID生成器与Zk递增方式的区别是
分布式ZK ID生成器是在mycat启动的时候,连上zookeeper获取实例的id,并且读取本地的mycat集群配置信息,其后的id生成是在mycat实例本身内部处理的id递增
而Zk递增方式采用的是zookeeper作为全局id的方式进行递增,通讯开销大,性能较差,不建议使用.
数据库方式因为可以配置序列表在哪个节点上,而且把id递增的处理下放到了存储过程,较为实用.