マイクロサービス

このチュートリアルでは、Azure Cosmos DB for PostgreSQL を複数のマイクロサービスのストレージ バックエンドとして使用し、このようなクラスターのサンプル セットアップと基本的な操作を実演します。 具体的には、次の方法を学習します。

  • クラスターの作成
  • マイクロサービスのロールを作成する
  • psql ユーティリティを使用してロールと分散スキーマを作成する
  • サンプル データ用のテーブルを作成する
  • サービスの構成
  • サービスの実行
  • データベースを調べる

適用対象: Azure Cosmos DB for PostgreSQL (PostgreSQL の Citus データベース拡張機能を利用)

前提条件

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

クラスターの作成

Azure portal にサインインし、次の手順を実行して、Azure Cosmos DB for PostgreSQL クラスターを作成します。

Azure portal の [Azure Cosmos DB for PostgreSQL クラスターの作成] に移動します。

[Azure Cosmos DB for PostgreSQL クラスターの作成] フォームで、次を実行します。

  1. [基本] タブに情報を入力します。

    [作成] 画面の [基本] タブを示すスクリーンショット。

    ほとんどのオプションは文字どおりのわかりやすいものですが、次の点に注意してください。

    • <node-qualifier>-<clustername>.<uniqueID>.postgres.cosmos.azure.com という形式で、クラスター名によって、アプリケーションで接続に使用する DNS 名が決まります。
    • 15 などの主要な PostgreSQL バージョンを選択できます。 Azure Cosmos DB for PostgreSQL では、選択したメジャー Postgres バージョンの最新の Citus バージョンが常にサポートされます。
    • 管理者ユーザー名は、citus という値にする必要があります。
    • データベース名は既定値 'citus' のままにするか、データベース名のみを定義できます。 クラスターのプロビジョニング後にデータベースの名前を変更することはできません。
  2. 画面の下部にある [次へ: ネットワーク] を選択します。

  3. [ネットワーク] 画面で、[Azure 内の Azure サービスおよびリソースにこのクラスターへのパブリック アクセスを許可する] を選択します。

    [作成] 画面の [ネットワーク] タブを示すスクリーンショット。

  4. [確認および作成] を選択し、検証で問題がなければ、[作成] を選択してクラスターを作成します。

  5. プロビジョニングには数分かかります。 デプロイを監視するために、ページがリダイレクトされます。 状態が [デプロイが進行中です] から [デプロイが完了しました] に変わったら、[リソースに移動] を選択します。

マイクロサービスのロールを作成する

分散スキーマは、Azure Cosmos DB for PostgreSQL クラスター内で再配置できます。 システムは、使用可能なノード全体にわたってそれらをユニット全体として再調整できるため、手動割り当てなしでリソースを効率的に共有できます。

設計上、マイクロサービスはストレージ レイヤーを所有しているため、マイクロサービスによって作成および保存されるテーブルとデータの種類に関する前提条件はありません。 Microsoft は、すべてのサービスにスキーマを提供し、これらが個別のロールを使用してデータベースに接続することを前提としています。 ユーザーが接続すると、そのロール名は search_path の先頭に配置されるため、ロールがスキーマ名と一致する場合は、適切な search_path を設定するためにアプリケーションを変更する必要はありません。

この例では、次の 3 つのサービスを使用します。

  • ユーザー
  • time
  • ping

ユーザー ロールを作成し、サービスごとに次のロールを作成する方法を説明する手順に従ってください。

  • userservice
  • timeservice
  • pingservice

psql ユーティリティを使用して分散スキーマを作成する

psql を使用して Azure Cosmos DB for PostgreSQL に接続すると、いくつかの基本的なタスクを完了することができます。

Azure Cosmos DB for PostgreSQL でスキーマを分散するには、次の 2 つの方法があります。

citus_schema_distribute(schema_name) 関数を呼び出して手動で行います。

CREATE SCHEMA AUTHORIZATION userservice;
CREATE SCHEMA AUTHORIZATION timeservice;
CREATE SCHEMA AUTHORIZATION pingservice;

SELECT citus_schema_distribute('userservice');
SELECT citus_schema_distribute('timeservice');
SELECT citus_schema_distribute('pingservice');

このメソッドを使用すると、既存の標準スキーマを分散スキーマに変換することもできます。

Note

分散テーブルと参照テーブルを含まないスキーマのみを分散できます。

もう 1 つの方法では、citus.enable_schema_based_sharding 構成変数を有効にする方法です。

SET citus.enable_schema_based_sharding TO ON;

CREATE SCHEMA AUTHORIZATION userservice;
CREATE SCHEMA AUTHORIZATION timeservice;
CREATE SCHEMA AUTHORIZATION pingservice;

変数は、現在のセッションに対して変更することも、コーディネーター ノード パラメーターで永続的に変更することもできます。 このパラメーターを ON に設定すると、作成されたすべてのスキーマが既定で分散されます。

次を実行して、現在分散されているスキーマを一覧表示できます。

select * from citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             5 | 0 bytes     | userservice
 timeservice |             6 | 0 bytes     | timeservice
 pingservice |             7 | 0 bytes     | pingservice
(3 rows)

サンプル データ用のテーブルを作成する

ここで、すべてのマイクロサービスに対して Azure Cosmos DB for PostgreSQL に接続する必要があります。 \c コマンドを使用して、既存の psql インスタンス内のユーザーをスワップできます。

\c citus userservice
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);
\c citus timeservice
CREATE TABLE query_details (
    id SERIAL PRIMARY KEY,
    ip_address INET NOT NULL,
    query_time TIMESTAMP NOT NULL
);
\c citus pingservice
CREATE TABLE ping_results (
    id SERIAL PRIMARY KEY,
    host VARCHAR(255) NOT NULL,
    result TEXT NOT NULL
);

サービスの構成

このチュートリアルでは、一連の単純なサービスを使用します。 これらは、次のパブリック リポジトリを複製することで取得できます。

git clone https://github.com/citusdata/citus-example-microservices.git
$ tree
.
├── LICENSE
├── README.md
├── ping
│   ├── app.py
│   ├── ping.sql
│   └── requirements.txt
├── time
│   ├── app.py
│   ├── requirements.txt
│   └── time.sql
└── user
    ├── app.py
    ├── requirements.txt
    └── user.sql

ただし、サービスを実行する前に、user/app.pyping/app.pytime/app.py ファイルを編集し、Azure Cosmos DB for PostgreSQL クラスターの接続構成を提供します。

# Database configuration
db_config = {
    'host': 'c-EXAMPLE.EXAMPLE.postgres.cosmos.azure.com',
    'database': 'citus',
    'password': 'SECRET',
    'user': 'pingservice',
    'port': 5432
}

変更を行った後、変更したすべてのファイルを保存し、サービスを実行する次の手順に進みます。

サービスの実行

すべてのアプリ ディレクトリに移動し、独自の Python 環境で実行します。

cd user
pipenv install
pipenv shell
python app.py

時刻サービスと ping サービスに対してコマンドを繰り返します。その後、API を使用できます。

一部のユーザーを作成します。

curl -X POST -H "Content-Type: application/json" -d '[
  {"name": "John Doe", "email": "john@example.com"},
  {"name": "Jane Smith", "email": "jane@example.com"},
  {"name": "Mike Johnson", "email": "mike@example.com"},
  {"name": "Emily Davis", "email": "emily@example.com"},
  {"name": "David Wilson", "email": "david@example.com"},
  {"name": "Sarah Thompson", "email": "sarah@example.com"},
  {"name": "Alex Miller", "email": "alex@example.com"},
  {"name": "Olivia Anderson", "email": "olivia@example.com"},
  {"name": "Daniel Martin", "email": "daniel@example.com"},
  {"name": "Sophia White", "email": "sophia@example.com"}
]' http://localhost:5000/users

作成されたユーザーを一覧表示します。

curl http://localhost:5000/users

現在の時刻を取得します。

Get current time:

example.com に対して ping を実行します。

curl -X POST -H "Content-Type: application/json" -d '{"host": "example.com"}' http://localhost:5002/ping

データベースを調べる

一部の API 関数を呼び出したので、データは保存されているため、citus_schemas に想定される内容が反映されているかどうかを確認できます。

select * from citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             1 | 112 kB      | userservice
 timeservice |             2 | 32 kB       | timeservice
 pingservice |             3 | 32 kB       | pingservice
(3 rows)

スキーマを作成したとき、どのマシンでスキーマを作成するかを Azure Cosmos DB for PostgreSQL に伝えませんでした。 これは自動的に行われました。 次のクエリを使用すると、各スキーマが存在する場所を確認できます。

  select nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
    from citus_shards
group by nodename,nodeport, table_name;
nodename  | nodeport |         table_name         | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     9701 | timeservice.query_details | 32 kB
 localhost |     9702 | userservice.users         | 112 kB
 localhost |     9702 | pingservice.ping_results  | 32 kB

このページの出力例を簡潔にするために、Azure Cosmos DB for PostgreSQL に表示されている nodename を使用する代わりに、localhost に置き換えます。 localhost:9701 が worker 1 で、localhost:9702 が worker 2 であるとします。 マネージド サービスのノード名の方が長く、ランダム化された要素を含みます。

ユーザーと ping サービスが 2 番目の worker localhost:9702 上の領域を共有している間に、時刻サービスがノード localhost:9701 に到着したことを確認できます。 この例のアプリは単純で、ここでのデータ サイズは無視できますが、ノード間の不均等なストレージ スペースの使用率に悩まされていると仮定しましょう。 大規模なユーザー サービスが単独で存在する間、より小さい 2 つの時間サービスと ping サービスが 1 台のマシンに存在する方が理にかなっています。

クラスターはディスク サイズによって簡単に再調整できます。

select citus_rebalance_start();
NOTICE:  Scheduled 1 moves as job 1
DETAIL:  Rebalance scheduled as background job
HINT:  To monitor progress, run: SELECT * FROM citus_rebalance_status();
 citus_rebalance_start
-----------------------
                     1
(1 row)

完了したら、新しいレイアウトの外観を確認できます。

  select nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
    from citus_shards
group by nodename,nodeport, table_name;
 nodename  | nodeport |         table_name        | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     9701 | timeservice.query_details | 32 kB
 localhost |     9701 | pingservice.ping_results  | 32 kB
 localhost |     9702 | userservice.users         | 112 kB
(3 rows)

期待に応じて、スキーマは移動され、よりバランスの取れたクラスターになっています。 この操作は、アプリケーションに対して透過的です。 これらを再起動する必要さえなく、これらはクエリの処理を続けます。

次のステップ

このチュートリアルでは、分散スキーマを作成する方法について学習し、これらをストレージとして使用してマイクロサービスを実行しました。 また、スキーマベースのシャード化された Azure Cosmos DB for PostgreSQL を調べて管理する方法についても学習しました。