【 使用环境 】生产环境
【 使用版本 】4.3.5
【问题描述】目前业务需求,自增列,强有序,目前看到ob在order模式+auto_increment_cache_size设置为默认值,在进行primary zone切主和observer宕机的场景下,会出现跳变,因此有什么办法可以避免跳变吗?将auto_increment_cache_size设为1,理论上可以避免跳变,但是会引发什么问题?
6 个赞
目前ORDER 模式保证的是「全局单调递增」,不是「严格连续无空洞」。Primary Zone 切主、Observer 宕机(若是 GAIS Leader)都会触发跳变。 避免在业务高峰做 Primary Zone 切换
4 个赞
鱼与熊掌不可得兼。
2 个赞
dd
2 个赞
跳变的根因就是 auto_increment_cache_size 这个缓存:每个 observer 会预取一段自增值缓存在内存里,切主或宕机时没用完的那段就被丢弃,下一段从更高的水位开始,看起来就跳了。设成 1 确实能做到严格连续(每次都向全局取),但代价是每次插入都要走一次自增值分配,开销明显变大,高并发写入吞吐会下降、还容易在分配上形成热点,生产大批量写入不建议。折中:如果只要求递增不回退、不强求绝对连续,保持 order 模式把 cache 调小一点即可;如果业务强依赖连续无跳变,建议改用业务侧发号(单独的号段/序列服务),比靠自增列更可控。
4 个赞
有这么严格业务要求吗,不能跳变,那只能自己代码实现了
写得真好,学习了。
1 个赞