AWS
redshift

Redshiftのストレージ容量のメンテナンス

Amazon(AWS) Redshiftはとてつもなく強力ですが
ストレージサイズが自由に選べないので、容量がなくなったときにはノードを追加するしかありません。

処理速度をあげたりする分にはノード追加はよいですが、
容量確保のためにはあまりバカスカ増やすのもいろいろ大変()・・

運用したまま極力ストレージ使用量を増やさない手段はあまり無いですが
(列の圧縮やRedshift SpectrumでテーブルをS3に移すなど、運用入ってるものには対応難しいですよね・・)
現状を知ることは重要ですし、そこから対策も打ちやすくなります。

今の状態をぱっとみるならCloudWatchがいいですね
常にメトリックスが送り続けられているので変化も含めてわかりやすいです。

AWS Webコンソール画面左上などからCloudWatchを選択
左メニューから「メトリクス」を選択
「すべてのメトリック」タブから「Redshift」を選択
「クラスター別の集計」を選択
ClusterIdentifier」から該当のRedshiftクラスタIDを探しメトリクス名「PercentageDiskSpaceUsed」の行のチェックをすると、上部にグラフが表示されます。
このままだとざっくりしたフラフが表示されるので
「グラフ化したメトリクス」タブから
 「統計」列を「最大」
 「期間」列を「1分」
にしてみましょう。
また、画面上部の「1時間 3時間」・・といった期間範囲を選べば過去の推移が分かります。

Cloudwatchは値が変化し、設定値になった・超えた・下回った場合、アラートメールを送ることができます。
先の「グラフ化したメトリクス」で表示されている行の右側に「ベル」アイコンがあるので

次の時:
PercentageDiskSpaceUsed (PercentageDiskSpaceUsed) 
が >= 75 

と設定すれば、75%以上になったら場合メールを飛ばしてくれます。
(逆に75%を下回ったら「OKの状態になったよ」メールを送ってくれることも出来ます)

さて、クラスターの全体のストレージ容量の状態はわかったので、
次は個々のデータベースやテーブルの容量を確認してみましょう

まずは、psqlでRedshiftにログインしましょう

テーブルの状態やテーブルサイズの確認するには
「SVV_TABLE_INFOシステムビュー」が最短っぽいです。
AWS Documentation » Amazon Redshift » データベース開発者ガイド » システムテーブルのリファレンス » システムビュー » SVV_TABLE_INFO

select * from SVV_TABLE_INFO order by size desc;

でテーブルの使用容量が多い順に表示できます。
sizeが1Mブロックの使用数、tbl_rowsがレコード行数です。

select sum(size) from SVV_TABLE_INFO ;

でDB全体量もわかりますね。

で、例えばレコード削除してもいいよって事になったら、
Delete文を打ちますが、せっかく溜め込んだデータをサクサク消すのも少々能が無いので
S3に一旦退避させてから消すのも良いかと思います。
実際にはunload文を使います

unload (
    'select * from テーブル名 where キー between \'\' and \'\' '
) TO 's3://バケット名/保存名' credentials 'aws_access_key_id=AWSアクセスキー;aws_secret_access_key=AWSアクセスキーのシークレットキー' MANIFEST GZIP delimiter '\\t' ESCAPE ALLOWOVERWRITE PARALLEL ON ;

事前にバケットの用意と、バケットにアクセスできるAWSアクセスキーを用意しておいて下さい

退避させておけばいざという時はload文ですぐに戻せますし、
Redshift Spectrumで参照できるようにしておくだけでも安心感は違うと思います。

さてさて、もし消せるデータがあったのでdelete文を打ってもすぐにはストレージの空きが増えない可能性があります。
AWS Redshiftはpostgresqlをベースに開発されているようですし、postgresqlといえば、バキューム!

AWS Documentation » Amazon Redshift » データベース開発者ガイド » SQL リファレンス » SQL コマンド » VACUUM

vacuum;

と打つだけです。
バキュームをしたらアナライズもしておきましょう。
AWS Documentation » Amazon Redshift » データベース開発者ガイド » SQL リファレンス » SQL コマンド » ANALYZE

これも

analyze;

と打つだけです。

これで随分空き容量が増えたんじゃないかと思います。
(もちろん、毎日バキュームしてるよってことだともう最適化されまくってるってことなのでなかなか難しいですが・・)

どんどん入れておきたいところですが、なんとかがんばってメンテナンスしておけば
いつの間にか使用量が100%行っちゃってたってのも防げると思う次第です。

(いい方法あったら追記していきます)