背景
电子商务系统大量使用mysql数据库作为其交易和存储的系统; 随着商户和用户量的不断增长,mysql中存储的数据量会越来越大,这时把所有数据存储在一张表或者一个数据库中会极大的影响系统的性能和安全。 分库分表是业界一个比较通用的方案,并且也比较成熟。
为了进行分库分表,我们需要为业务表中设置一个唯一的id;举个商品中心的例子:为了把一个租户下的所有菜品,菜价,菜品分类放在一下,会在所有这些表上加上一个全局唯一的租户id。
全局id算法
经过我们前期的调研和讨论,我们最终选择了twitter的snowflake(详细介绍请参考分布式自增ID服务。), 算法生成64位的id如下:
未用
|
毫秒数
|
datacenterId
|
workId
|
毫秒内序列号
|
---|---|---|---|---|
1bit | 41bit | 5bit | 5bit | 12bit |
该算法在本地进程运行效率非常高,但datacenterId, 和workId需要在一个集群中被分配成唯一的;在实际应用中,datacenterId可能没有,那workId就是10个bit。
下面章节将重点介绍唯一workId的生成过程。
zookeeper生成唯一的workId
workId分配算法在zookeeper中的节点
0
invoicing标识进销存服务的节点。
lock是实现分布式锁的节点,Lock_i是临时顺序节点。
workId节点下存储每一个机器节点,key=ip1, data=workId1 (算法保证workId不重复),为永久节点。
zookeeper的节点类型