我们都很清楚单机单库中的sequence处理,像oracle就直接提供sequence的支持,在mysql,则有 auto increament 字段的支持,我们很方便的就是先一个自增的不重复的id序列,但在分库分表后,sequence 就遇到了一点麻烦。
sequence 在多机的情况下,我们可以从唯一性、连续性考虑解决问题。
如果不考虑连续性,uuid 就是一个能保证唯一性的生成方式,或者根据自己的业务情况使用各种种子(例如,ip,mac,机器名,时间,本机计数器等因素)来生产唯一的id。
在考虑唯一性和连续性的情况下,我们可以把所有id都集中在一个地方进行管理,即提供一个统一id生成器服务,每台机器都从这里获取id,但是,这个服务会面临几个问题:
1. 性能问题,每次都需要跟服务打交道,获取id。
2. 生成器稳定性问题,id生成器服务成为一个关键的集群稳定性因素
3. 存储问题,底层存储需要的空间比较大,需要根据不同类型进行对应的容灾处理。
关于存储问题,可以选择同一存储,控制并发,也可以将id生成器的连续id分段,分别分配给各个机器,各个机器上有自己的id生成器(根据分配到的id段生产id),各个机器的id生成器需要跟id生成服务保持心跳,确保id段不够用时,能分配到下一段可用的id段,以适应业务的需求。