Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 06 章: L2 / VLAN / LAG を参照。
裏取りステータス: code-verified
iccpd: sonic-buildimage/src/iccpd / mclagsyncd: sonic-swss/mclagsyncd/mclagsyncd.cpp / schema: APP_MCLAG_FDB_TABLE_NAME, APP_ISOLATION_GROUP_TABLE_NAME, CFG_MCLAG_TABLE_NAME (MCLAG_DOMAIN), CFG_MCLAG_INTF_TABLE_NAME (MCLAG_INTERFACE): sonic-swss-common/common/schema.h:118,119,378,379 / sonic-mclag.yang で確認。
MCLAG Enhancements¶
大きな HLD(42 KB)。本ページは architecturally distinctive な要素に絞る。詳細は
doc/mclag/MCLAG_Enhancements_HLD.mdを参照。
なぜ拡張するのか¶
MCLAG(Multi-Chassis LAG)は 2 台が 互いに peer となり、下流ホストから 1 個の LAG(ICCP 同期)として見える冗長構成。本 HLD は以下 7 軸で拡張する1:
- dynamic configuration(再起動なしで domain / mclag_interface を CONFIG_DB から触れる)
- keep-alive / session timeout の動的設定
- static MAC の peer 間同期
- ICCP 学習 MAC の aging disable
- MAC sync 最適化
- isolation group で peer-link 経由の重複転送を抑止
- unique IP で MCLAG VLAN 上の L3 プロトコル(OSPF 等)対応
全体構造¶
flowchart LR
subgraph S0[Switch 0]
CFG0[CONFIG_DB MCLAG_*]
ICC0[iccpd]
MS0[MclagSyncd]
APP0[APPL_DB APP_MCLAG_FDB_TABLE]
OR0[FdbOrch / PortsOrch / IsolGroupOrch]
SAI0[ASIC]
end
subgraph S1[Switch 1]
CFG1[CONFIG_DB MCLAG_*]
ICC1[iccpd]
MS1[MclagSyncd]
APP1[APPL_DB]
OR1[FdbOrch / PortsOrch / IsolGroupOrch]
SAI1[ASIC]
end
CFG0 --> ICC0
ICC0 <-->|ICCP over peer-link| ICC1
ICC0 --> MS0 --> APP0 --> OR0 --> SAI0
CFG1 --> ICC1 --> MS1 --> APP1 --> OR1 --> SAI1
要点1:
iccpdが ICCP メッセージで peer と同期MclagSyncdが ICCP 由来の MAC / interface state を APPL_DB に橋渡し- 旧 MclagSyncd 内部 FDB はリファクタで撤廃され、APPL_DB の
APP_MCLAG_FDB_TABLEに集約1
各拡張ポイント¶
| 項目 | 内容 |
|---|---|
| Static MAC sync | FdbOrch が CONFIG_DB 由来 static MAC を ICCP で peer に reflect1 |
| Unique IP | MCLAG VLAN intf に 個別 IP を持たせ、OSPF 等 L3 隣接を成立させる。MCLAG_UNIQUE_IP\|Vlan100 unique_ip=enable1 |
| Isolation Group | peer-link 経由の重複転送/ループを防ぐため MCLAG メンバ port group から peer-link を isolate。SAI は SAI_OBJECT_TYPE_ISOLATION_GROUP1 |
| Aging disable | remote 学習 MAC は local aging で消さない1 |
| MAC sync 最適化 | bulk / 差分転送で多 VLAN 構成の収束時間短縮1 |
CONFIG_DB / APPL_DB / STATE_DB¶
CONFIG_DB:
MCLAG_DOMAIN|<domain_id>
source_ip, peer_ip, peer_link, keepalive_interval, session_timeout
MCLAG_INTERFACE|<domain_id>|<intf>
if_type = "PortChannel"
MCLAG_UNIQUE_IP|<vlan_intf>
unique_ip = "enable"
APPL_DB:
ISOLATION_GROUP_TABLE:<group_id> members = "...", exclude = "<peer-link>"
APP_MCLAG_FDB_TABLE:<vlan>:<mac> port, type=static|dynamic, mclag=remote|local
STATE_DB:
STATE_MCLAG_TABLE|<domain> oper_status, peer_link_status
STATE_MCLAG_REMOTE_INTF_TABLE|<intf>
STATE_MCLAG_REMOTE_FDB_TABLE|<vlan>:<mac>
CLI / 設定例¶
config mclag add 1 10.0.0.1 10.0.0.2 PortChannel999
config mclag member add 1 PortChannel0001
config mclag unique-ip add Vlan100
show mclag brief
show mclag intf-list
制限事項¶
- HLD は Rev 0.1 で日付欄空欄
- ICCP は 2 台ピアまで(3-way 以上は未対応)
- isolation group は SAI 対応必須。未対応 ASIC では peer-link 経由のループ抑止は別手法
- unique IP では active/active 両方が L3 で見える。OSPF cost / BGP を peer 間で揃える必要
- 大量 static MAC sync は ICCP メッセージ量増、scalability 影響あり
既知の問題¶
L2 MC-LAG 環境での ICMPv6 RS/NS ループ(#1253)¶
L2 MC-LAG 構成において、ICMPv6 Router Solicitation (type 133) や Neighbor Solicitation (type 135) パケットが peer-link を経由してループを形成する既知の問題がある。SONiC カーネルがこれらのパケットを処理する際に isolation group を迂回するためと考えられる。
回避策:
# tagged VLAN 上の IPv6 パケットを bridge レベルで遮断する
sudo ebtables -A FORWARD -p 802_1Q --vlan-encap IPv6 -j DROP
この ebtables ルールは再起動後に消えるため、永続化が必要な場合は startup スクリプトに追加すること。
干渉する機能¶
iccpd / FdbOrch / PortsOrch / VRRP / OSPF / BGP(unique IP)/ VXLAN・EVPN MH(別冗長機構)/ L3 PortChannel・sub-interface。
トラブルシューティング¶
show mclag brief
redis-cli -n 6 HGETALL "STATE_MCLAG_TABLE|1"
redis-cli -n 6 KEYS "STATE_MCLAG_REMOTE_FDB_TABLE|*" | head
redis-cli -n 0 KEYS "APP_MCLAG_FDB_TABLE:*" | head
redis-cli -n 0 HGETALL "ISOLATION_GROUP_TABLE:1"
関連 Topics¶
- 06-l2-vlan-lag: L2 / LAG の全体像
- 05-dual-tor: もう一つの ToR 冗長機構