Amazon Redshift: クラスタのストレージ総容量を取得&算出する

2016.01.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Redshiftではデータ(ファイル)のサイズや増分ペース(日・月・年単位でどれ位取込む必要が出てくるのか)と言った点を考慮してクラスタのスペックやサイズ(ノード数)を決める事になるかと思います。最初は容量も少ないのでクラスタのスペックやノード数も少なめに、そしてデータが蓄積されて行き、利用者も増えて来るに従いスペックやサイズを増やして行く...という流れが良くあるパターンです。

その過程で、データベースそのものの格納容量であったり、現時点での使用量がどんなもんであるかと言った情報を知りたいという局面も出てくる事と思います。当エントリではそんなタイミングで使える『情報の確認方法』についてまとめてみたいと思います。

目次

クラスタにおける総容量

現在の総容量に関する情報を取得

任意のクラスタ内における"格納可能なストレージ容量の総量"を取得する場合、STV_PARTITIONSテーブルからその情報を割り出す事が出来ます。

以下のエントリにその取得例が記載されています。

上記記載のSQLをベースに『使用率』を算出する計算式も入れてみます。取得内容の中の1つめの列、capacity_gbytesが、クラスタにおけるデータベースの総容量、"何GBまでデータを格納出来るか"の数値となります。参照しているクラスタのスペックはノードタイプ:dc1.largeノード数:2となります。ちなみにこのノードタイプにおける1ノードあたりのストレージ容量は0.16TB(160GB)です。....あれ、実測値の方が50GB程多い?w

 SELECT
    SUM(capacity)/1024 AS capacity_gbytes, 
    SUM(used)/1024 AS used_gbytes, 
    (SUM(capacity) - SUM(used))/1024 AS free_gbytes,
    CAST(
      CAST(SUM(used)/1024 AS DOUBLE PRECISION) / CAST(SUM(capacity)/1024 AS DOUBLE PRECISION)
      AS DECIMAL(5,3)
    ) AS used_percentage
  FROM
    stv_partitions
  WHERE
    part_begin = 0;

 capacity_gbytes | used_gbytes | free_gbytes | used_percentage 
-----------------+-------------+-------------+-----------------
             372 |         161 |         210 |           0.433

SQL式をバラして詳細を確認してみます。ノードそれぞれのCapacityの時点で、ドキュメント記載のサイズ(160GB)よりサイズが大きくなっている様ですね。この辺細かい数値は気になる所ではありますが、まぁ多い分には困らないから良しとしときましょうw

SELECT
  owner,
  host,
  diskno,
  part_begin,
  part_end,
  (used/1024) AS used_gb,
  tossed,
  (capacity/1024) AS capacity_gb,
  reads,
  writes,
  seek_forward,
  seek_back,
  is_san,
  failed,
  mbps,
  TRIM(mount) AS mount
FROM
  stv_partitions
ORDER BY
  4,1,2,3;

 owner | host | diskno |  part_begin  |   part_end   | used_gb | tossed | capacity_gb | reads | writes | seek_forward | seek_back | is_san | failed | mbps |   mount   
-------+------+--------+--------------+--------------+---------+--------+-------------+-------+--------+--------------+-----------+--------+--------+------+-----------
     0 |    0 |      0 |            0 | 200041037824 |      81 |      1 |         186 |  6869 |  29508 |         2924 |      2449 |      0 |      0 |    0 | /dev/xvdc
     1 |    1 |      0 |            0 | 200041037824 |      80 |      1 |         186 |  6376 |  27877 |         2621 |      2319 |      0 |      0 |    0 | /dev/xvdc
     0 |    1 |      0 | 200041037824 | 400082075648 |      81 |      1 |         186 |    65 |  29508 |            0 |         0 |      0 |      0 |    0 | /dev/xvdc
     1 |    0 |      0 | 200041037824 | 400082075648 |      80 |      1 |         186 |    65 |  27877 |            0 |         0 |      0 |      0 |    0 | /dev/xvdc
(4 rows)

総容量を見積もる

利用中のクラスタにおけるサイズは上記の方法で求められますが、クラスタを立ち上げる前の情報については公式ドキュメントのスペックを参考にして算出する他無さそうです。

上記ページを元に、ざっくりと数値を求めるスクリプトをPythonで組んでみました。

estimate-redshift-cluster-size.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys

# ノードタイプ
nodeType = str(sys.argv[1])

# ノード数
numberOfNodes = sys.argv[2]

print "ノードタイプ: " + nodeType
print "ノード数  : " + str(numberOfNodes);

nodeSize = 0
if nodeType == "dc1.large":
  nodeSize = 160;
elif nodeType == "dc1.8xlarge":
  nodeSize = 2560;
elif nodeType == "ds2.xlarge":
  nodeSize = 2000;
elif nodeType == "ds2.8xlarge":
  nodeSize = 16000;

print "-> 見積りサイズ(GB):" + str(int(nodeSize) * int(numberOfNodes));

このノードタイプとノード数ならこんなもんかな?と算出する位であればこの程度のものがあれば困らなさそうではあります。

$ ./estimate-redshift-cluster-size.py dc1.large 3
ノードタイプ: dc1.large
ノード数  : 3
-> 見積りサイズ(GB):480

現在使用中のストレージ総容量

現時点でテーブルに蓄積されているデータの総容量、つまり"今どれだけ使っているか"の情報を得るには、STV_BLOCKLISTテーブルの情報を使って算出する事が出来ます。

この部分の詳細については過去のエントリで言及していますのでご確認ください。

まとめ

以上、Amazon Redshiftにおけるクラスタのデータ許容量サイズ、及び現時点でのデータ使用量サイズ取得に関する情報のご紹介でした。Redshiftのディスク使用量についてはCloudWatchの情報としても取得・監視する事が出来ますので(PercentageDiskSpaceUsedというメトリクス。詳細はこちらを参照)、併せて活用頂ければと思います。こちらからは以上です。