Cassandra nodetool repair 原理、操作详细解释

2024-01-04 00:59

本文主要是介绍Cassandra nodetool repair 原理、操作详细解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、为什么需要修复?

Cassandra 为了保证数据的可用性不丢失,一个数据往往多个节点备份。 当一个节点数据发生改变,其他备份节点节点可能因为宕机、网络不通畅,高负载导致长时间gc原因, 数据没有及时同步,会出现数据不一致的情况,这个时候需要进行node repair

在这里插入图片描述

二、Casandra 三种修复方式:

1、Hinted Handoff(写入修复)

数据在写入的时候没有完成同步,会在协调节点上记录hint log (留下日志记录)。 当备份节点恢复正常,可以写入的时候,系统根据日志记录,完成修复。

在这里插入图片描述

可以配置的参数(Cassandra.yaml)

•hinted_handoff_enabled

•max_hint_window_in_ms (默认3 小时)

•write_request_timeout_in_ms(默认1s)

2、读修复

Cassandra 根据读 Consistency Level , 读取相应的副本,并比较副本内容,返回最新版本数据。

如果副本之间内容不一致,后台就会启动读修复,以最新版本的数据为基准修复其他节点数据

在这里插入图片描述

3、反熵修复(手动修复)
3.1 主要使用的是 nodetool repair 命令
3.2 意义:

集群负载过大,频繁的宕机,或者删除数据,会导致数据不一致,读修复和写修复有时候不能维持集群的健康.

3.3 过程:

1)为每个副本构建 Merkle tree

2)比较Merkle tree , 发现不一致,进行修复
(merkle树的定义可以参考: https://www.cnblogs.com/s-lisheng/p/11301063.html)

在这里插入图片描述

三、Casandra 手动修复命令参数详解

1、Full repair vs incremental repair (-full vs -inc)
  • Full repair
    为所有sstable构建完全Merkle tree,做一次全面扫描, 对所有不一致数据数据进行修复
  • Incremental Repair:
    将数据分成repaired 和 unrepaired, 只修复unrepaired的数据33在这里插入图片描述
Parallel repair vs Sequential repair (-seq vs -par)
  • Sequential Repair

先为副本创建快照, 协调节点使用Merkle tree 依次比较各个副本,遇到差异使用快照对各个节点进行修复

特点: 对节点CPU资源占用较小,但是修复速度慢

  • Parallel Repair

同时为各个节点创建Merkle tree, 然后同时比较,对不一致节点数据进行修复

特点: 对节点CPU等资源占用较大, 但是修复速度快

3、 partitioner range repair (-pr)

概念:Token Ranges
[参考]

假设有一个集群:

(节点数:10; Token:100; 复制因子:3)

数据分布如下:

token1–10 : N1, N2, N3;

token:11–20 :N2, N3, N4;

token:21–30 :N3, N4, N5

在这里插入图片描述
N3 拥有token 数为 1-30 的数据,假设在N3 运行 nodetool repair, 它会修复token 1-30的数据

N4 拥有token 树为 11-40 的数据,如果在N4上运行nodetool repair, 它会修复token 11 - 40 的数据, 发现重复修复,效率降低了,所以需要使用 partitioner range repair

如果在N3上运行 nodetool repair -pr, 只会修复 token 为20 - 30 的数据,避免重复修复

使用方法: 这个命令必须在集群中每个节点上运行,否则会导致部分数据没有修复

四、Casandra 手动修复集群的建议

  • 定时运行 nodetool repair , 及时没有删除数据,服务器宕机等情况
  • 节点宕机之后,故障处理完毕,重新加入集群
  • 对某些数据进行修改之后(如删除), 但是这些数据不经常被读
  • 恢复丢失数据或者破损了的SSTable( 这种必须使用full repair)

参考网站:

Repairing nodes
Anticompaction in Cassandra 2.1

这篇关于Cassandra nodetool repair 原理、操作详细解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567639

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数