《ClickHouse原理解析与应用实践》关于P239[分片规则]错误的地方
《ClickHouse原理解析与应用实践》关于P239[分片规则]错误的地方
快过年了,坚守到最后一天。
刚好开发有新的想法,需要用到ReplacingMergeTree引擎实现去重或删除数据功能实现不匹配。
但是对于分布式表来说,数据需要落到同个分区同个分片是去重的前提。
于是研究怎么落到同个分片。
《ClickHouse原理解析与应用实践》一书中,P239(如下图)对于分片区间,第二个的[10,20)是错误的。
在不知道错误的前提下,阅读起来是非常纳闷的,因为书里边没有提到区间是怎么划分的,怎么就出来个[10,20),而不是[10,30)。
我一开始看的时候就觉得有种违和感,总觉得有问题,但因为不知道区间划分规则就不好说。
网上查资料,大多是不相关的,有也是就是这本书摘抄的。CK资料太少了。。。
于是,去官网找(还不好找)。。
终于是弄明白了。
这里引用中文官档的一段话:
选择将一行数据发送到哪个分片的方法是,首先计算分片表达式,然后将这个计算结果除以所有分片的权重总和得到余数。该行会发送到那个包含该余数的从’prev_weight’到’prev_weights + weight’的半闭半开区间对应的分片上,其中 ‘prev_weights’ 是该分片前面的所有分片的权重和,‘weight’ 是该分片的权重。例如,如果有两个分片,第一个分片权重为9,而第二个分片权重为10,则余数在 [0,9) 中的行发给第一个分片,余数在 [9,19) 中的行发给第二个分片。
说的更明白通俗点,以官档的例子说明,
第一分片权重:9 第二分片权重:10 则每个分片对应区间为:[a,b)
[a,b)区间,左边总是闭区间,右边总是开区间
a等于当前分片的前边所有分片权重和(不包括当前分片),b等于到当前我这个分片为止所有分片的权重和。
这里第一分片对应区间这么算:
a=当前分片(第一分片)前边所有分片(它前边没分片)权重和为0
b=到当前我这个分片(第一分片)所有分片的权重和,也就是只有第一分片,为9
因此第一分片对应区间为[0,9)。
同样的,
第二分片对应区间这么算:
a=当前分片(第二分片)前边所有分片权重和为9
b=到当前我这个分片为止(第二分片)所有分片的权重和,也就是只有第一+第二,为9+10=19
因此第二分片对应区间为[9,19)
这好理解了吧......
因此书里边的是错误的,
第一分片权重:10 第二分片权重:20
那么,第一分片区间应为[0,10)
第二分片区间应为[10,10+20),即[10,30)。
在搞个3分片的例子,好好体会......
第一分片权重:5 第二分片权重:10 第三分片权重:10
第一分片对应区间:[0,5)
第二分片对应区间:[5,5+10),即[5,15)
第三分片对应区间:[5+10,5+10+10),即[15,25)
至此。(赶紧到周五回家过年)。