Cassandraのノード管理ツール(nodetool)

nodetool概要

nodetoolは、clusterの管理ツールです。ノードが生きてるかどうか調べたり、compactionを実行できたりなどをすることができます。

利用できるコマンド

どのようなコマンドが利用できるかというと、以下のようなコマンドが利用できます

        String header = String.format(
                "%nAvailable commands: ring, info, cleanup, compact, cfstats, snapshot [snapshotname], clearsnapshot, " +
                "tpstats, flush, repair, decommission, move, loadbalance, removetoken, " +
                "setcachecapacity <keyspace> <cfname> <keycachecapacity> <rowcachecapacity>, " +
                "getcompactionthreshold, setcompactionthreshold [minthreshold] ([maxthreshold])" +
                "streams [host]");

実装

org.apache.cassandra.toolsパッケージにあります。ツール群は、このパッケージですね。実装としては、NodeCmdクラスです。ここでも、commons-cliを使って引数のパースなどは実装されています。

実装としては、NodeCmdクラスからNodeProbeというクラスに委譲して、このクラスで各種処理が実現されます。名前の通り、Nodeをprobeするツールです。

NodeProbeはJMX Clientになっています。今までの回では説明していませんでしたが、CassandraはNodeなどの各種ステータスがとれるように、Node群などにはMbeanにもなっていて、JMX経由でステータスがとれるようになっています。

NodeProbeは、JMX Clientとして、各種データを取得しています。実際に、どんなMXBeanがあるかというと、NodeProbeをみてみると、以下のようなMXbeanが定義されています。

    private StorageServiceMBean ssProxy;
    private MemoryMXBean memProxy;
    private RuntimeMXBean runtimeProxy;
    private CompactionManagerMBean mcmProxy;
    private StreamingServiceMBean streamProxy;

MemoryMXBean, RuntimeMXBeanは、java.lang.managementの標準的なものなのでおいとくとして、cassandra固有のMXBeanは、StorageServiceMBean, CompactionManagerMBean, StreamingServiceMBeanです。

何ができるかは、APIをみれば一目瞭然です。どこからデータを実際に取っているかは、各MBeanを実装するクラスを見ればわかります。

StorageServiceMBean

public interface StorageServiceMBean
{    
    public Set<String> getLiveNodes();
    public Set<String> getUnreachableNodes();
    public String getToken();
    public Map<Range, List<String>> getRangeToEndPointMap(String keyspace);
    public Map<String, String> getLoadMap();
    public int getCurrentGenerationNumber();
    public List<InetAddress> getNaturalEndpoints(String key, String table);
    public void forceTableCompaction() throws IOException;
    public void forceTableCleanup() throws IOException;
    public void takeSnapshot(String tableName, String tag) throws IOException;
    public void takeAllSnapshot(String tag) throws IOException;
    public void clearSnapshot() throws IOException;
    public void forceTableFlush(String tableName, String... columnFamilies) throws IOException;
    public void forceTableRepair(String tableName, String... columnFamilies) throws IOException;
    public void decommission() throws InterruptedException;
    public void move(String newToken) throws IOException, InterruptedException;
    public void loadBalance() throws IOException, InterruptedException;
    public void removeToken(String token);
    public void setLog4jLevel(String classQualifier, String level);
    public String getOperationMode();
}
public interface CompactionManagerMBean
{    
    public int getMinimumCompactionThreshold();
    public void setMinimumCompactionThreshold(int threshold);
    public int getMaximumCompactionThreshold();
    public void setMaximumCompactionThreshold(int threshold);
    public String getColumnFamilyInProgress();
    public Long getBytesTotalInProgress();
    public Long getBytesCompacted();
    public int getPendingTasks();
}
public interface StreamingServiceMBean
{
    public Set<InetAddress> getStreamDestinations();
    public List<String> getOutgoingFiles(String host) throws IOException;
    public Set<InetAddress> getStreamSources();
    public List<String> getIncomingFiles(String host) throws IOException;
}


つい最近、桜をとりに鎌倉の方にいってきたんですが、早咲の桜がとても綺麗でした。今年は桜は早く咲くようなので、悩んでいる方はもう一眼レフすぐに買っちゃったほうがいいですよ!

これからは、桜だけじゃなく、菜の花、ポピー、薔薇などをはじめ、たくさんの花が咲き乱れるので、カメラを買うにはもってこいの季節です!

それでは、よい photo life を!

*
*