前提
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.TombstoneOverwhelmingExceptionat 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.TombstoneOverwhelmingExceptionat 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                Token9192997390010868737
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是不能一起使用的。

cassandra日常维护之nodetool repair相关推荐

  1. MySQL日常维护(超级大杂烩)

    MySQL 日常维护 其中第一至第六, 每天都需要执行, 第七到第九定期执行(1周或者2周一次?) 一  检查数据库运行状态 1 通过putty.exe登录远程数据库服务器,在shell命令行里面执行 ...

  2. MySQL Cluster 日常维护

    在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解.而且相信大家都掌握了基本用法.现在我们来看看Cluster的日常维护.熟悉日常维护,将有助于工作中更好的管理和使用Cluster ...

  3. 邮件服务器 Postfix+ Cyrus-SASL+cyrus-IMAPD+日常维护

    一,安装Postfix postfix-2.6.5.tar.gz postfix-2.6.5-vda-ng.patch.gz 二,rpm包安装Cyrus-SASL+cyrus-IMAPD 三,Post ...

  4. AIX 操作系统日常维护须知

    AIX 操作系统日常维护须知目 录1. AIX 常用命令简介2. 文档编辑命令3. 如何查看系统出错信息4. 文件系统的操作5. 如何为系统做备份一.AIX 常用命令简介 1. 关机shutdown ...

  5. 企业网络推广专员浅析企业网络推广日常维护要做好

    每个企业网站在运营优化期间都需要做好网站日常维护工作,对于站长来说网站维护工作常常伴随着一些专业技术性较强的问题需要解决,如果企业客户仅仅想要从性价比上强调维护,选择费用低廉的维护公司没有任何价值可言 ...

  6. MQ日常维护操作手册

    假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...

  7. 物理Data Guard的日常维护

    2019独角兽企业重金招聘Python工程师标准>>> 物理Data Guard的日常维护 [日期:2017-01-17] 来源:Linux社区  作者:zydev [字体:大 中 ...

  8. MHA 日常维护命令集

    MHA 日常维护命令集 1.查看ssh登陆是否成功 masterha_check_ssh --global_conf=/etc/masterha/masterha_default.conf --con ...

  9. 数据中心日常维护工作有哪些?

    数据中心要保持稳定的运行,需要大量的专业技术人员.一般承担重要业务的数据中心都是有人24小时值守,无人值守的数据中心一般只能承担不重要业务,完全无人管理维护的数据中心几乎没有.所以数据中心日常维护工作 ...

最新文章

  1. javascript跨域解决方案
  2. 用Python写网络爬虫pdf
  3. 柱坐标系下的ns方程_麦克斯韦方程组小结
  4. springboot属性注入转化为对象
  5. php创建图片的缩略图,如何通过php给图片创建缩略图?
  6. 针对宝塔面板一个站点多个域名使用SSL证书的解决方案
  7. 感谢贤心感谢layui
  8. cgroup-net_cls子系统分析
  9. <Android开发> Android vold - 第三篇 vold 的NetLinkManager类简介
  10. java继承1—上溯造型
  11. WebRTC会成主流吗?P2P流媒体时代到了!
  12. 完美的扎克伯格,倒霉的Facebook
  13. 美法官:甲骨文与谷歌专利诉讼无法和解
  14. Spark基础测试题
  15. php购物网站毕设ppt,购物网站设计与实现毕业设计展示PPT.ppt
  16. Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案
  17. STM32嵌入式基础开发附C-STM32-CAN通讯
  18. 解决ESlint验证
  19. python oop求三角形面积公式_Python面向对象编程-OOP
  20. Unity网络(三)-服务器数据解析

热门文章

  1. Word快捷键大全 Word2013/2010/2007/2003常用快捷键大全
  2. mac 好用的ps修图软件 Pixelmator Pro
  3. 古典密码学、DES对称加密、3DES对称加密知识总结和实验
  4. 计算机中常见的信息存储格式,信息保存在计算机中的基本形式是什么?
  5. Linux授予权限命令
  6. Linux云计算架构师课程(兄弟连IT教育)
  7. UART,SPI,IIC,RS232通信时序和规则
  8. 访问InfoPath的xml数据
  9. html5简单企业网站,HTML5企业网站极简大气模板
  10. Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解