Cassandra中避免僵尸数据 无需清理宕机恢复节点的解决方案咨询
Cassandra宕机超gc_grace_seconds节点无清理上线防僵尸数据方案
以下方案均无需清空宕机节点本地数据,即可避免过期数据同步引发的僵尸数据问题:
方案1:关闭自动引导后执行全量修复
操作步骤如下:
- 编辑宕机节点的
cassandra.yaml配置文件,将auto_bootstrap参数设置为false,该配置会禁止节点启动时主动和集群其他节点进行数据双向同步 - 启动该节点,此时节点仅会加入集群,但不会对外提供读写服务,也不会主动推送本地旧数据到其他节点
- 在该节点执行全量修复命令:
nodetool repair -full --all,全量修复会逐一对比该节点和集群其他副本的数据,自动清理本地早于其他节点墓碑的过期数据,同时同步该节点缺失的最新数据 - 待全量修复全部完成后,将
auto_bootstrap参数改回true,重启节点即可正常对外提供服务
注意:如果集群表数量较多,可以将--all替换为指定的keyspace和表名,分批次执行修复,降低集群压力
方案2:启动后禁用通讯端口后执行全量修复
如果不想修改节点配置文件,可以使用该方案:
- 正常启动宕机节点后,立刻执行以下命令关闭节点的通讯和服务端口,避免本地数据同步到集群,也不响应业务请求:
nodetool disablegossip nodetool disablebinary nodetool disablethrift - 执行全量修复命令:
nodetool repair -full --all,修复逻辑和方案1一致 - 修复完成后执行以下命令恢复节点服务即可:
nodetool enablegossip nodetool enablebinary nodetool enablethrift
适用说明
以上两个方案均比清空节点后重新bootstrap的效率更高,尤其是节点存储数据量较大时,可节省大量全量数据拉取的时间,仅需要同步差异数据即可。需要注意的是必须使用全量修复,不可使用增量修复,增量修复无法处理已被清理的墓碑对应的过期数据问题。
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

