Scylla如何为Token/表范围扫描读查询实现一致性级别?
Scylla中Token范围/表扫描查询的一致性级别实现机制
在Scylla里,处理Token范围查询(比如SELECT * FROM table WHERE token(key) >= start AND token(key) <= end)或全表扫描时,一致性级别(CL)是针对每个分区单独生效的,而非对整个Token范围一次性处理。
具体逻辑如下:
- 执行范围查询时,Scylla会先将目标Token范围拆解为单个分区的集合,随后逐个处理每个分区的读取请求。
- 对每个分区,都会严格遵循你指定的一致性级别要求:向该分区的副本集发起读取请求,直到收集到满足CL要求的有效响应数量后,才会将该分区的数据纳入结果集。
- 举个实际例子:如果设置的一致性级别是
QUORUM,那么针对每个分区,Scylla都会确保从该分区的副本中收集到超过半数的有效响应,才会返回这个分区的数据。 - 这种设计的核心原因在于,每个分区的副本分布、数据一致性状态都是独立的,针对单个分区应用CL能确保查询结果中每个分区的数据都符合你要求的一致性标准。
需要补充的是:和单分区读取逻辑一致,如果某个分区的读取无法满足指定CL(比如副本不可用),Scylla会按照配置的重试策略进行重试;若最终仍无法满足要求,查询会直接抛出错误,不会跳过该分区返回部分结果(除非你额外配置了允许不一致读取的参数)。
内容的提问来源于stack exchange,提问作者Rado Buransky
相关产品推荐
相关产品推荐

