マルチ AZ 網関と Webhookは通知と輪換が主役です。本稿は比率・切片・昇格ゲートです。テナント分割稿のディレクトリ約束と揃えます。
多ノード公開の流れ(比率前)
openclaw.lock、テナントskills.d、semver ツリー、合算 readiness の四点が全 Mac で一致してから動きます。順序はshadow→合算緑→LB 微調整→ピア同期→監査一行です。
- 正本:タグ昇格、汚れたツリーは再読込しない。
- 並列網関:カナリアが先、安定はゲート後のみ。
- 通知系:網関より先へ進めない。
| 観点 | Webhook ブロードキャスト本編 | 本稿(カナリア・切片) |
|---|---|---|
| 主信号 | 失敗要約・配信再試行 | LB 比率と semver 一致 |
| 昇格トリガ | 通知健全性に寄りがち | 合算 JSON のゲート |
| 切片 | 任意 | テナント skills.d が必須 |
#!/usr/bin/env bash
set -euo pipefail
cd /usr/local/share/openclaw-infra
/usr/bin/git fetch --tags origin
/usr/bin/git checkout "refs/tags/${PROMOTE_TAG}"
/usr/bin/shasum -a 256 openclaw.lock | /usr/bin/tee /tmp/lock.sha
/usr/local/bin/openclaw version --json | /usr/bin/tee /tmp/version.json
/usr/bin/diff -q openclaw.lock <(ssh canary-gw "cat /usr/local/share/openclaw-infra/openclaw.lock")
差分が空のときだけ重み変更。空でないと脳分裂です。
トラフィック比率
新規セッションの約五パーセントをskills/next載せの網関へ。合算探針を二回分以上キープし、p95 とキューと予算を見ます。Doctor 緑と digest の無害化が揃ったら十〜二十ポイント刻みで広げます。表に時刻・重み・semver・チケットを一行ずつ残し、LB API は関数化して貼れる形にします。
設定フラグメント分テナント
skills.dの順序を全網関で一致させ、/etc/openclaw/tenants/<tenant>/skills.d/を揃えてからnextを semver へ。境界だけをフラグメントに書き、秘密はsecrets/<tenant>へ ACL 分離します。
# タグ取得後、各網関で sudo install -d -o root -g wheel /etc/openclaw/tenants/acme/skills.d sudo /usr/local/bin/openclaw config lint --tenant acme sudo /bin/ln -sfn "/var/db/openclaw/skills/1.4.2" /var/db/openclaw/skills/next sudo launchctl kickstart -k system/com.openclaw.gateway
カナリアだけnext指し、本番はcurrentで最小切片です。
探針の合算
一本の URL でsemver と lock の一致、Doctor、キュー SLO を返します。digest は内包フィールドに留め、昇格の主因にしないのが Webhook 本編との違いです。
#!/usr/bin/env bash
set -euo pipefail
TENANT_CANARY="${TENANT_CANARY:-acme}"
SKILL_PATH="/var/db/openclaw/skills/current"
/usr/bin/readlink "${SKILL_PATH}" | /usr/bin/tee /tmp/skill_path.txt
/usr/local/bin/openclaw doctor --tenant "${TENANT_CANARY}" --json >/tmp/doctor.json
/usr/bin/curl -fsS --max-time 3 "http://127.0.0.1:9099/v1/webhook-digest" -o /tmp/digest.json
/usr/bin/python3 - <<'PY'
import hashlib, json, pathlib
blob = pathlib.Path("/tmp/doctor.json").read_bytes() + pathlib.Path("/tmp/digest.json").read_bytes()
print(json.dumps({"probe_sha256": hashlib.sha256(blob).hexdigest(),"skill_resolved": pathlib.Path("/tmp/skill_path.txt").read_text().strip()}))
PY
黄はdegradedで流し続け、semver 不一致は即失敗。digest だけでは広げません。
ロールバック
LB 重みのスナップショット戻しとskills/currentの symlink 戻しを同時に。片側だけ禁止。kick 後に合算 JSON を良い行と突き合わせます。
#!/usr/bin/env bash
set -euo pipefail
/usr/bin/scp stable-gw:/var/db/openclaw/audit/last_good_weights.json /tmp/weights.json
./lb_restore_weights.sh /tmp/weights.json
sudo /bin/ln -sfn "/var/db/openclaw/skills/${ROLLBACK_SEMVER}" /var/db/openclaw/skills/current
sudo launchctl kickstart -k system/com.openclaw.gateway
/usr/bin/curl -fsS http://127.0.0.1:8088/readyz | /usr/bin jq .
訓練は成果物マトリクスと併せ、誤 AZ 指向中に rsync と競走させない。
監査
promotions.jsonlへ一行追記。actor・ticket・semver 前後・重み・probe_sha256。人の承認証跡は Webhook よりここです。
/usr/bin/printf '%s\n' \
"{"ts":"$(date -u +%Y-%m-%dT%H:%M:%SZ)","actor":"${USER}","ticket":"${TICKET}","from":"1.4.1","to":"1.4.2","weights":"${WEIGHT_BLOB}","probe_sha256":"${PROBE_SHA}"}" \
| /usr/bin/tee -a /var/db/openclaw/audit/promotions.jsonl
問い合わせはjqで答える。
FAQ
digest は。合算内に載せるが比率拡大の唯一理由にしない。semver と Doctor が先。
一テナントだけ。フラグメントをカナリア網関に置きスティッキーでコホートを寄せる。
台数。安定二系とカナリア一台の三ホストが最小演習。