コンテンツにスキップ

内部実装

Multi-ASIC / VOQ chassis の内部実装は「namespace で分けられた Redis / orchagent / syncd インスタンス」と「chassis 全体を束ねる chassis_db / database-chassis container」の二重構造で動きます。論理スイッチ単位の Redis インスタンスと、シャーシ全体で共有する Redis インスタンスを混同しないことが重要です。

データフロー

flowchart TB
  subgraph ns0[asic0 namespace]
    SWSS0[swss0]
    SYNCD0[syncd0]
    REDIS0[(redis<br/>asic0)]
  end
  subgraph ns1[asic1 namespace]
    SWSS1[swss1]
    SYNCD1[syncd1]
    REDIS1[(redis<br/>asic1)]
  end
  subgraph host[host namespace]
    SUPER[swss-common / chassis_db / database-chassis]
    BGP[bgpd<br/>per-asic FRR instance]
    GLOBAL[(CHASSIS_APP_DB<br/>+ CHASSIS_STATE_DB)]
  end
  SWSS0 <--> REDIS0
  SWSS1 <--> REDIS1
  SWSS0 <-->|system port / inband| GLOBAL
  SWSS1 <-->|system port / inband| GLOBAL
  SUPER --> GLOBAL
  BGP --> SWSS0
  BGP --> SWSS1

主要 daemon / コンポーネントの責務

コンポーネント 主実体 責務
database-chassis container chassis-wide redis-server CHASSIS_APP_DBCHASSIS_STATE_DB をホスト
per-asic database container namespace 内 redis-server APPL_DB / ASIC_DB / CONFIG_DB / STATE_DB / COUNTERS_DB
orchagent per-asic SwitchOrchSAI_SWITCH_ATTR_TYPE = VOQ を指定 system port、fabric port、inband interface を作成
FabricPortsOrch (orchagent/fabricportsorch.cpp) fabric link 監視 fabric 側 link の up/down と link mon
VoqOrch / SystemPortOrch SystemNeighOrchSystemLagOrch system port を chassis 全体で広報、neighbor / LAG を chassis 規模で同期
chassisd / chassis_db chassis init scripts 全 ASIC の system port を CHASSIS_APP_DB:SYSTEM_PORT_TABLE に登録
bgpcfgd per-asic per-namespace FRR 各 ASIC が独自の BGP プロセスを持つ

SAI 属性使用一覧

VOQ chassis 固有:

object 属性
SAI_OBJECT_TYPE_SWITCH SAI_SWITCH_ATTR_TYPE = SAI_SWITCH_TYPE_VOQSAI_SWITCH_ATTR_SWITCH_IDSAI_SWITCH_ATTR_MAX_SYSTEM_CORESSAI_SWITCH_ATTR_SYSTEM_PORT_CONFIG_LIST
SAI_OBJECT_TYPE_SYSTEM_PORT SAI_SYSTEM_PORT_ATTR_CONFIG_INFOSAI_SYSTEM_PORT_ATTR_ADMIN_STATESAI_SYSTEM_PORT_ATTR_QOS_TC_TO_QUEUE_MAP
SAI_OBJECT_TYPE_FABRIC_PORT SAI_PORT_ATTR_TYPE = FABRICSAI_PORT_ATTR_FABRIC_ATTACHEDSAI_PORT_ATTR_FABRIC_REACHABILITY
SAI_OBJECT_TYPE_NEIGHBOR_ENTRY (system) system port を nexthop とする encap 情報を含む

Multi-ASIC(pizza-box の packet mode 含む)では SAI_SWITCH_ATTR_TYPE = SAI_SWITCH_TYPE_NPU のままで、ASIC ごとに独立した SAI switch object を作る点が VOQ と違います。

Redis テーブル参照関係

Per-ASIC namespace:
  APPL_DB / CONFIG_DB / ASIC_DB / STATE_DB / COUNTERS_DB
Chassis global:
  CHASSIS_APP_DB:
    SYSTEM_PORT_TABLE
    SYSTEM_NEIGH_TABLE
    SYSTEM_LAG_TABLE
    SYSTEM_LAG_MEMBER_TABLE
  CHASSIS_STATE_DB:
    LINECARD_TABLE
    FABRIC_ASIC_TABLE
    HOSTNAME_ASIC_MAP

各 ASIC orchagent は自身の APPL_DB:NEIGH_TABLE から学習した neighbor を CHASSIS_APP_DB:SYSTEM_NEIGH_TABLE に複製し、他 ASIC の orchagent はそれを subscribe して自身の system port nexthop に変換します。

ZMQ / Redis pub/sub

  • chassis 内通信は Redis pub/sub のみで、inband (cpu) や fabric 専用回線を経由した IP 接続上で chassis_db redis サーバに接続します。
  • ZMQ は VOQ chassis では使われていません(一部の SONiC chassis variant では検討された経緯はあるが master では Redis のみ)。
  • database-chassis の redis は 0.0.0.0 で listen し、IPSec / TLS を使わない平文通信が前提。シャーシ内通信路(midplane)が信頼境界です。

既知の実装上の制約

  • chassis_db への接続切断は ASIC 間の neighbor / system port 情報の同期を止め、データプレーンの forwarding は維持しつつ control plane は段階的に古い状態を信用する設計です。長時間の切断は警告のみで自動 reboot にはなりません。
  • VOQ chassis では、各 ASIC の CONFIG_DB共通設定として一括反映する仕組みが limited で、運用者は per-asic の config_db.json + chassis 全体 minigraph の二段管理になります。
  • Multi-ASIC pizza-box(VOQ ではなく packet mode の multi-NPU)は LAG / VLAN が ASIC を跨げないため、サブインタフェース化や PE-CE モデルで運用されます。
  • BGP は per-asic で独立した FRR process が走り、internal BGP(iBGP)で ASIC 間を結ぶ構成が一般的。external BGP の view を一つにする abstraction は SONiC master にはありません。
  • show 系 CLI は --namespace を取らない場合に host namespace から各 namespace に exec する構造で、多 ASIC では出力が長くなり、collect 時にエラーが部分的に出ても全体が成功扱いになる落とし穴があります。

chassis_db / system port の同期

chassis_db は線カード (LC) / supervisor (SUP) 間で system-wide な状態を共有する Redis インスタンスで、各 ASIC namespace の CONFIG_DB / APPL_DB とは別に SUP 上に置かれます。同期対象は次の通りです。

テーブル 役割
SYSTEM_PORT_TABLE chassis 全体での system port ID 割当(VOQ 設計上の必須)
SYSTEM_NEIGH_TABLE 全 LC 共有の neighbor entry
SYSTEM_LAG_TABLE chassis 跨ぎ LAG(VOQ chassis only)
SYSTEM_INTERFACE router-interface の system-wide view

SystemPortOrch / SystemNeighOrch が chassis_db を subscribe して、自 ASIC の SAI_OBJECT_TYPE_SYSTEM_PORT を作成 / 更新します。chassis_db 自体は SUP 上の Redis で、LC 側からは TCP で接続します(接続切断時は前述の段階的劣化)。

VOQ chassis では fabric port が線カード間の中継を担い、FabricPortsOrch がその状態を監視します。

状態 検出 反映先
FABRIC_ATTACHED SAI port attribute から fabric 接続済みか STATE_DB:FABRIC_PORT_TABLE
FABRIC_REACHABILITY 各 fabric switch への到達性 CHASSIS_STATE_DB:FABRIC_ASIC_TABLE
isolated port が isolation domain にあるか counter / show fabric

fabric link の flap は SAI_PORT_ATTR_FABRIC_ATTACHED の notification で FabricPortsOrch::refreshFabricPortMonitor に届き、閾値を超えた error count で isolation の判定がなされます。chassis 全体の health を chassisdCHASSIS_STATE_DB:LINECARD_TABLE で集約します。

per-ASIC FRR と internal BGP の構成

VOQ chassis では各 ASIC namespace で独立した FRR が動き、ASIC 間は internal BGP(多くは iBGP over loopback over inband)でつなぐ構成が標準です。

観点 説明
AS 番号 同一(iBGP)
nexthop inband interface 経由の loopback
advertise 外部 BGP の view は per-asic、abstraction なし
convergence ASIC 間で routes が異なる時間帯が存在しうる

minigraph.xml<BGPSessions> セクションで internal session が定義され、bgpcfgd per-namespace が反映します。abstraction が必要な運用では Route Reflector を SUP 上に立てる構成が BGP setup for VOQ chassis HLD に書かれています。

関連ページ