Amazon Web Services ブログ

DynamoDB ShellでAmazon DynamoDB global tablesを扱う

DynamoDB ShellでAmazon DynamoDB global tablesを扱う

global tablesはAmazon DynamoDBのグローバルなフットプリントを基盤として構築され、フルマネージド型のマルチリージョン、マルチアクティブデータベースを実現し、大規模にスケーリングされたグローバルなアプリケーションに高速でローカルな読み取りと書き込みのパフォーマンスを提供します。global tablesは、選択した AWS リージョンで DynamoDB tableを自動的にレプリケーションします。

DynamoDB Shellは DynamoDB 用のインタラクティブなコマンドラインインターフェイスです。DynamoDB Shell を使用してデータ定義言語 (DDL) とデータ操作言語 (DML) の操作を実行でき、global tables操作の DDL がサポートされるようになりました。DynamoDB Shellを使用してデータをクエリする方法の概要については、「 Query data with DynamoDB Shell – a command line interface for Amazon DynamoDB」を参照してください。

この記事では、DynamoDB Shell の一部の機能を簡単に要約し、global tablesのサポート方法を紹介し、DynamoDB の新規ユーザーがglobal tablesを使い始める方法を簡単に説明しています。

DynamoDB global table

グローバルアプリケーションには、データを顧客に近いところに置くことがメリットとなります。顧客層がグローバルに分散しているため、アプリケーション設計者は、顧客をグローバルで一貫した方法で管理できるデータベースを必要としています。DynamoDB global tablesを使用すると、多くのリージョンで動作し、フルマネージドでマルチアクティブなtableを作成できます。任意のリージョンのデータへの更新は、DynamoDB によって他のすべてのリージョンに自動的にレプリケーションされます。データは最終的に一貫していることが保証され、同じアイテムが複数のリージョンでほぼ同時に更新された場合は、後の更新が優先されます。DynamoDB global tablesの詳細については、Amazon DynamoDB global tablesを参照してください。

DynamoDB global tablesには 2つのバージョンがあります。DynamoDB Shell は、現在の 2019.11.21 バージョンのみ DDL をサポートしています。これにより、柔軟性と効率性が向上し、以前のバージョンよりも書き込み容量が少なくなります。

DynamoDB Shell use case

global tablesで DynamoDB Shell を使用する例として、航空会社のフライトを追跡するアプリケーションを考えてみましょう。次の例では、DynamoDB Shellでアプリケーションのtableを作成します。DynamoDB Shell では、プロンプトには接続されたリージョンの名前が含まれていることを思い出してください。セッションは1つのリージョンにのみ接続さますが、connectコマンドを使用してリージョンを切り替えることもできます。この例では米国東部 (オハイオ) us-east-2リージョンへ接続しています。

us-east-2> create table flights ( fltno string, route string ) primary key ( fltno hash, route range );
CREATE
us-east-2>

次に、いくつかのデータをtableに入力します。

us-east-2> insert into flights ( fltno, route, status ) values ( "QR573", "BLR-DOH", "SCHEDULED" ), ("QR743", "DOH-BOS", "SCHEDULED");
INSERT
INSERT
us-east-2> select * from flights;
{fltno: QR743, route: DOH-BOS, status: SCHEDULED}
{fltno: QR573, route: BLR-DOH, status: SCHEDULED}
us-east-2>

このtableは us-east-2リージョンに作成されているため、このデータにアクセスしたいアプリケーションは、us-east-2リージョン に接続する必要があります。

それでは、このtableを 欧州 (パリ)eu-west-3 リージョンとアジアパシフィック (ムンバイ) ap-south-1リージョンにレプリカを持つglobal tablesに変換してみましょう。

us-east-2> alter table flights add replica ap-south-1;
ALTER
us-east-2> alter table flights add replica eu-west-3;
ALTER
us-east-2>

describe コマンドをglobal tables変換後すぐに実行すると、作成中のレプリカを確認することができます。

us-east-2> describe flights;
Name: flights (ACTIVE)
Key: HASH fltno, RANGE route[...]
Replica Region: eu-west-3 (Status: CREATING)
Replica Region: ap-south-1 (Status: CREATING)
Replica Region: us-east-2 (Status: ACTIVE)
us-east-2>

DynamoDB global tablesが 3つのロケーションすべてにtableを設定し、ロケーション間でマルチアクティブレプリケーションを確立するまで数分かかります。レプリカを追加するときにtableに大量のデータがある場合は、レプリケーションが確立されるまでに少し時間がかかる場合もあります。既存のレプリカ (この場合は us-east-2) は、新しいレプリカが作成されてデータが入力されている間も引き続き使用できます。

数分後に再度確認すると次のように結果を確認することが出来ます。

us-east-2> describe flights;
Name: flights (ACTIVE)
Key: HASH fltno, RANGE route[...]
Replica Region: eu-west-3 (Status: ACTIVE)
Replica Region: ap-south-1 (Status: ACTIVE)
Replica Region: us-east-2 (Status: ACTIVE)
us-east-2>

それでは、ap-south-1リージョンのデータを見てみましょう。

us-east-2> connect ap-south-1;
CONNECT
ap-south-1> select * from flights;
{fltno: QR743, route: DOH-BOS, status: SCHEDULED}
{fltno: QR573, route: BLR-DOH, status: SCHEDULED}
ap-south-1>

DynamoDB は us-east-2リージョンから ap-south-1リージョンへのデータのレプリケーションに成功しました。

ここで、フライトがBLRからDOH(インドのバンガロールからカタールのドーハへ)に出発したとします。これで、アプリケーションはQR573便のステータスを出発済みに切り替える必要があります。そのさいインドにあるコンポーネントはap-south-1リージョン のデータベースに論理的に接続して更新を実行します。

ap-south-1> update flights set status = "DEPARTED" where fltno = "QR573" and route = "BLR-DOH";
UPDATE (0 read, 1 modified, 0 ccf)
ap-south-1>

このフライトの乗客の家族がたまたまボストンにいてフライトの状況を確認する場合、us-east-2リージョンにホストされているWebページにアクセスして、QR573便のステータスを調べます。

ap-south-1> connect us-east-2;
CONNECT
us-east-2> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: DEPARTED}
us-east-2>

結果が示すようにDynamoDB のglobal tablesは、アプリケーションからap-south-1リージョンへの更新なしに us-east-2リージョン への書き込みをレプリケーションしています。

飛行機がDOHに着陸すると、eu-west-3リージョンにホストされているアプリケーションがtableを更新します。

eu-west-3> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: DEPARTED}
eu-west-3> update flights set status = "ARRIVED" where fltno = "QR573" and route = "BLR-DOH";
UPDATE (0 read, 1 modified, 0 ccf)
eu-west-3> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: ARRIVED}
eu-west-3>

この更新はほぼ瞬時に行われ、us-east-2リージョンにも反映されて確認することが出来ます。

eu-west-3> connect us-east-2;
CONNECT
us-east-2> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: ARRIVED}
us-east-2>

このように、複数のリージョンにデータがあるグローバルに分散されたアプリケーションは、完全にアクティブ-アクティブに動作できます。このレプリケーションはすべて DynamoDB global tablesによって自動的に処理されます。コンフリクトの解決は「最後のwriteが優先される」という基準で進められます。データは非同期で伝播され、最終的には一貫性が保たれます。

us-west-2リージョン に別のレプリカを追加したいとしましょう。DynamoDB Shellはこれを実行することもできます (もう 1 つの ALTER TABLE の呼び出し方です)。そして、DynamoDB Shellは EXPLAIN コマンドもサポートしています。これにより、実行される API 呼び出しがわかります。

us-east-2> explain alter table flights add replica us-west-2;
UpdateTable({
    "TableName": "flights",
    "ReplicaUpdates": [{
        "Create": {
            "RegionName": "us-west-2",
            "TableClassOverride": "STANDARD"
        }
    }]
})

explainコマンドは、新しい DynamoDB ユーザーが DynamoDB API を学習するうえで便利な方法です。

最後に、us-west-2リージョンにレプリカを追加して、レプリカのtable classを DynamoDB 標準-低頻度アクセス (DynamoDB Standard-IA) に設定してみましょう。

us-east-2> alter table flights add replica us-west-2 table class standard infrequent access;
ALTER
us-east-2>

コマンドが完了すると、us-west-2リージョンに Standard-IA table classを使用するtableが作成されます。

us-west-2> describe flights;
Name: flights (ACTIVE)
[…]
Table Class: STANDARD_INFREQUENT_ACCESS[…]
Replica Region: eu-west-3 (Status: ACTIVE)
Replica Region: ap-south-1 (Status: ACTIVE)
Replica Region: us-east-2 (Status: ACTIVE)
Replica Region: us-west-2 (Status: ACTIVE)
us-west-2>

この例では、us-east-2リージョン にtable (on-demandまたはpay-per-request table) を作成し、DynamoDB Shellを使用して ap-south-1リージョン と eu-west-3リージョン に 2 つのglobal tablesレプリカを作成しました。

us-east-2リージョンに挿入されたデータが、他の 2 つのレプリカに自動的に伝播されることを確認しました。任意のリージョンのデータに加えられた更新は、すべてのリージョンにレプリケーションされます。

DynamoDB Shellでは、local tableと同様に、regional tablesとglobal tableで SELECTINSERTUPDATEUPSERTREPLACEDELETE がサポートされています。すべての変更は、DynamoDB global tablesによってすべてのレプリカに自動的に反映されます。

まとめ

DynamoDB global tablesは、グローバルに分散されたアプリケーションを構築できる強力な構造です。データのレプリケーションは DynamoDB によって完全に管理され、コンフリクトの解決は「最後のwriteが勝つ」方式で行われます。データは非同期で伝播され、最終的には一貫性が保たれます。

DynamoDB Shell は、DynamoDB と DynamoDB のglobal tablesを使い始めたり、フルマネージドデータベースサービスで提供される機能や機能を調べたりするのに役立ちます。

DynamoDB Shellを試したことはありますか?Shellでサポートしてほしい機能を教えてください。DynamoDB Shellの使用を開始するには、Query data with DynamoDB Shell – a command line interface for Amazon DynamoDB を参照するか、GitHub repoREADME.mdファイルの指示に従ってください。

著者について

Amrith Kumar はアマゾンウェブサービスのシニアプリンシパルエンジニアとして活動し、 Amazon DynamoDB に従事しています

本記事は 2023/04/19に投稿された Use Amazon DynamoDB global tables in DynamoDB Shellを翻訳した記事です。翻訳はソリューションアーキテクトのTakahiro Iwaseが担当しました。