【Cassandra】nodetool status / ring / describering


## 0. はじめに

本ページのコマンドの結果表示は、DSEディストリビューションのもの (バージョンはいろいろ混在)

## 1. nodetool status

クラスタの状態表示

キースペースを指定して実行した場合、Owns列に利用可能なトークン範囲の割合を表示 
・トークン範囲の割合は、各ノードが所有するトークンの割合とレプリケーション係数を乗算した値
・そのキースペースのreplication factorが、2ならクラスタ内の%の合計は約200%、3なら約300%になるはず....。

( 実行例 : DSE 5.1.17 )

```
# nodetool status test01
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.2.131  722.14 KiB  256          70.8%             3f1d4bd5-e99f-4251-8a8a-d5c23a2d2fa9  RAC1
UN  10.0.2.121  659.79 KiB  256          76.7%             a2541bd4-8d08-41ae-abf0-b22d4cae5716  RAC1
UN  10.0.2.122  662.59 KiB  256          75.8%             244dc6ed-45a1-47df-a89c-0ee2dc3f4a38  RAC1
UN  10.0.2.123  714.68 KiB  256          76.6%             9490e3e8-16af-4d5a-9e31-0e480c613ad8  RAC1

# 
```

( キースペースを指定しないで実行した場合　)
以前のバージョン(例えば、DSE4.8.x)ではOwn列は ? 表示になっていたが、最近のバージョン(少なくとも5.1.17以降)では、パーセンテージが表示される。いずれにせよ、DATASTAXのドキュメントの記載にあるとおり、この欄の数字に意味を求めるのであれば、nodetool satus実行時に対象のキースペースを指定する必要がある。
「重要: クラスターに、レプリケーション・ストラテジまたはレプリケーション係数の異なるキースペースがある場合、有意な所有権情報を得るには、nodetool status実行時にキースペースを指定してください。」( https://docs.datastax.com/ja/dse/5.1/dse-admin/datastax_enterprise/tools/nodetool/toolsStatus.html ) )

( 実行例 : DSE 4.8.16 )

```
# nodetool status 
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens  Owns    Host ID                               Rack
UN  10.0.2.121  479.96 KB  256     ?       e52df442-eebb-490a-8787-372d4e2705c2  RAC1
UN  10.0.2.122  433.09 KB  256     ?       b1ccdf1e-a6ee-4f71-95c3-b3b5bd0f3e81  RAC1
UN  10.0.2.123  488.47 KB  256     ?       a4cfeb3a-1fa2-4f99-ac8b-e14e2aa44ec4  RAC1

Note: Non-system keyspaces don't have the same replication settings, effective ownership information is meaningless
# 
```

## 2. nodetool ring

nodetool statusに似ているが、ノードのステータスをトークン範囲別に表示

( 実行例 : DSE 5.1.17 )

```
# nodetool ring test01 

Datacenter: DC1
==========
Address     Rack        Status State   Load            Owns                Token                                       
                                                                           9218035512596006795                         
10.0.2.121  RAC1        Up     Normal  659.79 KiB      76.72%              -9222728930267421097                        
10.0.2.131  RAC1        Up     Normal  722.14 KiB      70.85%              -9180151874169604866                        
10.0.2.131  RAC1        Up     Normal  722.14 KiB      70.85%              -9162853831163961080                        
10.0.2.122  RAC1        Up     Normal  662.59 KiB      75.79%              -9129890199084435875                        
10.0.2.131  RAC1        Up     Normal  722.14 KiB      70.85%              -9125736719015339102                        
10.0.2.131  RAC1        Up     Normal  722.14 KiB      70.85%              -9113235406061065294                        
10.0.2.122  RAC1        Up     Normal  662.59 KiB      75.79%              -9113100503939633554                        

    :
   (略)
    :

10.0.2.121  RAC1        Up     Normal  659.79 KiB      76.72%              9218035512596006795         
                

  Warning: "nodetool ring" is used to output all the tokens of a node.
  To view status related info of a node use "nodetool status" instead.

```

nodetoolコマンドとは関係ない余談だけど、cqlshのtoken関数と、nodetool ring (あるいは後述のnodetool describering)の結果を組み合わせることで、手動でトークン範囲でページング分割したクエリを実行可能

```
cqlsh> select * from test01.customer where token(id) <= -9222728930267421097; 

 id   | age | firstname | lastname
------+-----+-----------+----------
 4317 |  17 |     aaaaa |    bbbbb 
 3356 |  26 |     aaaaa |    bbbbb
    :
   (略)
    :

cqlsh> select * from test01.customer where token(id) > -9222728930267421097 and token(id) <= -9129890199084435875;

 id   | age | firstname | lastname
------+-----+-----------+----------
 3372 |  27 |     aaaaa |    bbbbb
 1584 |  26 |     aaaaa |    bbbbb

    :
   (略)
    :

cqlsh> select * from test01.customer where token(id) >  9218035512596006795;

 id   | age | firstname | lastname
------+-----+-----------+----------
 5504 |  17 |     aaaaa |    bbbbb
 3476 |  42 |     aaaaa |    bbbbb
    :
   (略)
    :

```

## 3. nodetool describering

キースペースのパーティション範囲(トークン値)を表示 ( トークン値ではsortされてない )

( 実行例 : DSE 5.1.17 )

```
# nodetool describering test01
Schema Version:3e44afb3-428b-3c44-a053-6363a2a78403
Keyspace: test01
TokenRange: 
        TokenRange(start_token:-7067710157254911858, end_token:-7027724543442860409, endpoints:[10.0.2.122, 10.0.2.121, 10.0.2.123], rpc_endpoints:[10.0.2.122, 10.0.2.121, 10.0.2.123], endpoint_details:[EndpointDetails(host:10.0.2.122, datacenter:DC1, rack:RAC1), EndpointDetails(host:10.0.2.121, datacenter:DC1, rack:RAC1), EndpointDetails(host:10.0.2.123, datacenter:DC1, rack:RAC1)])
        TokenRange(start_token:-4032970123352172154, end_token:-3949095354840399141, endpoints:[10.0.2.123, 10.0.2.121, 10.0.2.122], rpc_endpoints:[10.0.2.123, 10.0.2.121, 10.0.2.122], endpoint_details:[EndpointDetails(host:10.0.2.123, datacenter:DC1, rack:RAC1), EndpointDetails(host:10.0.2.121, datacenter:DC1, rack:RAC1), EndpointDetails(host:10.0.2.122, datacenter:DC1, rack:RAC1)])
        TokenRange(start_token:1245622280671050746, end_token:1265745285746323744, endpoints:[10.0.2.121, 10.0.2.122, 10.0.2.123], rpc_endpoints:[10.0.2.121, 10.0.2.122, 10.0.2.123], endpoint_details:[EndpointDetails(host:10.0.2.121, datacenter:DC1, rack:RAC1), EndpointDetails(host:10.0.2.122, datacenter:DC1, rack:RAC1), EndpointDetails(host:10.0.2.123, datacenter:DC1, rack:RAC1)])

    :
   (略)
    :

```

余談だけど、トークン値の結果はsortされてないので、EXCELでsortしたくなるかもしれないけど、その場合、EXCELでは15桁を超える数値を取り扱えないので、文字列として取り扱うようにしないといけない....。
![2020-05-05_182221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497751/fd24cb07-0501-0d00-05e6-1e96e742ec50.png)