インフラ・DevOps
Celld: セルフホスト型、分散型 Durable Objects
Celld: Self-hosted, distributed Durable Objects (github.com)
要約
Celldは、Cloudflare WorkersおよびDurable Objectsを自社インフラで実行できるオープンソースのデーモンです。各オブジェクトはSQLiteデータベースとして扱われ、S3互換ストレージでレプリケーションとノード間調整を行います。これにより、単一データベースの競合や障害の影響範囲を排除し、アイドル状態のセルは省電力化されます。
全文翻訳
Celld セルフホスト型、分散型 Durable Objects。
celldは、Cloudflare WorkersおよびDurable Objectsを自社マシンで実行できるオープンソースのデーモンです。
各オブジェクトは独自のSQLiteデータベースであり、名前でアドレス指定され、所有するS3互換バケットにレプリケートされます。ノードは、コントロールプレーンやコンセンサスなしで、そのバケットのみを通じて調整します。
すべてのオブジェクトが独自の小さなデータベースであるため、アプリケーションは構築によってシャーディングされます。単一共有データベースの競合や影響範囲の障害は、管理されるのではなく設計によって排除されています。アイドル状態のセルは、ほとんど何もせずにスリープします。
celld.devで詳細を確認するか、ドキュメントをお読みください。
仕組み
各celldノードはV8を埋め込み、Wranglerバンドルを実行します。
フリートは、デプロイメント、セル状態、および小さな所有権レコードを含むS3互換バケットを共有します。
オブジェクトストレージの比較・交換(compare-and-swap)により、メンバーシッププロトコル、障害検出器、またはコンセンサスサービスなしで、一度に1つのノードのみがセルを所有することが保証されます。
celldは各セルのSQLiteデータベースを継続的にバケットにレプリケートします。セルが移動または起動すると、新しい所有者はそのデータベースを復元し、実行を再開します。バケットが永続的な真実の情報源であり、ノードは交換可能です。
インストール
インストーラーはcelldバイナリをダウンロードします(provenanceはgh attestation verifyで検証可能)。
curl -fsSL https://celld.dev/install.sh | sh
インストーラーが要求した場合、~/.local/binをPATHに追加してください。
celldでデプロイされるWorkerプロジェクトはPATHにesbuildが必要ですが、アセットのみのプロジェクトは不要です。
インストーラーは、検証済みのリリースを~/.local/lib/celld/releasesに保持し、1つの現在のポインタをアトミックに切り替えます。
celldを削除するには、保護されたアンインストーラーを使用してください。
curl -fsSL https://celld.dev/uninstall.sh | sh
コンテナ
リリースイメージにはcelldバイナリが含まれており、Linux x86-64およびARM64向けに公開されています。
docker run --rm ghcr.io/denoland/celld --version
ランタイムのローカル状態を永続化し、標準のAWS認証情報環境を渡します。
docker volume create celld-state
docker run --rm --network host \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-e CELLD_WATCH=/var/lib/celld/state \
-v celld-state:/var/lib/celld \
ghcr.io/denoland/celld \
--bucket s3://my-cells-bucket \
--endpoint https://ACCOUNT.r2.cloudflarestorage.com \
--region auto \
--listen 0.0.0.0:8080 \
--advertise node-a.internal:8080
実際のAWS S3の場合は --endpoint/--region を削除してください。
ロードバランサーの後ろでは、各ノードにピアが到達できる一意の --advertise アドレスを指定してください。
実行
celldは標準のAWS認証情報チェーンを使用します。
S3互換バケットにデプロイしてから、同じバケットに対してcelldを開始します。
celld deploy .
--bucket s3://my-cells-bucket
celld \
--bucket s3://my-cells-bucket \
--listen 0.0.0.0:8080 \
--advertise 10.0.0.12:8080
別のS3互換サービスの場合は --endpoint を使用し、推論できない場合は --region を使用してください。
フリートは1つのアプリケーションを実行し、すべてのノードは deploy/current.json から最新の正常にコミットされたデプロイメントをロードします。
完全なコマンドラインについては、celld --help を実行してください。
デプロイメントオブジェクトは、crates/celld/protocol.rs のドキュメント化された型を使用します。
celld deploy は、PATH から esbuild を呼び出し、サポートされている Wrangler 設定のサブセット(共同デプロイまたはアセットのみの静的アセットを含む)を受け入れ、それらのオブジェクトを直接書き込みます。
各ノードはバケットのリースから所有者とピアを検出します。アカウントまたは参加サービスはありません。
ピアHTTPはTLSを終端しません。すべての広告アドレスを信頼できるプライベートネットワークまたはWireGuardやTailscaleのような暗号化されたオーバーレイに配置してください。ピアポートを直接公開しないでください。 --unsafe-public-advertise が明示的に指定されない限り、リテラルのパブリックIPは拒否されます。
最初の現在のノードは、バケット内に fleet/peer-auth.json を作成します。すべてのピアリクエストは、プロトコルバージョン付けされ、ボディにバインドされ、HMAC認証され、クロックバウンドされ、そのフリートシークレットでリプレイ保護されます。
バケットとその認証情報へのアクセスは、フリート管理者アクセスとして扱ってください。
フリートの運用
celld diagnose はデフォルトで各ノードのリースを列挙し、その後、各ライブピアへの署名付き直接プローブを実行します。
celld diagnose --bucket s3://my-cells-bucket
レポートは個々の障害の後もチェックを継続し、期限切れのレコード、不正なまたは安全でない広告アドレス、到達不能なピア、および互換性のないプロトコルを区別します。また、各ノードの粗い常駐セル、WebSocket、RSS、CPU、ファイルディスクリプタ、圧力、およびシェディングサンプルも表示します。
チェックを制限するには、1つ以上の --peer NODE_ID オプションを渡してください。
圧力シェディングは、最初のリリースで安全なデフォルトが測定されている間はオプトインです。
ロードされたノードに常駐セルを高および低ウォーターマークを設定します。
CELLD_MAX_RESIDENT_CELLS=1000 \
CELLD_RESIDENT_LOW_WATER=800 \
celld --bucket s3://my-cells-bucket --listen 0.0.0.0:8080 \
--advertise node-a.internal:8080
Linuxでは、CELLD_MAX_RSS_MBとCELLD_MAX_CPU_PERCENTがプロセスメモリとCPUトリガーを追加します。常駐セルウォーターマークはポータブルです。
圧力下では、celldは最も最近使用されなかったアイドルセルを永続的にレプリケートしてフェンスし、エポックをリセットせずに未所有として公開し、低ウォーターマークに達するまで新しい未所有セルの再取得を拒否します。
スペアは割り当てを受け取りません。通常のトラフィックが到達すると、同じバケットプロトコルを通じて解放されたセルを取得します。アクティブな作業またはライブホストWebSocketを持つセルはシェディングされません。
ソースからのビルド
cargo build --locked
cargo test --locked
cargo clippy --all-targets --locked -- -D warnings
ワークスペースはcelldランタイムをビルドします。そのバージョン化されたオブジェクトストレージプロトコルはcrates/celld/protocol.rs にあります。examples/の下の小さなWranglerプロジェクトは、サポートされているWorkerおよびDurable Objectサーフェスを行使します。
ランタイムと互換性サーフェスはまだ進化中です。
パブリックテストは、スタンドアロンエンジンのスモークパスをカバーします。WorkersおよびDurable Objectsのリファレンス動作との適合性、およびフォールトインジェクション下での分散プロトコルの決定論的シミュレーションが、各リリース前に実行されます。
貢献
プルリクエストは無効です。コーディングエージェントは、メンテナーが節約できる時間よりも多くの時間を要する、大規模で低コンテキストの変更を送信することを容易にしすぎます。
思慮深い貢献は歓迎します。コードを理解し、パッチを集中させ、あなたが求めているレビュー時間を尊重してください。
git format-patch添付ファイルをry@deno.comに送信してください。
コントリビューターライセンス契約:パッチをメールで送信することにより、提出する権利があることを証明し、Deno Land Inc.に譲渡できるパッチのすべての権利を譲渡します。権利を譲渡できない場合は、Deno Land Inc.に、パッチを、全体または一部、帰属表示の有無にかかわらず、使用、変更、結合、再ライセンス、再配布、または公開するための、永続的、取消不能、全世界的、ロイヤリティフリー、譲渡可能、サブライセンス可能なライセンスを付与します。
ライセンス
Apache-2.0
パブリックフリートを運用する前に、制限とセキュリティのページを参照してください。