コンテンツにスキップ

概要

SONiC は「設定の入口」「制御プレーン daemon」「ASIC への橋渡し」が別プロセスで分かれており、これらを Redis 上の名前付き DB で結んでいる。機能章を読むときの共通語彙はこの章でまとめる。

この章は何のためにあるか

機能章(BGP / ACL / VRF / VXLAN など)を読み進めると、必ず次の用語に出会う: CONFIG_DBAPPL_DBSTATE_DBCOUNTERS_DBASIC_DBERROR_DBorchagentsub-OrchsyncdsairedisSAIProducerStateTablebulk counter。これらを どの章でも同じ意味で使えるように一度地ならしする のが本章の目的である。

具体的には、読み手の以下の疑問に章全体で答える。

  1. なぜ DB がこれほど多いのか(CONFIG / APPL / STATE / ASIC / ERROR / COUNTERS の理由)
  2. APPL_DBCONFIG_DB はどう違うのか(CONFIG_DB に直接書いてはいけないのか)
  3. orchagentsyncd の責務はどこで切れるのか
  4. SAI の失敗(attribute not supported、status returned)はどう報告されるのか
  5. counter / debug / dump の話が他の章に出てきたとき、どの仕組みを呼んでいるのか

何を解決するか

  • 疎結合: 機能ごとの daemon を Redis pubsub で分離することで、どれか 1 つを落としても他に波及しにくい。crash recovery が機能単位で完結する。
  • 状態の見える化: STATE_DB / COUNTERS_DB を介して、CLI / telemetry / 監視がプロセス境界を越えて状態を読める。
  • SAI 抽象化: ASIC ベンダごとの差を syncd と SAI 実装で吸収し、orchagent から見たインタフェースを揃える。
  • 再起動の選択肢: warm / fast / cold の各種 reboot で「どの DB を残し、どの DB を再生成するか」を細かく制御できる。

SONiC 内での位置

flowchart LR
  CLI[CLI / gNMI] --> CDB[(CONFIG_DB)]
  CDB --> CFGD[*cfgd / *mgrd<br/>例: bgpcfgd, intfmgrd]
  CFGD --> ADB[(APPL_DB)]
  EXT[FRR / teamd / lldpd] --> SYNC[*syncd<br/>fpmsyncd, teamsyncd, lldp-syncd]
  SYNC --> ADB
  ADB --> ORCH[orchagent<br/>sub-Orch 群]
  ORCH --> AS[(ASIC_DB)]
  AS --> SYNCD[syncd] --> SAI[SAI / ASIC]
  ORCH --> STATE[(STATE_DB)]
  SAI -. counter .-> COUNT[(COUNTERS_DB)]
  SYNCD -- 失敗 --> ERR[(ERROR_DB)]
  ERR --> ORCH

機能章で「APPL_DB に書く」「STATE_DB を見て確認」と書かれていたら、必ずこの図のどこかの矢印を辿っているはずである。本章はこの図を、機能を持たない素の地図として扱う。

用語の整理

用語 意味 補足
Redis DB 名前付きの key-value 空間。番号で識別される database_config.json で定義
ProducerStateTable 書き手用の async API APPL_DB の追記に使う
ConsumerStateTable 読み手用の async API orchagent の sub-Orch が購読
Bulk API 複数 SAI 呼び出しをまとめる route / neighbor の大量更新
Flex counter 周期的に SAI から counter を引く仕組み counter group で頻度を設定
sairedis SAI 呼び出しを Redis ASIC_DB 経由で記録/再生するライブラリ orchagent ↔ syncd 間の本体
view switching warm boot 時に古い APPL_DB から新しい APPL_DB へ切り替える操作 warm reboot で必須
handleSai*Status SAI 呼び出し失敗を分類するハンドラ retriable / fatal / ignore に振り分け

典型シーン

sequenceDiagram
  participant U as Operator (CLI)
  participant CDB as CONFIG_DB
  participant M as *mgrd / *cfgd
  participant A as APPL_DB
  participant O as orchagent
  participant S as syncd
  participant H as SAI / HW
  U->>CDB: config set
  CDB-->>M: subscribe notify
  M->>A: APPL_DB に書き込み
  A-->>O: ProducerStateTable notify
  O->>S: ASIC_DB write (sairedis)
  S->>H: SAI call
  H-->>S: status
  alt 成功
    S->>O: 状態反映
    O->>STATE_DB: 状態書き込み
  else 失敗
    S->>ERROR_DB: error 記録
    ERROR_DB-->>O: notify
  end

機能章の操作手順や troubleshooting は、必ずこの流れの「どこを覗いたか」を意識すると読み下しが速くなる。

似た機能との違い

比較 共通点 違い
一枚岩の制御プレーン NOS との違い 経路や ACL を ASIC に書く SONiC は機能ごとに別プロセス + Redis pubsub。crash 影響を局所化。
etcd / Consul との違い 設定 / 状態の共有 DB Redis は 同じノード内 の IPC が中心。クラスタ共有ではない。
SAI を直接叩く構成との違い ASIC を抽象化 sairedis を挟むことで record/replay、warm boot、async が成立。
SQL DB との違い 状態を読み書きする スキーマは弱く、key の命名規約とテーブル定義 (yang/docs) で補強。

内部実装章のスコープ

内部実装章のスコープ

この章は機能(BGP、L2、ACL、VRF など)を語らない。代わりに、機能章のどこにでも出てくる次の要素を扱う。

要素 主に出てくる場面 この章での扱い
Redis DB 群 各機能章の「設定どこ」「状態どこ」 DB の責務分担と命名規約
orchagent 機能ごとの sub-Orch(PortsOrch、RouteOrch、AclOrch、VxlanOrch 等) APPL_DB → ASIC_DB の共通インタフェース
syncd / sairedis 各機能章の「ASIC に書く」「offload する」 ASIC_DB の async 適用と SAI 呼び出し
SAI ベンダ間の差異吸収 バージョン整合、capability 問い合わせ、失敗ハンドリング
Counter / Debug telemetry、observability、ASIC 計数 bulk/flex counter、dump、ERROR_DB

機能章で個別に出てきた話を「内部実装側の共通テーマ」に揃え直すための章である。スキーマの全カラム表や CLI の細則は docs/reference/ が引き受け、個別 HLDdocs/internals/ / docs/architecture/ / docs/platform/ / docs/system/ 配下に残す。

機能章との重複を避けるための切り分け

機能章は「特定機能を運用するためにどの DB を見て、どの daemon を疑うか」を読み手の目的順で書く。この章は「DB と daemon そのものがどう設計されているか」を書く。

  • 例: BGP route が ASIC に入るまでの経路は BGP アーキテクチャ で読む。一方、ROUTE_TABLE 全般がどう APPL_DB と ASIC_DB に流れるか、ProducerStateTable とは何か、view switching とは何か、はここで読む。
  • 例: ACL の SAI 呼び出し失敗を切り分けるときは ACL 運用 で読む。一方、SAI 失敗そのものの ERROR_DB / handleSai*Status 設計はここで読む。

DB の責務(早見表)

DB 役割 主な書き手 主な読み手
CONFIG_DB 永続化された設定 CLI、gNMI、Mgmt Framework、bgpcfgd 各 *cfgd、orchagent、起動スクリプト
APPL_DB 制御プレーンが望む状態(intent) bgpcfgd、fpmsyncdportsyncd、teamsyncd、各 *mgrd orchagent の各 sub-Orch
STATE_DB 実際の状態と監視のヒント 各 daemon、syncd CLI(show)、監視
COUNTERS_DB ASIC からの counter 集計 flexcounter / bulk counter telemetry、show CLI
ASIC_DB SAI 呼び出し直前の object 表現 orchagent syncd(sairedis 経由)
ERROR_DB SAI 失敗を app に伝える syncd(handleSai*Status) orchagent、Error Handling Framework
LOGLEVEL_DB ログ等の補助 各 daemon swssloglevel など

スキーマの一次ソースは swss-schema を読む。

この章での読み方

DB と daemon の地図がほしい人は アーキテクチャ を先に読む。multi-namespace(Multi-ASIC)や独自 Redis instance を構成したい人は 設定 に進む。SAI 失敗の見方を覚えたい人は 運用内部実装 を続けて読む。bulk/flex counter、debug、dump の設計差は 内部実装 を読む。startup や warm reboot の view switching は 発展トピック に置いた。

読了後にできること

  • 「ROUTE_TABLE は APPL_DB と CONFIG_DB のどちらに置くべきか」のような質問に、書き手と読み手の役割で即答できる。
  • orchagent が APPL_DB を読み、ASIC_DB に書き、syncd が SAI を呼ぶ流れを、矢印 4 本で説明できる。
  • SAI 呼び出しが失敗したときに ERROR_DB / handleSai*Status のどちらの仕組みを期待すべきかを判断できる。
  • bulk counter と flex counter の違いを、登録単位と取得タイミングの観点で説明できる。
  • 続く アーキテクチャ / 設定 / 運用 / 内部実装 / 発展トピック で出てくる固有名詞の 9 割を、章を行き来せずに位置付けられる。

関連ページ

この章の前提知識

この章を読み進める前に、次の章を押さえておくと迷子になりにくい。