Cassandra 数据一致性修复 repair 来龙去脉

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 文章分3块:1.为什么需要repair?;2.repair大概流程?;3.repair可能的问题。

Cassandra repair 流程

文章分3块:1.为什么需要repair?;2.repair大概流程?;3.repair可能的问题。

为什么需要repair

cassandra 如何修复副本数据

我们知道Cassandra是一个强调最终一致性的系统,副本间的数据并不能保证强一致(但是从客户端角度,通过QUORUM等级别读写还是可以保证客户端视角的强一致[1])。因为副本间数据是最终一致,所以Cassandra通过hinted-handoff、read-repair、repair 进行副本间数据补齐;这三个方式各有优缺点:

  • hinted-handoff 用来补齐节点挂掉期间的数据,但是挂掉时间太久这个特性会失效且hint机制存在数据可靠性风险;
  • read-repair:只有被读到的不一致数据才会被修复,那么如果没有被读到的数据很多怎么办?
  • repair:全量的修复方案,保证做多个副本在某个时间点(触发repair时刻)前的数据全量修复一致。

从上述描述看出,repair是一个兜底修复副本数据的方案,那么既然上面说了,通过quorum可以保证客户端视角的强一致,我们还需要通过repair来修复全量副本数据么?答案是:必须要,而且官方也建议在一定周期(gc_grace_seconds)内必须要做一次[2],才能保证系统的正确性。

如果不做repair会怎么样?

图1.jpg

假设3个副本(A/B/C),quorum级别的读写删数据,时刻t1用户最初以quorum级别成功写入数据1,假设A/B/C都写入成功;时刻t2用户quorum级别删除1数据,假设这里C副本删除失败,但是客户依旧显示删除成功;时刻t3(这里假设t3-t2 > gc_grace_seconds,且用户没有做repair 且期间)。那么A/B副本会compaction把1数据合并删除掉,但是c副本没有删除mark。

最终结果一条被用户认为删除成功的key ,”死灰复燃“的读到了。

所以:repair必须要做。

repair大概流程

图2.jpg

全量数据repair需要人为手工通过节点nodetool提交外围任务,具体的nodetool 命令行参数 可以下次介绍,这里大概分享下一轮repair在副本节点之间进行的流程。假设开始做A 节点负责的数据,对应副本涉及B/C节点,那么一次执行的修复链路是:

  • 计算A/B/C三个相关副本数据的全量merkle-tree[3],这是一个二分hash树;从底往上计算hash、叶子节点是小range范围的数据的sha2 hash值,内部节点是其左右子节点的hash值(xor);
  • 通过两两对比merkle-tree,可以知道具体节点间不一致的数据范围;
  • 两两走内部stream 拖数据流程补齐相关数据。

repair可能的问题

  • 运维复杂:

    • 节点数据量如果较大,整个执行过程可能会耗时很久,时间越久出现问题的可能性就越大;
    • 为了避免repair对集群影响较大,repair需要针对节点差异化执行,那么对运维复杂性会带来挑战;
    • 需要表级别gc_grace_seconds 内做一次,如果表过多,会造成运维差异化难度较大;
  • 资源消耗较大:

    • 一般cassandra被用于在线服务场景,但是做repair会带来瞬时资源较大开销:cpu、io、网络,影响服务稳定性;

现在社区解决方案有:incremental repair、schedule repair等方案[4],此外datastax公司也有nodesync[5],scylladb 公司有row-level repair。对应我们也有相关的定制功能。目的是降低运维复杂度,降低repair时候对在线服务的影响。

入群邀约
为了营造一个开放的 Cassandra 技术交流环境,社区建立了微信群公众号和钉钉群,为广大用户提供专业的技术分享及问答,定期开展专家技术直播,欢迎大家加入。
另外阿里云提供商业化Cassandra使用,中国站和国际站都支持https://www.aliyun.com/product/cds
图3.jpg

引用:

[1] https://www.allthingsdistributed.com/2008/12/eventually_consistent.html

[2] https://cassandra.apache.org/doc/latest/operating/repair.html

[3] https://en.wikipedia.org/wiki/Merkle_tree

[4] https://issues.apache.org/jira/browse/CASSANDRA-14346

[5] https://docs.datastax.com/en/dse/6.0/dse-dev/datastax_enterprise/config/aboutNodesync.html

[6] https://docs.scylladb.com/operating-scylla/procedures/maintenance/repair/

目录
相关文章
|
8月前
|
算法 关系型数据库 MySQL
TiDB保证数据一致性的策略与优势
【2月更文挑战第28天】TiDB作为一款分布式数据库,通过其独特的策略和优势,确保在分布式环境下数据的一致性。本章将详细探讨TiDB保证数据一致性的核心策略,包括其采用的分布式一致性协议、数据复制机制以及容错处理等方面,并阐述这些策略所带来的优势。通过理解TiDB的数据一致性保证机制,读者将能更深入地认识其作为分布式数据库的价值。
|
存储 缓存 算法
ES写入过程和写入原理调优及如何保证数据的写一致性(上)
ES写入过程和写入原理调优及如何保证数据的写一致性
ES写入过程和写入原理调优及如何保证数据的写一致性(上)
|
4月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
612 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
6月前
|
供应链 负载均衡 数据库
软件架构一致性问题之分析代码修改的 Scalability如何解决
软件架构一致性问题之分析代码修改的 Scalability如何解决
70 1
|
6月前
|
消息中间件 算法
分布式篇问题之“最终一致性”问题如何解决
分布式篇问题之“最终一致性”问题如何解决
|
8月前
|
算法 程序员
破解Paxos活性难题:分布式一致性的终极指南
Paxos算法是解决分布式系统一致性问题的关键,由Leslie Lamport提出。它涉及提议者、接受者和学习者三个角色,通过准备和接受两个阶段达成共识。然而,确保算法的活性,即在面对网络分区、竞争冲突和节点故障时仍能及时决策,是一个挑战。解决方法包括领导者选举、优化提案编号管理、使用超时机制和Fast Paxos等。实际案例中,通过领导者选举和超时机制,可以提高Paxos在应对网络延迟和冲突时的活性。
255 1
|
8月前
|
存储 分布式计算 数据管理
HDFS中的数据一致性是如何保证的?请解释数据一致性的概念和实现方式。
HDFS中的数据一致性是如何保证的?请解释数据一致性的概念和实现方式。
309 0
奇葩论文:分布式一致性协议-Paxos
奇葩论文:分布式一致性协议-Paxos
奇葩论文:分布式一致性协议-Paxos
|
调度 Apache
Apache Doris tablet 副本修复的原理、流程及问题定位
Apache Doris tablet 副本修复的原理、流程及问题定位
505 0
|
存储 运维 监控
分布式数据库HBase的重要机制和原理的宕机恢复和故障处理
HBase是一个分布式数据库系统,支持高可用性、高性能和高伸缩性。在分布式环境中,数据的分布式存储和管理是非常重要的。HBase通过分布式存储和管理数据来实现高可用性和高性能。同时,HBase还提供了一些重要的机制和原理来支持宕机恢复和故障处理。
480 1