10.6 全局序列投票机制
全局序列分配中大块的 10000 的序列号值。
BDR 使用两级缓存的数据块。第一个层次用 nextval 立即消费和具有固定的大小的 10 块。 二级缓存,这用来填补第一二级缓存,是以投票方式表决。 二级缓存的大小默认为 5 块。这意味着 BDR 会在某个地方之间 100 和 15 万缓存在每个节点上的序列号。 如果这还不够(例如,应用程序在高峰期间消耗消耗序列的速度更快), 使用下面的命令可调整投票的高速缓存大小︰
ALTER SEQUENCE sequence_name SET (cache_chunks = 10);
上面的命令将更改投票缓存为10块(即10万个序列数字)。cache_chunks 的最小值是 5,最大值为100。
注︰ BDR 无法当前自动复制改变序列...设置命令 ALTER SEQUENCE ... SET (...),
所以上面的命令只会影响本地节点和需要手动在群集中的所有节点上执行或使用 bdr.bdr_replicate_ddl_command 执行。
这种限制会在后续的BDR版本中修复。
要确保没有块曾经分配给多个节点的节点之间进行投票。这项工作,足够多的节点必须是到达达到约束力的投票。BDR 需要一半的节点,再加上一个人,能够沟通,投票成功。
如果超过一半的节点已关闭或无法从给定的节点然后全局序列投票不能达到法定人数,所以在该节点上的全局序列中,不会分配新的大块。无法获得新的全局序列块最终会在该节点失败,并导致 nextval 调用︰
错误︰ 找不到空闲的序列值为全局序列
直到恢复连接下, 一轮的投票已经完成。
它是节点是可能的但孤立,无法获得新的全局序列块,而其余的 BDR 组继续正常运作。如果节点没有单独连接的组包含超过一半的总节点数,然后没有节点将能够分配全局序列块。
全局序列不是立即可以使用的。试图使用全局序列,立即后成立,但之前的第一轮投票已经发生,将导致这样的错误︰
错误︰ 全局序列 public.myseq 是尚未初始化
只是在使用序列之前插入延迟。
另请参阅全局序列限制。