Cassandraの巨大パーティション特定方法

# はじめに
Apatch Cassandraではパーティションサイズが大きくなることで性能劣化などが起こる可能性があります。

Metricsからパーティションサイズを取得することができますが、どのパーティションが巨大化しているかを特定することはできません。

外部ツールのic-toolsを用いて巨大パーティションを特定する方法を紹介します。

# 対象読者
Cassandraをサーバ上で運用している方

# 巨大パーティションの特定
### ノードの特定
jmxメトリクスを取得しGrafanaなどを用いてノード毎の最大パーティションサイズを表示していれば早いですが、していない場合はnodetool tablestatsで各ノードが持つパーティションサイズを特定します。
ansibleの利用方法については以下を参考にしてください。
https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html

```bash
# パーティションサイズ確認コマンド
$ sudo nodetool -u <nodetool user> -pw <nodetool password> tablestats -- <keyspace>.<table> | grep -e "Compacted partition maximum bytes:"
 
# 複数台まとめて確認する場合
$ ansible all -i <INV FILE OR LIST> -f 5 -m shell -a 'nodetool -u <nodetool user> -pw <nodetool password> tablestats -- <keyspace>.<table> | grep -e "Compacted partition maximum bytes:"' --become --ask-become-pass --ssh-common-args='-o StrictHostKeyChecking=no'
```
特定した大きいパーティションを持つノードを作業ノードとします。

### ic-toolsの準備
gitからic-toolsを取得します。
```bash
$ git clone git@github.com:instaclustr/cassandra-sstable-tools.git
$ cd cassandra-sstable-tools
$ git checkout <cassandraバージョンに合わせる>
```
### jarファイルのダウンロード
下記ページの一番下からic-sstable-tools-<version>.jarをダウンロードします。

https://www.instaclustr.com/support/documentation/cassandra/using-cassandra/ic-tools-for-cassandra-sstables/

### 作業サーバーへファイルの配置
```bash
# jarファイル転送
$ scp ic-sstable-tools.jar <ユーザ名>@<作業サーバー>:~
  
# ic-toolsのic-pstatsを転送
$ cd cassandra-sstable-tools
$ scp bin/ic-pstats <ユーザ名>@<作業サーバー>:~
```

### ic-toolsの実行
```bash
$ ssh <作業サーバー>
 
# jarファイルの配置
$ sudo cp ic-sstable-tools.jar /usr/share/cassandra
 
# 調査用snapshotの作成(snapshot名は任意のもの)
$ sudo nodetool snapshot -t partition_survey
 
# ic-pstatsの実行
$ sudo ./ic-pstats <keyspace> <table> -t partition_survey
 
# 出力結果
% sudo ./ic-pstats keyspace1 standard1 -t partition_survey
Analyzing SSTables... ██████████████████████████████ (100%)

Summary:
+----------+----------+---------+
|          | Size     | SSTable |
+----------+----------+---------+
| Count    | 38240939 |         |
| Total    |   9.2 GB |      11 |
| Minimum  |    230 B |       1 |
| Average  |    240 B |     1.0 |
| std dev. |     25 B |     0.1 |
| 50%      |    235 B |     1.0 |
| 75%      |    235 B |     1.0 |
| 90%      |    235 B |     1.0 |
| 95%      |    235 B |     1.0 |
| 99%      |    467 B |     2.0 |
| 99.9%    |    470 B |     2.0 |
| Maximum  |    490 B |       2 |
+----------+----------+---------+

Largest partitions:
+----------------------+-------+---------------+
| Key                  | Size  | SSTable Count |
+----------------------+-------+---------------+
| 37303233504f37383431 | 490 B |             2 |
| 504d31344b3833383830 | 490 B |             2 |
| 34343536313638503330 | 490 B |             2 |
| 4b334b4d393333313930 | 490 B |             2 |
| 4c3235364d3531323431 | 490 B |             2 |
| 374e37384b32394e5030 | 490 B |             2 |
| 314b394e505036503930 | 490 B |             2 |
| 364d39303034344f3830 | 490 B |             2 |
| 35304b4c393230383231 | 490 B |             2 |
| 35323736365033393130 | 490 B |             2 |
+----------------------+-------+---------------+

SSTable Leaders:
+----------------------+---------------+-------+
| Key                  | SSTable Count | Size  |
+----------------------+---------------+-------+
| 37303233504f37383431 |             2 | 490 B |
| 504d31344b3833383830 |             2 | 490 B |
| 34343536313638503330 |             2 | 490 B |
| 4b334b4d393333313930 |             2 | 490 B |
| 4c3235364d3531323431 |             2 | 490 B |
| 374e37384b32394e5030 |             2 | 490 B |
| 314b394e505036503930 |             2 | 490 B |
| 364d39303034344f3830 |             2 | 490 B |
| 35304b4c393230383231 |             2 | 490 B |
| 35323736365033393130 |             2 | 490 B |
+----------------------+---------------+-------+

SSTables:
+--------------------+----------+-------------------------+-------------------------+-------+------------+--------------------+--------------------+
| SSTable            | Size     | Min Timestamp           | Max Timestamp           | Level | Partitions | Avg Partition Size | Max Partition Size |
+--------------------+----------+-------------------------+-------------------------+-------+------------+--------------------+--------------------+
| md-75-big-Data.db  | 860.9 MB | 2020-08-21 08:47:37.473 | 2021-07-19 10:29:26.506 |     0 |    3667419 |              234 B |              245 B |
| md-90-big-Data.db  |   1.7 GB | 2020-08-21 08:47:37.468 | 2021-07-19 10:29:26.506 |     0 |    7274980 |              234 B |              245 B |
| md-92-big-Data.db  |   2.4 GB | 2020-08-21 08:47:37.468 | 2021-07-19 10:29:26.506 |     0 |   10153824 |              234 B |              245 B |
| md-94-big-Data.db  |   2.0 GB | 2020-08-21 08:47:37.464 | 2021-07-19 10:29:26.506 |     0 |    8393288 |              234 B |              245 B |
| md-95-big-Data.db  | 537.2 MB | 2020-08-21 08:47:37.471 | 2021-07-19 10:29:26.505 |     0 |    2289139 |              234 B |              245 B |
| md-96-big-Data.db  |  13.6 MB | 2020-08-21 08:50:25.569 | 2021-07-19 10:29:26.374 |     0 |      58020 |              234 B |              245 B |
| md-97-big-Data.db  |  76.2 MB | 2020-08-21 08:47:39.141 | 2021-07-19 10:29:26.505 |     0 |     324438 |              234 B |              245 B |
| md-99-big-Data.db  |  70.7 MB | 2020-08-21 08:47:37.525 | 2021-07-19 10:29:26.505 |     0 |     301123 |              234 B |              245 B |
| md-100-big-Data.db | 550.1 MB | 2020-08-21 08:50:25.534 | 2021-07-19 10:29:26.505 |     0 |    2343504 |              234 B |              245 B |
| md-101-big-Data.db | 116.8 MB | 2020-08-21 08:50:25.542 | 2021-07-19 10:29:26.505 |     0 |     497577 |              234 B |              245 B |
| md-102-big-Data.db | 875.6 MB | 2020-08-21 08:47:37.539 | 2021-07-19 10:29:26.503 |     0 |    3729953 |              234 B |              245 B |
+--------------------+----------+-------------------------+-------------------------+-------+------------+--------------------+--------------------+
```

出力の"Largest partitions"でどのpartition keyが巨大化しているのを確認できます。(上記出力サンプルはcassandra-stressで投入したデータなので、サイズが均等になっています)

## 終わりに
ic-toolsを利用することで巨大パーティションを特定し、パーティションの削除や発生しないようにするなどの対策を行えます。

## 参考
https://www.instaclustr.com/support/documentation/cassandra/using-cassandra/ic-tools-for-cassandra-sstables/
https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html