コンテンツにスキップ

設定データフロー

SONiC の設定を読むときは、まず CONFIG_DB を起点にします。CONFIG_DB はユーザや controller が投入した意図を保持し、各 daemon がそれを購読して自分の担当する実行状態へ変換します。代表的には、*mgrdCONFIG_DB を読み、APPL_DBorchagent 向けのテーブルを作り、orchagent が ASIC_DB 経由で syncd / SAI へ渡します。

CONFIG_DB はどの情報を持つか

CONFIG_DB は単なる key-value ではなく、テーブルごとに用途が分かれます。装置全体の根本設定は DEVICE_METADATA、機能 docker の制御は FEATURE が代表です。

テーブル 読む場面 代表的な利用者
DEVICE_METADATA|localhost hostname、platform、BGP ASN、buffer model、switch type など装置単位の前提を確認する bgpcfgd、orchagent、hostcfgd
FEATURE|<name> bgp、telemetry、snmp など feature service の起動制御を見る hostcfgd、system health
機能別テーブル VLAN、BGP、ACLQoS など各機能の設定を見る *mgrd / *cfgd

DEVICE_METADATA は多くの章の前提条件です。BGP、Multi-ASIC、Dual-ToR、SmartSwitch、buffer、DHCP server などの挙動がここから分岐するため、機能ページで謎の既定値が出てきたら最初に確認してください。

APPL_DB / STATE_DB / ASIC_DB の読み方

swss-schemaAPPL_DBSTATE_DB の中心スキーマをまとめる参照ページです。APPL_DB は orchagent に対する依頼、STATE_DB は SONiC 内部の状態共有、ASIC_DB は syncd に渡す ASIC 操作に近い層です。

flowchart TB
  subgraph Config
    CLI[CLI / gNMI / config file]
    CDB[(CONFIG_DB)]
  end
  subgraph Managers
    MGR[portmgrd / vlanmgrd / intfmgrd / bgpcfgd / hostcfgd]
  end
  subgraph SWSS
    ADB[(APPL_DB)]
    SDB[(STATE_DB)]
    OA[orchagent]
    ASICDB[(ASIC_DB)]
  end
  subgraph ASIC
    SYNC[syncd]
    SAI[SAI]
    HW[ASIC SDK / hardware]
  end

  CLI --> CDB
  CDB --> MGR
  MGR --> ADB
  MGR --> SDB
  ADB --> OA
  OA --> ASICDB
  ASICDB --> SYNC
  SYNC --> SAI
  SAI --> HW
  HW --> SYNC
  SYNC --> SDB

この流れで重要なのは、CONFIG_DB に正しい値があっても、APPL_DBASIC_DB まで届いていなければデータプレーンには反映されないことです。障害切り分けでは「設定値」「manager の投影」「orchagent の処理」「syncd / SAI の処理」を順番に見ると原因を分けやすくなります。

Redis 以外のトランスポート

通常の ProducerStateTable / ConsumerStateTableRedis を使いますが、低レイテンシ用途では ZMQ ProducerStateTable / ConsumerStateTable の設計があります。ZMQ 版は既存 API 形状を保ちつつ、Redis 書き込みを optional にできます。性能は上がりますが、DB に痕跡を残さない構成では観測性が落ちるため、トラブルシュート時には対象機能が Redis 経由か ZMQ 経由かを確認します。

管理 API 側の Redis 接続

REST / gNMI / Management Framework 側では Redis client の作り方自体が性能と安定性に影響します。Redis Client Manager は、Go 実装の translib 周辺で DBNum ごとの共有 connection pool と transactional client を分ける設計です。設定データフローそのものではありませんが、自動化 controller から大量の Set / Get が来る環境では、管理 API 側の接続管理もボトルネックになります。

関連ページ