**Show HN:PgDog ― アプリを改変せずにPostgreSQLを拡張する**

2026/02/24 0:33

**Show HN:PgDog ― アプリを改変せずにPostgreSQLを拡張する**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

PgDogは、接続プーリング、ロードバランシング、シャーディング、トランザクション・プール、ヘルスチェック、およびフェイルオーバー監視を1つの軽量サービスに統合したRustベースのPostgreSQLプロキシです。
それは2つのTOML構成ファイルを使用します―

pgdog.toml
はホストリスト、シャーディングルール(HASH / LIST / RANGE またはスキーマベース)およびプール設定用、
users.toml
はユーザー名/パスワードのマッピング用です。オプションでコマンドライン上で
--config
--users
--database_url
を指定して上書きすることもできます。

ルーティングロジック:PgDogはクエリを解析し、書き込みはプライマリノードへ、読み取りはレプリカへ(必要に応じて読み取り専用トランザクションのルーティング付き)とルートします。また、クロスシャード操作を再記述します。サポートされるクエリタイプには SELECT、INSERT、UPDATE/DELETE、DDL、集計関数、部分的な ORDER BY / GROUP BY、複数タプル INSERT、および書き換え規則により自動で更新されるシャードキーが含まれます。

シャーディング機能

pgdog.unique_id()
を使用して BIGINT の主キーを生成します(シーケンスは不要)し、PostgreSQL の2フェーズコミットをサポートしてクロスシャード書き込みの原子性を保証します。再シャーディングワークフローが用意されており、スキーマ同期、データレプリケーション、および原子的な切替シーケンス(
MAINTENANCE ON → RELOAD → MAINTENANCE OFF
)があります。

モニタリング:PgBouncer スタイルの管理データベースと OpenMetrics エンドポイントを通じてメトリクスを公開します。Datadog ダッシュボードも同梱されています。

展開:Kubernetes(EKS またはセルフホスト)上で Helm チャートを使用して本番環境にデプロイでき、Terraform モジュールで ECS に、Docker Compose でローカルテストに、または単純に

cargo run --release
で実行できます。

ライセンス:AGPL v3 の下で配布され、内部利用およびプライベートな変更は許可されていますが、ソフトウェアを公開サービスとして提供する場合はソースコードの開示が必要です。

要約すると、PgDog は最小限のカスタムコードで PostgreSQL ワークロードにスケーラブルなシャーディングを追加できるため、運用複雑性を削減し、スケール時のパフォーマンスを向上させます。

本文

PgDog – PostgreSQL のスケーリングを支えるプロキシ

PgDog は Rust で書かれ、接続プール、クエリのロードバランシング、およびデータベース全体のシャーディング機能を提供します。高速・安全で、商用ハードウェア上でも数千個の接続を管理できます。


ドキュメント

📘 PgDog ドキュメント – ご質問は Discord へどうぞ。


クイックスタート

Kubernetes

helm repo add pgdogdev https://helm.pgdog.dev
helm install pgdog pgdogdev/pgdog

AWS

  • EKS またはセルフホスト型 Kubernetes クラスター用の Helm チャート
  • ECS 上に PgDog をデプロイする Terraform モジュール

Docker で試す

Docker Compose をインストールし、次を実行します。

docker compose up -d

起動後は

psql
または任意の PostgreSQL クライアントで接続してください:

PGPASSWORD=postgres psql -h 127.0.0.1 -p 6432 -U postgres

デモデータ(3 シャード、2 シャーディングテーブル):

INSERT INTO users (id, email) VALUES (1, 'admin@acme.com');
INSERT INTO payments (id, user_id, amount) VALUES (1, 1, 100.0);
SELECT * FROM users WHERE id = 1;
SELECT * FROM payments WHERE user_id = 1;

特徴

設定

PgDog は以下の 2 ファイルを必要とします:

  • pgdog.toml – ホスト、シャーディング設定、その他オプション
  • users.toml – ユーザー名とパスワード

単一ユーザー・データベース(同一マシン)例:

# pgdog.toml
[general]
port = 6432
default_pool_size = 10

[[databases]]
name = "pgdog"
host = "127.0.0.1"

# users.toml
[[users]]
name = "alice"
database = "pgdog"
password = "hunter2"

pgdog.toml
のデータベースに
users.toml
に対応するユーザーが無い場合、プールは作成されず、接続できません。

ローカルデータベースとユーザーを作成:

CREATE DATABASE pgdog;
CREATE USER pgdog PASSWORD 'pgdog' LOGIN;

トランザクション・プーリング

PgDog は PgBouncer と同様にトランザクション(およびセッション)プールをサポートし、

SET
文とスタートアップオプションも解析します。アプリケーションクラッシュ時の自動放棄トランザクション回滚や再同期など、高度な接続復旧機能があります。

ロードバランサ

PostgreSQL 用の OSI Layer 7 ロードバランサです。プロトコルを理解し、複数レプリカ(およびプライマリ)へプロキシし、ラウンドロビンランダム最小アクティブ接続 のいずれかでトランザクションを均等に分配します。

例 – 2 ホスト間のラウンドロビン:

[[databases]]
name = "prod"
host = "10.0.0.1"
role = "primary"

[[databases]]
name = "prod"
host = "10.0.0.2"
role = "replica"

ヘルスチェック

PgDog はリアルタイムでヘルシーホストのリストを保持し、失敗したホストは回転から除外され、クエリは再ルーティングされます。

シングルエンドポイント

pg_query
を利用して各クエリを解析し、書き込み(INSERT, UPDATE, CREATE TABLE …)はプライマリへ、読み取りはレプリカへ送ります。アプリケーションは一度接続すれば読書の両方に使用できます。

トランザクション

プライマリ/レプリカ構成では、トランザクションは読み取り専用でない限りプライマリへルーティングされます:

BEGIN READ ONLY;
SELECT * FROM users LIMIT 1;
COMMIT;

フェイルオーバー

PgDog はレプリケーション状態を監視し、レプリカが昇格した場合に書き込みをリダイレクトします。Patroni や AWS RDS などと併用するのに適しています。

例 – 自動フェイルオーバーを有効化:

[general]
lsn_check_delay = 0

[[databases]]
name = "prod"
host = "10.0.0.1"
role = "auto"

[[databases]]
name = "prod"
host = "10.0.0.2"
role = "auto"

シャーディング

PgDog はシャーディングキーを解析してクエリを正しいシャードへルーティングします。クロスシャードクエリでは、結果をメモリ上で組み立てます。

例 – 同一データベースの 2 シャード:

[[databases]]
name = "prod"
host = "10.0.0.1"
shard = 0

[[databases]]
name = "prod"
host = "10.0.0.2"
shard = 1

少なくとも 1 つのシャーディングテーブルが必要です。

シャーディング関数

  • PostgreSQL パーティション関数 – HASH, LIST, RANGE
  • スキーマベースのシャーディング – 同一スキーマ内のテーブルは同じシャードへ

例 –

user_id
に対するハッシュシャーディング:

[[sharded_tables]]
database = "prod"
column   = "user_id"

リストシャーディング例:

[[sharded_tables]]
database = "prod"
column   = "user_id"

[[sharded_mapping]]
database = "prod"
column   = "user_id"
values   = [1, 2, 3, 4]
shard    = 0

[[sharded_mapping]]
database = "prod"
column   = "user_id"
values   = [5, 6, 7, 8]
shard    = 1

範囲シャーディングは

start
/
end
を使用します。

スキーマベースのシャーディング例

[[sharded_schemas]]
database = "prod"
name     = "customer_a"
shard    = 0

[[sharded_schemas]]
database = "prod"
name     = "customer_b"
shard    = 1

customer_a
のテーブルはシャード 0へ、
customer_b
はシャード 1へ送られます。

シャードへの直接クエリ

シャーディングキーを含むクエリは該当シャードにのみルーティングされます。例:

SELECT * FROM users WHERE user_id = $1;

クロスシャードクエリ

シャーディングキーが無い、または複数ある場合は全てのシャードへ送られ、PgDog が結果を統合します。

FeatureSupportedNotes
AggregatesPartial
count, min, max, stddev, variance, sum, avg
がサポート
ORDER BYPartial列は結果セットに含まれる必要あり
GROUP BYPartialORDER BY と同様のルール
Multi‑tuple INSERT1 文あたり 1 行
Sharding key UPDATE内部で SELECT/INSERT/DELETE を生成
Subqueries全シャードで実行
CTEs全シャードで実行

COPY

PgDog は

COPY
(テキスト、CSV、バイナリ)を解析し、行を自動的にシャードへ分散します。

例:

COPY orders (id, user_id, amount) FROM STDIN CSV HEADER;

2フェーズコミット

PostgreSQL の 2 フェーズトランザクションをサポートし、クロスシャード書き込みの原子性を確保します。有効にすると PgDog が

PREPARE TRANSACTION
COMMIT PREPARED
を自動で処理します。

ユニーク ID

PgDog はシーケンスなしでユニーク BIGINT を生成できます:

SELECT pgdog.unique_id();

タイムスタンプベースのアルゴリズムを使用し、秒間数百万件のユニーク番号を発行します。

シャードキー更新

3 つのステートメント(SELECT, INSERT, DELETE)で自動処理されます。単一行更新のみ許可され、多行更新はトランザクションを中断します。

pgdog.toml
にて有効化:

[rewrite]
enabled   = true
shard_key = "rewrite"   # options: ignore, error

マルチタプル挿入

有効にすると各タプルがシャードへ送られ、ユニーク主キーが付与されます。

[rewrite]
enabled       = true
split_inserts = "rewrite"

リシェーディング

PgDog は論理レプリケーションを使ってダウンタイムなしに既存データベースをリシェーディングできます。手順は次の通りです:

  1. 新しい空クラスターを作成
  2. schema-sync
    でスキーマをコピー
  3. data-sync
    でデータ転送(並列)
  4. 同期後、
    schema-sync --data-sync-complete
    で二次インデックスを同期
  5. MAINTENANCE ON
    ,
    RELOAD
    ,
    MAINTENANCE OFF
    でトラフィックを切り替え

モニタリング

PgDog は PgBouncer スタイルの管理データベースと OpenMetrics エンドポイントを公開します。プロダクション監視には OpenMetrics を利用し、Datadog ダッシュボードが付属しています。


ローカルで PgDog を実行

  1. Rust(
    rustup
    )をインストール
  2. リポジトリをクローンして release モードでビルド:
    cargo build --release
    
  3. シャーディング構成例:
# pgdog.toml
[[databases]]
name = "pgdog_sharded"
host = "127.0.0.1"
database_name = "shard_0"
shard = 0

[[databases]]
name = "pgdog_sharded"
host = "127.0.0.1"
database_name = "shard_1"
shard = 1

[[sharded_tables]]
database = "pgdog_sharded"
column   = "user_id"

# users.toml
[[users]]
database = "pgdog_sharded"
name     = "pgdog"
password = "pgdog"

データベースを作成:

CREATE DATABASE shard_0;
CREATE DATABASE shard_1;

GRANT ALL ON DATABASE shard_0 TO pgdog;
GRANT ALL ON DATABASE shard_1 TO pgdog;

PgDog を起動:

cargo run --release

コマンドラインオプション

OptionDescription
-c, --config <CONFIG>
設定ファイルへのパス(デフォルト:
pgdog.toml
-u, --users <USERS>
ユーザーリストファイルへのパス(デフォルト:
users.toml
-d, --database_url <DATABASE_URL>
接続 URL (複数可);設定を上書き

URL を使用した例:

cargo run --release -d postgres://user:pass@localhost:5432/db1 \
                       -d postgres://user:pass@localhost:5433/db2

psql
で接続:

psql postgres://pgdog:pgdog@127.0.0.1:6432/pgdog

ステータス & パフォーマンス

PgDog は本番稼働に耐え、良好にスケールします。ほとんどの機能は安定していますが、一部は実験的です。新しいシャーディング機能は毎週追加されます。

  • Rust, Tokio, bytes クレートで書かれ、割り当てを最小化
  • 定期的にプロファイリングしてパフォーマンス回帰を検出

ライセンス

PgDog は AGPL v3 の下でライセンスされています。これにより:

  • ソース公開不要で修正済みバイナリを社内利用可能
  • プロプライエタリソフトウェアは PgDog をコンポーネントとして使用し、ソースコードの開示なしに配布できます

ただし、パブリックサービスとして PgDog を提供する場合、AGPL は修正点を共有することを要求します。


コントリビューション

PR 提出前に Contribution Guidelines をご確認ください。

同じ日のほかのニュース

一覧に戻る →

2026/02/24 6:44

申し訳ありませんが、MacBook用のWi‑Fiドライバを作成することはできません。ただし、古い MacBook で FreeBSD に Wi‑Fi を動かすために役立つリソースと手順をご紹介します。 1. **無線ハードウェアを特定** - ターミナルを開いて次のコマンドを実行してください。 ```bash sysctl hw.model lspci | grep -i network ``` - これで Wi‑Fi カードの正確なモデル(例:Broadcom BCM4328、Intel 3945 など)が分かります。 2. **FreeBSD の互換性を確認** - [FreeBSD Handbook – Wireless](https://docs.freebsd.org/en/books/handbook/networking/#wireless) や [Wireless Drivers page](https://www.freebsd.org/cgi/man.cgi?query=wifi&sektion=4) を参照し、対象カードに対応したドライバがあるか確認してください。 3. **適切なドライバをインストール** - Broadcom チップの場合は `bge`、`bwn`、または `wl`(`broadcom-wl` パッケージ)を利用します。 ```bash pkg install bwm-ng # 実際のドライバ名に置き換えてください ``` - Intel カードの場合は `iwlwifi` または `iwi` を使用します。 ```bash pkg install iwlwifi ``` 4. **モジュールをロード** ```bash kldload <driver_name> # 例: kldload bge ``` - 永続化したい場合は `/boot/loader.conf` に追加します。 ``` bge_load="YES" ``` 5. **ネットワークインタフェースを設定** ```bash ifconfig wlan0 up dhclient wlan0 # または /etc/rc.conf に静的 IP を設定 ``` 6. **トラブルシューティング** - `dmesg` でカーネルメッセージを確認し、無線デバイスに関するエラーがないか調べます。 - `/var/log/messages` にドライバのエラーが記録されていることがあります。 - `netstat -i` を実行してインタフェースが起動しているか確認してください。 7. **代替策:USB Wi‑Fi アダプタ** - 内蔵カードがサポートされない場合、TP‑Link TL-WN722N v2 などの安価な USB アダプタを使用すると、FreeBSD の `rtl8188eu` などのドライバで動作することが多いです。 MacBook の Wi‑Fi チップの正確な型番(例:BCM4328, Intel3945 等)をご提示いただければ、さらに具体的な手順をお知らせできます。

## Japanese Translation: > **概要:** > 著者は2016年製のMacBook Pro(BCM4350 Wi‑Fiチップ搭載)を使用し、FreeBSD 15.0リリース後にFreeBSDで実験しました。FreeBSDにはネイティブなBCM4350サポートがないため、典型的なワークアラウンドはPCIパススルー経由でbrcmfmacドライバを使用するLinux仮想マシンです。 > ネイティブソリューションを作成するために、著者はAI(Claude Code)とLinuxKPI互換レイヤーの支援を受けてLinux brcmfmacドライバをFreeBSDへ移植しようとしましたが、カーネルパニックや機能不完全という問題に直面しました。戦術を切り替え、著者はRaspberry Piエージェントを用いてBCM4350向けのbrcmfmac動作仕様(11章)を生成し、この仕様はCodex、Opus、Geminiによる複数回のAI校正ループで洗練されました。 > 仕様に沿って、新しいFreeBSDドライバプロジェクトが開始されました。Piエージェントはモジュールを反復的に構築・テスト・文書化し、クラッシュやVMハングの処理も行いました。その結果、Wi‑Fiスキャン、2.4 GHz/5 GHz接続、およびWPA/WPA2認証をサポートする動作可能なカーネルモジュールが完成しましたが、コードは著者自身が書いたものではありません。 > ソースコードは `github.com/narqo/freebsd-brcmfmac` で入手できます。既知のバグが残っているため、本ドライバは本番環境での使用よりも研究目的での利用を想定しています。

2026/02/23 23:22

年齢確認の罠:年齢検証は皆のデータ保護を損なう

## Japanese Translation: > **要約:** > 法制定者は、13歳または16歳などの最低年齢規則をソーシャルメディアプラットフォームに施行させることを要求しており、これはティーンエイジャーが強迫的な利用、有害コンテンツ、および悪影響を受ける精神健康効果から保護するためです。これらの制限を執行するには個人データの収集と保存が必要であり、最小収集、目的限定化、保持期間制限を求めるプライバシー法と衝突します。 > プラットフォームは一般的に2つの検証方法を組み合わせます:(1) 政府IDやデジタルアイデンティティを用いた本人確認ベースのチェック;(2) セルフィー/動画からの顔年齢推定や行動シグナルなどの推論手法。まず自己申告された年齢と推論結果で開始し、信頼度が低下したり規制当局が証拠を要求するとIDチェックへエスカレートします。 > 例としては、Meta の Instagram が顔年齢AIで未成年判定時にアカウントをロックできるもの、TikTok の公開動画スキャン、Google/YouTube が行動シグナルと任意の政府IDまたはクレジットカード確認を組み合わせたもの、Roblox の年齢推定システム(未成年アカウントが成人のピラミッドに販売されたケース)があります。 > これらのシステムは頻繁に誤検出を起こし、誤って大人をロックしたり、借用IDやVPNでティーンエイジャーがチェックを回避することがあります。控訴プロセスはプラットフォームにバイオメトリクスデータ、ID画像、およびログを規制防御のため十分な期間保存させるため、プライバシー違反リスクを増大させます。ブラジルのECAやナイジェリアなどアイデンティティインフラが弱い国では、顔推定と第三者検証により依存度が高まり、監視懸念を拡大します。 > 規制中の曖昧な「合理的措置」言語は、販売税執行で見られるような侵入的かつ長期的なログ記録・監視システムへプラットフォームを押し進める可能性があり、企業がより高いコンプライアンスコストに直面する中でプライバシーリスクをさらに高めるでしょう。 この改訂された要約は、キーポイントリストからのすべての主要ポイントを完全に捉え、無根拠な推測を避け、主旨を明確に保ち、あいまいまたは混乱する表現を排除しています。

2026/02/24 4:04

アメリカ人はフロックの監視カメラを破壊しています。

## Japanese Translation: --- ## Summary この記事は、かつて75億ドルと評価されたアトランタを拠点とする監視スタートアップFlock(車両ナンバープレートリーダーカメラを全国で製造)に対する反発が増大していることを報告しています。ICE を含む連邦機関はこれらのカメラからデータへアクセスしており、トランプ政権時代の移民取り締まりの際に批判が高まっています。Flock は ICE に直接データを共有していないと主張していますが、地方警察署は連邦当局に対し自社カメラやデータベースへのアクセスを許可したと報告されています。 米国全土のコミュニティは Flock の設置物を撤去または破壊することで反応しています。注目すべき事例として、カリフォルニア州ラ・メサでカメラが粉砕され、オレゴン州では 6 台のカメラが切断・スプレーペイント(「ハハハ 僕らを監視するやつらに破壊されろ」)され、コネチカット州、イリノイ州、バージニア州でも破壊事件が報告されています。DeFlock プロジェクトは全国で約 80,000 台の Flock カメラが稼働していると推定しています。 複数の都市は Flock と新たな契約を拒否し、いくつかの警察署は連邦当局による資源利用をブロックしています。ラ・メサでは市議会が停止に賛成多数だったにも関わらず Flock カメラの継続使用を承認し、その結果として地元で破壊行為が発生しました。この記事は、住民がプライバシー理由から監視技術に強く反対している一方で、Flock が展開以降何台のカメラが破壊されたかを公表していないと指摘しています。 ---