日志流的数量 = 最高优先级的 Primary_Zone 数 * UNIT_NUM 数
但是这个均衡是什么意思?只要在租户执行 UNIT_NUM
变更、修改 PRIMARY_ZONE
的第一优先级、修改 Locality(影响 PRIMARY_ZONE
)等操作后,日志流的数量满足上述公式要求就算满足日志流均衡了么?还是说日志流的数量分布要满足什么条件才算达到日志流数量均衡?
这里说的日志流数量均衡指的是日志流leader数量均衡,就相当于Primary_Zone内的每个OBServer都会有日志流的leader节点,这种情况就满足日志流均衡。
不明觉厉,问题我都没有看明白
这个公式并不准确。
从设计目的的角度去理解,日志流是数据同步方向的抽象管理。
举例:租户有三副本,分布在三个节点上,那么数据同步方向有哪几种呢?放在传统的数据库1主2备上,同步方向就是 1出2进3进。 在 OB 里就是 primary_zone 设置为 zone1, 一个日志流 (ls_id=1001) 就够了。实际上还有个默认的日志留 ls_id=1,是租户的ob内部表数据的同步,它是独立的日志流。
ob跟传统不一样的地方就是三个节点它既可以单点写入,也可以多点写入。当有两个zone 可以写入数据的时候,其数据就要同步出去,所以 1出&进2出&进3进,就有两个日志流 ls_id=1001 和 1002 分别分布在租户的两个节点上。如果是三个节点都可以写入,那么每个节点都有数据出和进,就有三个日志流(1001,1002,1003)。这里例子是一个 unit_num。当unit_num =2 的时候,这个业务的日志流数量就是公式中描述的一样。
但是这个公式并不准确,因为还有个特例,复制表。复制表的副本数在 unit-num=2的时候 是6个,不是3个,所以复制表的同步方向跟别的数据不一样的,需要一个独立的日志流。
每个日志流对应的一批数据(分区),这是 OB 自动分配的,用户能干预的就是设置 primary_zone 。 分区会在多个日志流中均衡,用户不能干预。文章里说“日志流均衡”这个概念就是以前说的“数据负载均衡”是一样的,都是一种对 OB 数据分布特征的解释逻辑。只不过文章中逻辑推测很可能是从代码实现的逻辑角度去解释,有点难以理解为什么要这样。只要想想这样做最终的目的效果是怎样就更好理解。
日志流是 OB v4 重构的一个功能,在 V1/2/3 版本,租户副本间数据同步的粒度是分区,各个分区的同步都是独立的,这个制约了OB 的单机能力。OB V4 的日志流设计将这种数据同步的粒度变粗到接近实例级别,但是比实例级别可以小一个粒度。传统数据库的主备同步就可以理解为实例级别的同步(备实例就全部是备,不能写)。
好全面
最高优先级和primary_zone就是frist__level_primary_zone_num。比如2-2-2的集群,租户的primary_zone设置成zone1,zone2;zone3,那么日志流leader就是 2 * 2 加上面 obpilot 老师说的ls=1和复制表的日志流,这4~5个日志流leader就分区在这4台机器上
大佬解释的太全面了
看了大佬的回复,我去翻了相关代码,确实官档中关于日志流数量均衡的解释是从代码角度入手的。
这段代码和官档中的这个表格基本是一致的
从代码来看,日志流数量均衡的含义应该是任意一个unit group中日志流的个数少于最高优先级primary_zone的个数或者日志流的个数多于最高优先级primary_zone的个数就不算达到日志流数量均衡,也就是日志流数量均衡的条件是每个unit group中日志流的数量应该等于最高优先级primary_zone的个数。
不过日志流数量均衡应该是OB自身的机制保证的,不需要用户介入处理。不像分区均衡,用户可以进行transfer操作。