Cassandra 3.11中nodetool repair的-local与-dc参数执行差异问题
Cassandra 3.11 nodetool repair 命令差异及报错原因说明
两条命令的核心区别
- 第一条命令
nodetool repair -local -pr demo msisdn-local参数的作用是限定修复操作仅在当前节点所属的本地数据中心内执行,该参数的内部处理逻辑适配-pr(主范围修复)的运行规则,因此可以正常执行,返回修复成功的结果。 - 第二条命令
nodetool repair -dc datacenter1 -pr demo msisdn-dc参数的作用是手动指定一个或多个数据中心执行修复,在Cassandra 3.11版本的设计中,该参数和-pr的组合存在校验限制,不符合规则时会直接抛出错误。
报错根因说明
-pr即主范围修复,设计目的是避免集群内重复修复相同的令牌范围,降低修复资源开销,其底层校验规则要求:主范围修复必须覆盖集群内所有持有对应主范围副本的节点,否则会出现数据一致性校验不完整的问题。
当你仅用-dc指定单个数据中心运行-pr修复时,其他数据中心内持有对应主范围副本的节点未参与修复,不符合上述校验规则,因此Cassandra直接拦截该操作,抛出如下报错:
error: Primary range repair should be performed on all nodes in the cluster.
而-local参数可以正常搭配-pr运行,是因为其内部实现逻辑做了特殊适配:如果是单数据中心集群,-local默认覆盖集群所有节点,完全符合-pr的运行要求;如果是多数据中心集群,-local搭配-pr时,Cassandra会默认仅校验本地数据中心内的主范围副本一致性,不校验其他数据中心的节点状态,因此不会触发拦截规则。
内容的提问来源于stack exchange,提问作者Divyanshu Sharma
相关产品推荐
相关产品推荐

