AWS ことはじめ その3 (DynamoDB Part 1)
なんでDynamoDBを使いたいのか
IoTっぽい時系列データを蓄積したい的な話。データの件数が数億~数百億のオーダーになる可能性があり、どれくらい現実的なのかを調べたいため。無料枠でできる範囲で試してみる。 いい感じに検証できる環境があればいいんだけど、数週間かかりそうでSIerのつらみを感じている。
ためたいデータ
蓄積したいデータは、ある機器が生成するもので、機器自体の数は1万〜100万くらいのオーダーと思われる。
個々のデータは、幾つか種類がある。
- たまに発生するデータ。アラート情報的なやつ。機器1台・1時間あたり、10回くらい?
- 継続して発生するデータ。メトリクス的なやつ。データ自体は1秒単位だが、1分、3分とかの単位でまとまった状態で機器が発信する。
用途
集計・分析を行うことは(今のところ)想定しておらず、機器ごとに最新データや過去の特定日時のデータを見たい、というもの。基本的には一本釣りに近い形だが、ある程度の範囲でのデータ検索が発生する可能性があり、おもにそこのレスポンスを知りたい。
データ自体は何らかの形で永年で保存しておきたいが、検索を行う期間は限定できる。直近1年間のデータのみ検索可能、とか。
DynamoDBのざっくりまとめ
DynamoDBはAWSのマネージド型Key-Value Stroe。NoSQLに分類される。
- Primary Keyを指定する以外は、スキーマレス。
- Primary Keyには、HASHキーとRANGEキー(SORTキー)を指定する。RANGEキーの方は任意。
- HASHキーで物理的な格納場所が決まり、RANGEキーでソートして格納されるイメージ。
- JSON形式で表現したデータを入れたり出したりできる
- NoSQLなのであまり複雑な検索はできない。基本的にはPrimary Keyで一本釣りするイメージ。
- Secondary Indexを作ることで、ある程度検索に使えるキーを増やすこともできる。
- Primary Keyには、HASHキーとRANGEキー(SORTキー)を指定する。RANGEキーの方は任意。
- 料金に効いてくるのは、①データ量、②スループットの2つ。事前にスループットを指定しないといけないのが肝。
- スループットは、キャパシティユニット(CU; Capacity Unit)という単位。読み取り(RCU)と書き込み(WCU)の2つで管理する。
- 1RCU = 1秒間に1KBまでの読み込みを行える。結果整合性のみでよい(=多少最新の更新が漏れてもよい)場合、倍になる。
- 1WCU = 1秒間に1KBまでを書き込みできる。
CLIでのDynamoDB作成
以下3種類を作成する。
- たまに発生するデータを格納しておくテーブル
- 1秒間隔で発生するデータを格納しておくテーブル。1つの項目(レコード)に1分、3分などのデータをまとめて持っておく
- 1秒間隔で発生するデータを格納しておくテーブル。1秒単位に項目(レコード)を持っておく
公式のドキュメントを見ながら実行。そろそろ手でコマンド打つのが辛くなってくる。 https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html
❯ aws dynamodb create-table \ --table-name sparse-data \ --attribute-definitions AttributeName=sid,AttributeType=S AttributeName=unixtime,AttributeType=N \ --key-schema AttributeName=sid,KeyType=HASH AttributeName=unixtime,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 { "TableDescription": { "AttributeDefinitions": [ { "AttributeName": "sid", "AttributeType": "S" }, { "AttributeName": "unixtime", "AttributeType": "N" } ], "TableName": "sparse-data", "KeySchema": [ { "AttributeName": "sid", "KeyType": "HASH" }, { "AttributeName": "unixtime", "KeyType": "RANGE" } ], "TableStatus": "CREATING", "CreationDateTime": 1526805606.531, "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "TableSizeBytes": 0, "ItemCount": 0, "TableArn": "arn:aws:dynamodb:ap-northeast-1:***masked***:table/sparse-data", "TableId": "***masked***" } } ❯ aws dynamodb create-table \ --table-name continuous-data-aggr \ --attribute-definitions AttributeName=sid,AttributeType=S AttributeName=unixtime,AttributeType=N \ --key-schema AttributeName=sid,KeyType=HASH AttributeName=unixtime,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 { "TableDescription": { "AttributeDefinitions": [ { "AttributeName": "sid", "AttributeType": "S" }, { "AttributeName": "unixtime", "AttributeType": "N" } ], "TableName": "continuous-data-aggr", "KeySchema": [ { "AttributeName": "sid", "KeyType": "HASH" }, { "AttributeName": "unixtime", "KeyType": "RANGE" } ], "TableStatus": "CREATING", "CreationDateTime": 1526805540.236, "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "TableSizeBytes": 0, "ItemCount": 0, "TableArn": "arn:aws:dynamodb:ap-northeast-1:***masked***:table/continuous-data-aggr", "TableId": "***masked***" } } aws dynamodb create-table \ --table-name continuous-data \ --attribute-definitions AttributeName=sid,AttributeType=S AttributeName=unixtime,AttributeType=N \ --key-schema AttributeName=sid,KeyType=HASH AttributeName=unixtime,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 { "TableDescription": { "AttributeDefinitions": [ { "AttributeName": "sid", "AttributeType": "S" }, { "AttributeName": "unixtime", "AttributeType": "N" } ], "TableName": "continuous-data", "KeySchema": [ { "AttributeName": "sid", "KeyType": "HASH" }, { "AttributeName": "unixtime", "KeyType": "RANGE" } ], "TableStatus": "CREATING", "CreationDateTime": 1526804024.601, "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "TableSizeBytes": 0, "ItemCount": 0, "TableArn": "arn:aws:dynamodb:ap-northeast-1:***masked***:table/continuous-data", "TableId": "***masked***" } } ❯ aws dynamodb list-tables { "TableNames": [ "continuous-data", "continuous-data-aggr", "sparse-data" ] }
次回は、①データの投入、②バッチ投入、③データの読み込みの時間計測