在Cassandra集群中进行压缩时,我可以避免运行修复吗?

时间:2017-11-29 06:37:12

标签: cassandra-3.0

我已安排每天进行增量修复。但是在修复过程中,我们的监控系统会报告COMPACTIONEXECUTOR_PENDING任务。

我想知道,如果我可以引入检查,看看,如果压缩没有运行,在我触发修复之前。

我应该能够通过解析nodetool netstats和compactionstats命令输出的输出来检查压缩是否正在运行。

如果以下两项检查都通过,我将继续修理:

  1. nodetool netstats输出包含不发送任何流。
  2. nodetool compactionstats输出包含待处理任务:0
  3. 但在我继续之前,我想得到一些专家意见。

    我的理解是否正确? 我不想进入这种情况,其中,这些检查总是失败,修复过程根本没有被触发。

    感谢。

1 个答案:

答案 0 :(得分:0)

Cassandra经常发生压实。所以我有点害怕只有在pending_compactions = 0时触发修复才会导致修复运行不够。但这取决于您的流量,例如如果你写的很少,你就不会做很多压缩。您应该为pending_compactions = 0添加最长等待时间,以便在指定时间后如果条件不正确,则无论如何都将运行修复。

回答你的问题。 Nodetool使用JMX在Cassandra中获取MBean。您可以在此处查看所有可用的MBean:http://cassandra.apache.org/doc/latest/operating/metrics.html 你想要这个MBean:

import { Pipe, PipeTransform } from '@angular/core';
import { NumberFilterService } from './NumberFilterService';

@Pipe({
  name: 'numberfilter'
})
export class NumberFilterPipe implements PipeTransform {

  constructor(public servicenum : NumberFilterService){}

  transform(numbers: any[], key: any ): any[] {
    return this.servicenum.filterNumber(numbers,key);

  }
}

您可以像这样创建自己的JMX客户端:How to connect to a java program on localhost jvm using JMX?

或者您可以使用jmxterm:https://github.com/jiaqi/jmxterm

我的理解是你可以像这样使用它:

import { Injectable } from '@angular/core';

@Injectable()
export class NumberFilterService {

    arrayLen = 0;
    itteration = 0;
    result = [];
   public filterNumber(values: any[], key: any): any[] {
        this.arrayLen =  values.length;
        for (this.itteration = 0 ; this.itteration < this.arrayLen ; this.itteration ++  ) {
            if (key === values[this.itteration]) {
                this.result.push(values[this.itteration]);
            }

        }
        return this.result;
    }
}