`
longzhun
  • 浏览: 371756 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cassandra日常维护之nodetool repair

 
阅读更多

前提
cassandra的根据分区key的操作是很快的,这也是它的优势,但是它的多条件查询是很弱的,特别是如果你有删除操作的话,就更坑爹了。cassandra的删除操作,实际上并不是真的删除,它是执行的插入操作,插入的数据叫做tombstone(墓碑),记录了被删除记录的信息和删除时间。当你根据条件查询的时候,如果它会把满足条件的记录查询出来,包括tombstone。然后过滤掉删除的记录,再把结果返回给你。

现象
如果你的表mykeyspace.t_table有3个副本,主键是(a,b,c) 。你插入4000条数据(a=1),然后再删除掉3999条,你再根据a=1去查询,你会在cassandra的日志中发现一条警告日志.

WARN [ReadStage:18926] 2015-02-05 07:18:02,869 SliceQueryFilter.java Read 1 live and 11997 tombstoned cells in mykeyspace.t_table (see tombstone_warn_threshold)....

 这个警告信息是根据你的cassandra.yaml里配置的tombstone_warn_threshold决定的。也就是说它搜索了11997=3999*3条数据,才搜到一个1个live。这就是墓碑的危害。当你删除的数据更多的时候。到达配置项tombstone_failure_threshold的值,这次查询就失败了。你会看到下面的ERROR日志。

ERROR [ReadStage:219774] 2015-02-04 00:31:55,713 SliceQueryFilter.java (line 200) Scanned over 100000 tombstones in mykeyspace.t_table; query aborted (see tombstone_fail_threshold)
ERROR [ReadStage:219774] 2015-02-04 00:31:55,713 CassandraDaemon.java (line 199) Exception in thread Thread[ReadStage:219774,5,main]
java.lang.RuntimeException: org.apache.cassandra.db.filter.TombstoneOverwhelmingException
        at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1916)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.cassandra.db.filter.TombstoneOverwhelmingException
        at org.apache.cassandra.db.filter.SliceQueryFilter.collectReducedColumns(SliceQueryFilter.java:202)

 真实的数据实实在在的被删除,发生在两个时期:

第一个时期是新的SSTable文件生成的时候。而且它只删除gc_grace_seconds之前插入的tombstone。
gc_grace_seconds是表结构的一个额外参数,可以通过alter table进行修改。所以说如果你的某个节点挂了,挂的时间超过gc_grace_seconds。可能导致删除的数据又出现了。

第二个时期就来自日常的Nodetool repair操作。每个gc_grace_seconds周期内至少repair一遍。

解决
普通repair
nodetool repair基本语法是这样的:
nodetool -h host repair [keyspace] [cfnames]
它会修复keyspace.cfnames这个表分区主键token值落在这个节点上的数据(包括master和slave数据)。等你把所有的节点repair一遍,
如果你有三个副本,你相当于repair了三遍数据,所以这个时间会很长。

只repair master数据
你可以使用-pr选项,表示只修复range落在该节点的master数据:当然你需要把所有的节点都repair一遍。
nodetool -h host -pr repair [keyspace] [cfnames]

根据token段repair
当你的数据量足够大的时候,这个过程还是很慢,你可能焦急的不知道这个过程什么时候结束。你可以通过token段的方式,
nodetool -h host -st xxx -et xxxx repair [keyspace] [cfnames]
至于token段的获取,可以使用nodetool ring命令得到。

Note: Ownership information does not include topology; for complete information, specify a keyspace
Datacenter: datacenter1
==========
Address         Rack        Status State   Load            Owns                Token
                                                                               9192997390010868737
192.168.1.101  rack1       Up     Normal  98.1 MB         35.79%              -9196740398802827883
192.168.1.102  rack1       Up     Normal  98.55 MB        30.03%              -9124289757510820389
192.168.1.103  rack1       Up     Normal  98.09 MB        34.18%              -9088595326201594476
192.168.1.102  rack1       Up     Normal  98.55 MB        30.03%              -9084487345633494070
192.168.1.101  rack1       Up     Normal  98.1 MB         35.79%              -9061596030643872312
192.168.1.102  rack1       Up     Normal  98.55 MB        30.03%              -9056941391849010003
192.168.1.101  rack1       Up     Normal  98.1 MB         35.79%              -9055818090063560183

 这就表示token 从-9088595326201594476到-9084487345633494070的master数据分布在192.168.1.102机器上。

多线程并发repair
可以加一个-par选项 例如:
nodetool -h host -pr -par repair [keyspace] [cfnames]
nodetool -h host -st xxx -et xxxx -par repair [keyspace] [cfnames]
这个repair速度会提高数倍。但是你要考虑你集群的负载。

增量repair
可以加一个-inc选项(注:这个选项只能在2.1以后的版本使用)
例如
每条数据都有自己的时间戳,当你repair一次之后,你第二次repair的时候,其实只要repair上次repair数据最后一个时间戳之后的数据就可以了。
nodetool -h host -pr -inc repair [keyspace] [cfnames]
nodetool -h host -st xxx -et xxxx -inc repair [keyspace] [cfnames]
这样也可以增加repair速度,注意-inc和-par是不能一起使用的。

分享到:
评论

相关推荐

    CassandraNT:Cassandra Nodetool 解决方案

    Cassandra 节点工具扩展CassandraNodetool 扩展是一种以最少的配置从 Cassandra 数据库收集指标的解决方案。 该解决方案利用 nodetool 工具从 Cassandra 收集指标。 以下是当前收集的指标:指标小路类别名称指标类型...

    Cassandra 监控脚本

    - **数据修复**:Cassandra提供了工具如`nodetool repair`来修复数据一致性问题,shell脚本可能会集成此功能。 3. **Crontab 定时任务**: - **计划任务**:Cassandra的监控和修复任务可以通过Linux的crontab服务...

    一组Cassandra工具,用于备份、恢复、监控、修复和管理ApacheCassandraDatastax集群_Jinj.zip

    在"一组Cassandra工具,用于备份、恢复、监控、修复和管理Apache Cassandra Datastax集群_Jinj.zip"这个压缩包中,我们可能找到了一系列实用的工具,这些工具可以帮助管理员更有效地管理和维护Cassandra集群。...

    Cassandra节点管理

    同时,定期执行`nodetool cleanup`和`repair`操作能保持数据的一致性和完整性。 总之,Cassandra节点管理是一项涉及多个复杂步骤的任务,需要谨慎处理以确保集群的稳定运行。理解这些概念和流程对于有效管理和优化...

    Cassandra使用手册

    Cassandra的命令行工具有cassandra-cli和nodetool。cassandra-cli可以用来执行各种数据库操作,例如管理数据模型,以及数据的增删改查。nodetool则提供了一些用于管理和监控Cassandra集群的命令。 对于开发人员,...

    Cassandra1.2

    每个节点都与其他节点通信,共同维护数据的一致性。Cassandra 1.2 引入了更好的故障检测和自动故障恢复机制,确保系统的高可用性。 ### 2. 数据模型 Cassandra 使用列族(Column Family)作为基本的数据结构,类似...

    Cassandra数据库

    8. **Repair机制**:为了保证数据一致性,Cassandra提供了一种叫做Repair的操作,定期检查并修复数据副本之间的不一致。 9. **CQL(Cassandra Query Language)**:Cassandra引入了类似SQL的查询语言CQL,简化了...

    cassandra集群配置

    Cassandra 集群配置完成后,可以通过 bin/nodetool 工具管理集群,例如查看节点运行情况、添加或删除节点等。 四、总结 本文介绍了 Cassandra 集群配置的基本步骤,包括基本配置、集群配置、启动 Cassandra 和集群...

    apache-cassandra-2.0.1-bin.tar

    Apache Cassandra 是一个分布式数据库系统,特别设计用于处理大规模数据,具备高可用性、容错性和可扩展性。在本文中,我们将深入探讨Apache Cassandra 2.0.1版本中的核心特性、架构、以及如何安装和使用这个强大的...

    cassandra-3.11.3下载

    首先,Cassandra的核心特性之一是它的分布式架构。它采用了一种主从复制模型,每个节点都可以接受写入和读取请求,使得系统具有高可用性和容错性。在3.11.3版本中,Cassandra增强了数据复制的策略,能够更好地管理...

    cassandra安装文件

    为了验证安装是否成功,你可以通过`nodetool`命令行工具检查节点状态,如`nodetool status`。 Cassandra的数据模型基于列族(Column Family),它类似于关系数据库中的表,但具有更灵活的数据结构。列族可以配置为...

    DevCenter cassandra客户端

    6. **脚本和工作流**:DevCenter支持创建和运行CQL脚本,可以用于自动化数据库维护任务,如批量导入/导出数据、数据清理等。此外,用户还可以组织这些脚本为工作流,实现更复杂的操作流程。 7. **集群管理和连接**...

    liunx下cassandra的安装配置

    ### Linux 下 Cassandra 的安装与配置 #### 一、Java 的安装 Cassandra 是基于 Java 开发的分布式数据库...Cassandra 的强大之处在于其高可用性和扩展性,能够支持大规模的数据存储需求。希望这些信息对您有所帮助!

    cassandra-opstools:帮助操作 Cassandra 集群的通用工具和脚本

    spcassandra-generate-repairs:生成“nodetool repair”命令,用于修复具有较小令牌范围的整个集群。 spcassandra-repairstats:扫描 Cassandra 系统日志并显示已完成和正在运行的修复的可读统计信息。 spcas

    cassandra-operator,apache-cassandra的kubernetes算子.zip

    持续的维护和更新确保了其与Kubernetes及Cassandra的兼容性。 7. **最佳实践**: 在实际使用中,了解如何优化Cassandra配置、监控集群健康状况以及合理规划存储和网络资源是至关重要的。Cassandra-Operator的文档...

    spring boot与cassandra集成,使用JPA方式。

    Spring Boot以其简洁的配置和开箱即用的特性,已经成为Java开发中的首选框架之一。而Cassandra,作为分布式NoSQL数据库,因其高可用性和可扩展性,在大数据场景下广泛应用。 首先,让我们了解Spring Boot如何与...

    Cassandra JDBC Driver

    这意味着开发者可以使用同一个驱动来连接不同版本的Cassandra集群,从而降低了维护成本。 2. **遵循JDBC规范**:Cassandra JDBC Driver严格遵循Java Database Connectivity (JDBC) API规范,使得熟悉JDBC的开发者...

    Learning_Apache_Cassandra

    在本文档中,标题“Learning_Apache_Cassandra”透露了内容的主题,即学习Apache Cassandra。Cassandra是一个开源的NoSQL分布式数据库管理系统,它以高可用性和分布式架构著称。该书详细介绍了Cassandra的基本概念、...

Global site tag (gtag.js) - Google Analytics