【Cassandra】nodetool cfstats / tablestats


## 0. はじめに

・本記載は、ディストリビューション、バージョン = DSE 4.8.16をベースに記載
・Cassandra3.0以降は、コマンドがnodetool tablestatsに改められているので注意

## 1. nodetool cfstats / tablestats 概要

・Cassandra Ver3.0以降 (DSE 5.0.x以降)で、cfstatsからtablestatsにコマンドが改められている。
・1つ以上のテーブルに関する統計を取得
　( keyspace, table名の指定を省略するとすべてのテーブルに関する統計を出力 )
・ノードごとの統計を出力
　( 統計値はクラスタ内で一意でない。 )
・カウンタ値はノードのCassandra起動時にリセット
　データフラッシュ時、またはCompactionでSSTablesを変更した際に統計を更新 ( するらしい )


## 2. 統計値の説明

気になる統計値についてのメモ

### ① Space used (live), Space used (total)

Space used (live)は、SSTableのディスク領域のバイト数で、Space used (total)は、including obsolete SSTables waiting to be GCdらしい。

### ② Number of keys (estimate) / Number of partitions (estimate)

コマンド名と同様、Cassandra Ver3.0以降 (DSE 5.0.x以降)で、Number of keysからNumber of partitionsにコマンドが改められている。

Number of keys (estimate)は、paritionの数の推定値を報告してくれる。
( clustering keyで複数行の場合でも、あくまでparitionの数、datastaxの管理者ガイドでも「プライマリ・キーの数ではありません。これによって、テーブル内の推定パーティション数がわかります。」と記載されている。 )

( partition key 1column, 10 parition =10行 の場合 )

```
CREATE TABLE ctest01.test01 (
    pkey1 text PRIMARY KEY,
    testdata text,
    uid timeuuid
) 

cqlsh:ctest01> select * from test01;

 pkey1                              | testdata     | uid
------------------------------------+--------------+--------------------------------------
                         \x13\x1cM- | | \nz@Qj\x1c | d0ad65f0-df07-11e8-db82-ebecdb03ffa5
 \x0ed(\x1f`\x1dM\x1etA\x0c7g\x1b"{ |  \x0fKYehv(E | 3e55a540-988c-11d3-db82-ebecdb03ffa5
     s\x0cqCGM{E^L_\x17\x1eE!\x1c3t | | \nz@Qj\x1c | c25547d0-f9e6-11e3-db82-ebecdb03ffa5
               {\x03],\x04&{r4#\x14 |  E}P^k\x7fQE | 33bf7590-28fa-11e7-db82-ebecdb03ffa5
                           |Q\x1bGF |  P+|u\x0bQ-X | 9607d760-3493-11e3-db82-ebecdb03ffa5
                    \x7fpJW*\x1d, a | | \nz@Qj\x1c | 79346760-06ba-11e6-db82-ebecdb03ffa5
                            YC\x04^ |  \x0fKYehv(E | c03a3d30-e7bd-11be-db82-ebecdb03ffa5
        C\x01%~\x1f5\x15p\x14XR\x04 |  E}P^k\x7fQE | 1fa01d60-2f3a-11d0-db82-ebecdb03ffa5
                           l\I5\x11 |  \x0fKYehv(E | 0f9f76e0-5d72-11e2-db82-ebecdb03ffa5
                            jf\x01@ |  \x0fKYehv(E | 656a0bf0-490d-11e6-db82-ebecdb03ffa5

(10 rows)
cqlsh:ctest01> 

# nodetool flush
# nodetool cfstats ctest01.test01
Keyspace: ctest01
        Read Count: 0
        Read Latency: NaN ms.
        Write Count: 10
        Write Latency: 0.0106 ms.
        Pending Flushes: 0
                Table: test01
                SSTable count: 1
　:
途中略
　: 
                Number of keys (estimate): 10
　:
途中略
　: 
# 
```

( partition key 2column, 10 parition =10行 の場合 )

```
CREATE TABLE ctest01.test02 (
    pkey1 text,
    pkey2 text,
    testdata text,
    uid timeuuid,
    PRIMARY KEY ((pkey1, pkey2))
)

cqlsh:ctest01> select * from test02;

 pkey1                              | pkey2                                 | testdata     | uid
------------------------------------+---------------------------------------+--------------+--------------------------------------
                            jf\x01@ |                               hA\x001 | .dap\x1fa\rh | ca7840b0-8a60-11b7-db82-ebecdb03ffa5
                         \x13\x1cM- |         fKu2BON8JR_`oG\x1aA\x10@\x1cI |  E}P^k\x7fQE | 79a38860-363e-11b6-db82-ebecdb03ffa5
        C\x01%~\x1f5\x15p\x14XR\x04 |         ltv*F\x05=k%o\x0fY9ngFx=\x18O |  P+|u\x0bQ-X | 59eae4f0-0f68-11d6-db82-ebecdb03ffa5
                           l\I5\x11 |                                    DD |  \x0fKYehv(E | 2e0fd9a0-7167-11c8-db82-ebecdb03ffa5
                           |Q\x1bGF |   piE\x1cl\x1a<"{\x06\x1d_K%ESh\x1fzQ | | \nz@Qj\x1c | 893da570-c9a5-11c1-db82-ebecdb03ffa5
               {\x03],\x04&{r4#\x14 |                                 \x1c- |  \x0fKYehv(E | 1aa10190-39db-11d8-db82-ebecdb03ffa5
                    \x7fpJW*\x1d, a |                   |`]\x07\x13Lna<\x07 |  P+|u\x0bQ-X | 7a7bb350-890a-11c1-db82-ebecdb03ffa5
 \x0ed(\x1f`\x1dM\x1etA\x0c7g\x1b"{ | a\nQ{h$"\x0cu\x17\x10g\x12z8l\x03\x08 | | \nz@Qj\x1c | 2e078210-5036-11ba-db82-ebecdb03ffa5
     s\x0cqCGM{E^L_\x17\x1eE!\x1c3t |                      VO\rp\x16O\x02Cr | | \nz@Qj\x1c | ee0ace30-5b4f-11ca-db82-ebecdb03ffa5
                            YC\x04^ |                Fhx_n\x7f'"\x0eK\x116= |  E}P^k\x7fQE | 918c8970-57cd-11bc-db82-ebecdb03ffa5

(10 rows)
cqlsh:ctest01> 

# nodetool flush
# nodetool cfstats ctest01.test02
Keyspace: ctest01
        Read Count: 0
        Read Latency: NaN ms.
        Write Count: 10
        Write Latency: 0.0116 ms.
        Pending Flushes: 0
                Table: test02
                SSTable count: 1
　:
途中略
　: 
                Number of keys (estimate): 10
　:
途中略
　: 
# 
```

( partition key 2column + clustering key 1column, 10 parition =10行 の場合 )

```
CREATE TABLE ctest01.test03 (
    pkey1 text,
    pkey2 text,
    ckey1 text,
    testdata text,
    uid timeuuid,
    PRIMARY KEY ((pkey1, pkey2), ckey1)
) 

cqlsh:ctest01> select * from test03;

 pkey1                              | pkey2                                 | ckey1             | testdata     | uid
------------------------------------+---------------------------------------+-------------------+--------------+--------------------------------------
                            jf\x01@ |                               hA\x001 | |\\x0eZy\x1e\x1cV |  E}P^k\x7fQE | 203db9a0-60e6-11b9-db82-ebecdb03ffa5
                         \x13\x1cM- |         fKu2BON8JR_`oG\x1aA\x10@\x1cI |        L"eJ\N\x1e |  P+|u\x0bQ-X | 729f7240-9755-11de-db82-ebecdb03ffa5
        C\x01%~\x1f5\x15p\x14XR\x04 |         ltv*F\x05=k%o\x0fY9ngFx=\x18O |      G`&\t\x1a4XC |  E}P^k\x7fQE | 1f1d7f70-e8e1-11e4-db82-ebecdb03ffa5
                           l\I5\x11 |                                    DD |       KAP>sx\x046 | | \nz@Qj\x1c | aacc8400-ba03-11bd-db82-ebecdb03ffa5
                           |Q\x1bGF |   piE\x1cl\x1a<"{\x06\x1d_K%ESh\x1fzQ |         z\x128d'0 |  P+|u\x0bQ-X | f7650b00-5cc8-11cb-db82-ebecdb03ffa5
               {\x03],\x04&{r4#\x14 |                                 \x1c- |         B7\x1eyN? | .dap\x1fa\rh | 46f91050-1965-11da-db82-ebecdb03ffa5
                    \x7fpJW*\x1d, a |                   |`]\x07\x13Lna<\x07 |  \x17Q\x01]/*\x10 |  \x0fKYehv(E | eb80fa00-3312-11cf-db82-ebecdb03ffa5
 \x0ed(\x1f`\x1dM\x1etA\x0c7g\x1b"{ | a\nQ{h$"\x0cu\x17\x10g\x12z8l\x03\x08 |        *|y\x05b(( | .dap\x1fa\rh | 980e9060-45a9-11c8-db82-ebecdb03ffa5
     s\x0cqCGM{E^L_\x17\x1eE!\x1c3t |                      VO\rp\x16O\x02Cr |     _\x12y\x0f"92 |  \x0fKYehv(E | 6b3f4190-900c-11d1-db82-ebecdb03ffa5
                            YC\x04^ |                Fhx_n\x7f'"\x0eK\x116= |        \x1b\x14P! |  E}P^k\x7fQE | 4a11ac90-03c2-11d7-db82-ebecdb03ffa5

(10 rows)
cqlsh:ctest01> 

# nodetool flush
# nodetool cfstats ctest01.test03
Keyspace: ctest01
        Read Count: 0
        Read Latency: NaN ms.
        Write Count: 10
        Write Latency: 0.023 ms.
        Pending Flushes: 0
                Table: test03
                SSTable count: 1
　:
途中略
　: 
                Number of keys (estimate): 10
　:
途中略
　: 
# 
```

( partition key 2column + clustering key 1column, 10 parition =20行 の場合 )

```
CREATE TABLE ctest01.test04 (
    pkey1 text,
    pkey2 text,
    ckey1 text,
    testdata text,
    uid timeuuid,
    PRIMARY KEY ((pkey1, pkey2), ckey1)
) 

cqlsh:ctest01> select * from test04;

 pkey1                              | pkey2                                 | ckey1             | testdata     | uid
------------------------------------+---------------------------------------+-------------------+--------------+--------------------------------------
                            jf\x01@ |                               hA\x001 |          Xj \x0b$ |  E}P^k\x7fQE | 07567ac0-c90e-11e3-db82-ebecdb03ffa5
                            jf\x01@ |                               hA\x001 | |\\x0eZy\x1e\x1cV |  E}P^k\x7fQE | 203db9a0-60e6-11b9-db82-ebecdb03ffa5
                         \x13\x1cM- |         fKu2BON8JR_`oG\x1aA\x10@\x1cI |         A\x0eAZqK |  \x0fKYehv(E | e2a8ff40-6a46-11e6-db82-ebecdb03ffa5
                         \x13\x1cM- |         fKu2BON8JR_`oG\x1aA\x10@\x1cI |        L"eJ\N\x1e |  P+|u\x0bQ-X | 729f7240-9755-11de-db82-ebecdb03ffa5
        C\x01%~\x1f5\x15p\x14XR\x04 |         ltv*F\x05=k%o\x0fY9ngFx=\x18O |      G`&\t\x1a4XC |  E}P^k\x7fQE | 1f1d7f70-e8e1-11e4-db82-ebecdb03ffa5
        C\x01%~\x1f5\x15p\x14XR\x04 |         ltv*F\x05=k%o\x0fY9ngFx=\x18O |        LD]v^\x12+ |  E}P^k\x7fQE | 79e14370-e10c-11e3-db82-ebecdb03ffa5
                           l\I5\x11 |                                    DD |    \x1c\x02o&\x0f |  \x0fKYehv(E | dff2cbf0-88cf-11cb-db82-ebecdb03ffa5
                           l\I5\x11 |                                    DD |       KAP>sx\x046 | | \nz@Qj\x1c | aacc8400-ba03-11bd-db82-ebecdb03ffa5
                           |Q\x1bGF |   piE\x1cl\x1a<"{\x06\x1d_K%ESh\x1fzQ |             ON\~k | | \nz@Qj\x1c | 5fca5410-5825-11ca-db82-ebecdb03ffa5
                           |Q\x1bGF |   piE\x1cl\x1a<"{\x06\x1d_K%ESh\x1fzQ |         z\x128d'0 |  P+|u\x0bQ-X | f7650b00-5cc8-11cb-db82-ebecdb03ffa5
               {\x03],\x04&{r4#\x14 |                                 \x1c- |   \x125\x05l\x7fF | | \nz@Qj\x1c | 0100e790-2f83-11dc-db82-ebecdb03ffa5
               {\x03],\x04&{r4#\x14 |                                 \x1c- |         B7\x1eyN? | .dap\x1fa\rh | 46f91050-1965-11da-db82-ebecdb03ffa5
                    \x7fpJW*\x1d, a |                   |`]\x07\x13Lna<\x07 |  \x17Q\x01]/*\x10 |  \x0fKYehv(E | eb80fa00-3312-11cf-db82-ebecdb03ffa5
                    \x7fpJW*\x1d, a |                   |`]\x07\x13Lna<\x07 |      J\x0eR\x13)^ |  E}P^k\x7fQE | 44c3def0-b6a8-11cc-db82-ebecdb03ffa5
 \x0ed(\x1f`\x1dM\x1etA\x0c7g\x1b"{ | a\nQ{h$"\x0cu\x17\x10g\x12z8l\x03\x08 |           \x06Qi$ | | \nz@Qj\x1c | faa71360-c83e-11d7-db82-ebecdb03ffa5
 \x0ed(\x1f`\x1dM\x1etA\x0c7g\x1b"{ | a\nQ{h$"\x0cu\x17\x10g\x12z8l\x03\x08 |        *|y\x05b(( | .dap\x1fa\rh | 980e9060-45a9-11c8-db82-ebecdb03ffa5
     s\x0cqCGM{E^L_\x17\x1eE!\x1c3t |                      VO\rp\x16O\x02Cr |         FL\x03+0y | .dap\x1fa\rh | c0962010-e0de-11d0-db82-ebecdb03ffa5
     s\x0cqCGM{E^L_\x17\x1eE!\x1c3t |                      VO\rp\x16O\x02Cr |     _\x12y\x0f"92 |  \x0fKYehv(E | 6b3f4190-900c-11d1-db82-ebecdb03ffa5
                            YC\x04^ |                Fhx_n\x7f'"\x0eK\x116= |        \x1b\x14P! |  E}P^k\x7fQE | 4a11ac90-03c2-11d7-db82-ebecdb03ffa5
                            YC\x04^ |                Fhx_n\x7f'"\x0eK\x116= |     R;Zo\x05\x00U | | \nz@Qj\x1c | 2308b2e0-fbf0-11c1-db82-ebecdb03ffa5

(20 rows)
cqlsh:ctest01> 

# nodetool flush
# nodetool cfstats ctest01.test04
Keyspace: ctest01
        Read Count: 0
        Read Latency: NaN ms.
        Write Count: 10
        Write Latency: 0.009699999999999999 ms.
        Pending Flushes: 0
                Table: test04
                SSTable count: 1
　:
途中略
　: 
                Number of keys (estimate): 10
　:
途中略
　: 
# 
```

### ③ Local read count, Local write count

Cassandra起動以降のカウンタ値

経時差分を取得することで、単位時間あたりのread/write回数を確認可能 ( と思う )

このカウンタ値はテーブルごとのものなので、どのcoordinator経由かはわからない。


### ④ Pending flushes

datastaxの管理者ガイドで、Importantになってるので。( サンプルは、いつかおいおい )