Logstore读写日志必定保存在某一个分区(Shard)上。每个日志库(Logstore)分若干个分区,每个分区由MD5左闭右开区间组成,每个区间范围不会相互覆盖,并且所有的区间的范围是MD5整个取值范围。

分区范围

创建Logstore时,指定分区个数,会自动平均划分整个MD5的范围。每个分区均有范围,可用MD5方式来表示,且必定包含于以下范围中:[00000000000000000000000000000000,ffffffffffffffffffffffffffffffff)。

分区的范围均为左闭右开区间,由以下Key组成:

  • BeginKey:分区起始的Key值,分区范围中包含该Key值。
  • EndKey:分区结束的Key值,分区范围中不包含该Key值。

分区的范围用于支持指定Hash Key的模式写入,以及分区的分裂和合并操作。在向分区读写数据过程中,读必须指定对应的分区,而写的过程中可以使用负载均衡模式或者指定Hash Key的模式。负载均衡模式下,每个数据包随机写入某一个当前可用的分区中,在指定Hash Key模式下,数据写入分区范围包含指定Key值的分区。

例如,某Logstore共有4个分区,且该Logstore的MD5取值范围是[00,FF)。各个分区范围如下表所示。

分区号 范围
Shard0 [00,40)
Shard1 [40,80)
Shard2 [80,C0)
Shard3 [C0,FF)

当写入日志时,通过指定Hash Key模式指定一个MD5的Key值是5F,日志数据会写入包含5F的Shard1分区上;如果指定一个MD5的Key值是8C,日志数据会写入包含8C的Shard2分区上。

分区的读写能力

每个分区可提供一定的服务能力:

  • 写入:5MB/s,500次/s
  • 读取:10MB/s,100次/s

建议您根据实际数据流量规划分区个数,流量超出读写能力时,及时分裂分区以增加分区个数,从而达到更大的读写能力;如您的流量远远达不到分区的最大读写能力时,建议您合并分区以减少分区个数,从而节约分区租赁费用。

例如,如果您有两个readwrite状态的分区,最大可以提供10MB/s的数据写入服务,但如果您实时写入数据流量达到14MB/s,建议分裂其中一个分区,使readwrite分区数量达到3个。如果您实时写入数据流量仅为3MB/s,那么一个分区即可满足需要,建议您合并两个分区。

说明
  • 当写入的API持续报告403或者500错误时,通过Logstore云监控查看流量和状态码判断是否需要增加分区。
  • 对超过分区服务能力的读写,系统会尽可能服务,但不保证服务质量。

分区的状态

分区的状态包括:

  • readwrite:可以读写
  • readonly:只读数据

创建分区时,所有分区状态均为readwrite状态,分裂或合并操作会改变分区状态为readonly,并生成新的readwrite分区。分区状态不影响其数据读取的性能,同时,readwrite分区保持正常的数据写入性能,readonly状态分区不提供数据写入服务。

在分裂分区时,需要指定一个处于readwrite状态的ShardId和一个MD5。MD5要求必须大于分区的BeginKey并且小于EndKey。分裂操作可以从一个分区中分裂出另外两个分区,即分裂后分区数量增加2。在分裂完成后,被指定分裂的原分区状态由readwrite变为readonly,数据仍然可以被消费,但不可写入新数据。两个新生成的分区状态为readwrite,排列在原有分区之后,且两个分区的MD5范围覆盖了原来分区的范围。

在合并操作时,必须指定一个处于readwrite状态的分区,指定的分区不能是最后一个readwrite分区。服务端会自动找到所指定分区的右侧相邻分区,并将两个分区范围合并。在合并完成后,所指定的分区和其右侧相邻分区变成只读(readonly)状态,数据仍然可以被消费,但不能写入新数据。同时新生成一个 readwrite 状态的分区,新分区的MD5范围覆盖了原来两个分区的范围。