コンテンツにスキップ

アーキテクチャ

SONiC の内部実装を 1 枚で押さえるなら、左から CLI / gNMI / 制御プレーン daemon、中央に Redis DB 群、右に syncdSAI/ASIC を置く絵になる。各機能章で *Orch*syncd*mgrd のように出てくる名前は、この絵のどこに座るかで役割が決まる。

flowchart LR
    subgraph IN[設定・制御の入口]
      CLI[CLI / sonic-cfggen]
      GNMI[gNMI / REST / Mgmt Framework]
      FRR[FRR bgpd/zebra]
    end

    subgraph CTL[制御プレーン daemon]
      CFGD[bgpcfgd / *cfgd]
      MGRD[portmgrd / vlanmgrd / *mgrd]
      SYNCAPP[fpmsyncd / portsyncd / teamsyncd]
    end

    subgraph REDIS[Redis DB 群]
      CDB[(CONFIG_DB)]
      APP[(APPL_DB)]
      STDB[(STATE_DB)]
      CTRDB[(COUNTERS_DB)]
      ASICDB[(ASIC_DB)]
      ERRDB[(ERROR_DB)]
    end

    subgraph ORC[orchagent]
      ORCH[sub-Orch 群]
    end

    subgraph DPL[データプレーン適用]
      SD[syncd]
      SAI[SAI lib]
      ASIC[ASIC / NPU]
    end

    CLI --> CDB
    GNMI --> CDB
    FRR --> SYNCAPP
    CDB --> CFGD --> APP
    CDB --> MGRD --> APP
    SYNCAPP --> APP
    APP --> ORCH
    CDB --> ORCH
    ORCH --> ASICDB
    ORCH --> STDB
    ASICDB --> SD --> SAI --> ASIC
    SAI -.failure.-> SD --> ERRDB
    SD --> STDB
    SD --> CTRDB

DB ごとの責務

CONFIG_DB は永続化された設定の唯一の source of truth である。APPL_DB は制御プレーンが「ASIC にこうしたい」と書く intent の場で、各機能の *_TABLE がここに置かれる。STATE_DB は実際の状態と監視ヒントで、syncd や各 daemon が書き込む。COUNTERS_DB は ASIC から取得した counter の集計先で、flexcounter 群が更新する。ASIC_DB は SAI object を Redis 表現に落としたもので、orchagent が書き、syncd が読む。ERROR_DB は SAI 失敗を APP 側に伝えるためのチャネルである。

スキーマの一次ソースは swss-schema(APPL_DB / STATE_DB の中心スキーマ参照) を読む。

ProducerStateTable と非同期化

APPL_DBASIC_DB は、書き手と読み手が別プロセスに分かれる。Redis に直に SET するのではなく、ProducerStateTable / ConsumerStateTable を介して「key の変更通知」を queue として渡す。これにより読み手側は変更分だけを取り出して処理できる。ZMQ ベースに置き換える設計は ZMQ ProducerStateTable / ConsumerStateTable 設計 を読む。

ASIC_DB 側は sairedis が非同期に消費し、SAI 呼び出しに変換する。SAI 呼び出しの結果は完了通知や ERROR_DB を介して orchagent に戻る。これが「orchagent が ASIC_DB に書いたら、すぐ ASIC に入っているとは限らない」根拠である。

syncd と SAI の境界

syncd は ASIC_DB を消費し、SAI API を呼ぶ唯一の場所である。ベンダごとの SAI 実装は libsai に隠れ、syncd と orchagent はベンダ非依存に保たれる。SAI 失敗は syncd で観測され、handleSaiSetStatus/handleSaiCreateStatus 系の virtual で処理される。fatal なものは crash、recoverable なものは ERROR_DB / STATE_DB 経由で上位に通知する設計である。詳細は SAI 失敗ハンドリングError Handling Framework を読む。

機能章はこの絵のどこを使うか

機能章 主に使う部分
BGP FRRfpmsyncd → APPL_DB(ROUTE_TABLE/NHG)→ RouteOrch → ASIC_DB
L2 VLAN LAG CONFIG_DBvlanmgrd/portmgrd → APPL_DB → PortsOrch/VlanOrch → ASIC_DB
ACL CoPP Mirror CONFIG_DB → AclOrch → ASIC_DB(ACL_TABLE/ENTRY/COUNTER)
VRF / ECMP APPL_DB(NEXT_HOP_GROUP_TABLE) → NhgOrch → ASIC_DB

機能章での具体的な経路は各章のアーキテクチャを参照する。共通の「ProducerStateTable」「ASIC_DB」「ERROR_DB」の動きはここに戻ってくる。

関連ページ