Citusと分散Postgres
Citusを使ってPostgresを分散データベースに変え、同一配置テーブルと参照テーブルを活用します。
「Citusと分散Postgres」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
Citusとは
Citusは、PostgreSQLサーバーのクラスターを分散データベースに変えるPostgreSQL拡張です。コーディネーターに対してSELECT/INSERTを実行すると、Citusが適切なワーカーシャードへ透過的にルーティングします。
アーキテクチャ
2つのロールがあります:
- コーディネーター — クエリを受け取り、クラスターのメタデータを保持し、ルーティングと集約を行います
- ワーカー — シャードデータを保持し、実際のクエリを実行します
セットアップ
コーディネーターとワーカーに拡張をインストールし、ワーカーを登録します:
CREATE EXTENSION citus;
-- On the coordinator, add worker nodes:
SELECT * FROM master_add_node('worker1', 5432);
SELECT * FROM master_add_node('worker2', 5432);分散テーブル
列を指定して、テーブルを分散テーブルとして設定します:
CREATE TABLE orders (
id BIGSERIAL,
user_id BIGINT NOT NULL,
total NUMERIC(10,2),
...
);
SELECT create_distributed_table('orders', 'user_id');
-- Citus splits orders into shards by hash(user_id).リファレンステーブル
すべてのワーカーにレプリケーションされる小さなテーブルです。JOINをローカルで実行できます:
CREATE TABLE countries (id INT, name TEXT);
SELECT create_reference_table('countries');
-- Every worker has a full copy of countries.コロケーション
同じ分散列を持つテーブルはコロケーションされます。特定のuser_idの行は常に同じワーカーに配置されます。user_idによるJOINはローカルで完結します:
SELECT create_distributed_table('orders', 'user_id');
SELECT create_distributed_table('events', 'user_id', colocate_with => 'orders');単一テナントクエリ
Citusは、user_idでフィルタリングされたクエリを適切なワーカーへルーティングするため、高速に処理できます:
SELECT * FROM orders WHERE user_id = 42;
-- Goes to one worker shard, returns in milliseconds.分散集約
CitusはCOUNT/SUMをワーカー間で並列化します:
SELECT user_id, SUM(total) FROM orders GROUP BY user_id;
-- Each worker computes locally; coordinator concatenates.リバランシング
ワーカーを追加し、シャードをリバランスします:
SELECT * FROM citus_add_node('worker3', 5432);
SELECT * FROM rebalance_table_shards('orders');
-- Citus moves some shards onto the new worker.制限事項
- コロケーションされていないテーブルをまたぐトランザクションには制限があります
- 一部のPostgres機能は分散テーブルに適用できません
- スキーマ変更は伝播されますが、調整が必要です
Citus Cloud / Azure
CitusはMicrosoftに買収され、現在はAzure Database for PostgreSQL — Hyperscale (Citus)の一部です。現在もオープンソースで提供されています。
代替製品
- YugabyteDB — 分散型のPostgreSQL互換データベース
- CockroachDB — Postgres wire互換の分散データベース
- Pgvector / TimescaleDB — 単一ノード向けの特化製品
Citusが適している場合
各テナントのクエリを分離するマルチテナントSaaSに適しています。テナントと時刻でパーティション分割する時系列データにも適しています。並列集約を行う分析用途にも適しています。
まとめ
CitusはPostgresを分散化します。
- コーディネーターとワーカー
- 列で分散し、ローカルJOINのためにコロケーション
- 共有ディメンションにはリファレンステーブル
- 最適な用途:マルチテナントSaaS
確認問題
Citusで2つの分散テーブルを同じキーにコロケーションするメリットは何でしょうか。
よくある質問
「Citusと分散Postgres」レッスンは無料ですか?
はい。「Citusと分散Postgres」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「Citusと分散Postgres」で何を学びますか?
Citusを使ってPostgresを分散データベースに変え、同一配置テーブルと参照テーブルを活用します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Citusと分散Postgres」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シャーディング戦略:範囲、ハッシュ、ディレクトリ
- シャード間クエリ:難しい問題
- Citusと分散Postgres
- シャーディングしない場合