Hatena::Groupdann

dann's blog このページをアンテナに追加 RSSフィード

Fork me on GitHub

2010-03-16

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

Cassandraのノード管理ツール(nodetool) - dann's blog を含むブックマーク はてなブックマーク - Cassandraのノード管理ツール(nodetool) - dann's blog Cassandraのノード管理ツール(nodetool) - dann's blog のブックマークコメント

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;
}