Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 20 章: SWSS / SAI / Redis を参照。
裏取りステータス: Code-verified
sonic-swss-common/common/dbconnector.h L44-49 で「namespace でコンテナ群を一意識別、空文字なら default(host) namespace」のコメント、L107 で load_sonic_global_db_config(global_db_file_path=DEFAULT_SONIC_DB_GLOBAL_CONFIG_FILE, namespace=None, ignore_nonexistent=False) Python API、L149/L151 で {containerName, namespace} キーの instance / database マップ実装を確認。sonic-swss-common/common/dbconnector.cpp L225 で database_global.json 未ロード時 initializeGlobalConfig を要請するエラー処理を確認。sonic-swss-common/tests/redis_multi_db_ut_config/database_global.json L4-28 で include ディレクティブによる per-namespace database_config*.json の集約形式を、sonic-buildimage/dockers/docker-database/database_global.json.j2 テンプレ存在を確認(verified at: 2026-05-09)。
Multi-ASIC 名前空間の Redis(database_global.json と SonicDBConfig)¶
概要¶
Multi-ASIC SONiC(複数 NPU を持つデバイス)では、各 NPU を Linux network namespace で隔離し、その中で swss / syncd / database 等のコンテナを別個に動かす。これにより 1 デバイス内に複数の Redis インスタンスが並走することになる1。
本 HLD は次を定義する:
- グローバル Redis(host 側)と NPU 別 Redis の 2 階層構成
- 名前空間ごとに独立した
database_config.json - 全名前空間を辿るための
database_global.json - Python / C++ クライアントの
namespace=引数 による接続先切替
サービス分類¶
flowchart LR
subgraph SG_1["Linux Host (global namespace)"]
GDB[("global DB<br>APPL_DB / CONFIG_DB")]
SNMP["snmp / pmon / telemetry"]
end
subgraph asic0 namespace
DB0[("redis_asic0:<br>APPL/CONFIG/ASIC/<br>COUNTERS/...")]
SW0["swss / syncd / bgp / teamd / lldp"]
end
subgraph asic1 namespace
DB1[(redis_asic1)]
SW1["swss / syncd / ..."]
end
GDB -.-> DB0
GDB -.-> DB1
- Global namespace: AAA / syslog / ASIC↔interface マッピングのような システム共通属性 を持つ
- NPU namespace: その NPU 配下のインタフェース・カウンタ・state 等を持つ
Single-ASIC の SONiC は「Global = host = 唯一の Redis」として後方互換が取れる1。
動作仕様¶
ファイル配置¶
| 役割 | ファイル | 場所 |
|---|---|---|
| Global config | /etc/sonic/config_db.json |
host |
| NPU config | /etc/sonic/config_db<NS>.json |
host |
| Global Redis 設定 | /var/run/redis/sonic-db/database_config.json |
host |
| NPU Redis 設定 | /var/run/redis<N>/sonic-db/database_config.json |
NS 内 |
| Global の名前空間目録 | /var/run/redis/sonic-db/database_global.json |
host |
database_global.json の例¶
{
"INCLUDES": [
{ "include": "../redis/sonic-db/database_config.json" },
{ "namespace": "asic0", "include": "../redis0/sonic-db/database_config.json" },
{ "namespace": "asic1", "include": "../redis1/sonic-db/database_config.json" },
{ "namespace": "asic2", "include": "../redis2/sonic-db/database_config.json" }
],
"VERSION": "1.0"
}
namespace 属性が無い entry は host (global) を意味する1。
database_config.json(NPU 用)¶
NPU 名前空間 asic3 の例:
{
"INSTANCES": {
"redis": {
"hostname": "127.0.0.1",
"port": 6379,
"unix_socket_path": "/var/run/redis3/redis.sock"
}
},
"DATABASES": {
"APPL_DB": { "id": 0, "separator": ":", "instance": "redis" },
"ASIC_DB": { "id": 1, "separator": ":", "instance": "redis" },
"COUNTERS_DB": { "id": 2, "separator": ":", "instance": "redis" },
"LOGLEVEL_DB": { "id": 3, "separator": ":", "instance": "redis" },
"CONFIG_DB": { "id": 4, "separator": "|", "instance": "redis" },
"PFC_WD_DB": { "id": 5, "separator": ":", "instance": "redis" },
"FLEX_COUNTER_DB": { "id": 5, "separator": ":", "instance": "redis" },
"STATE_DB": { "id": 6, "separator": "|", "instance": "redis" },
"SNMP_OVERLAY_DB": { "id": 7, "separator": "|", "instance": "redis" }
},
"VERSION": "1.0"
}
Jinja テンプレート変数¶
database_global.json / database_config.json は j2 テンプレ。/usr/bin/database.sh の起動スクリプトが docker create 時に環境変数で渡す1:
| 変数 | 意味 |
|---|---|
{NS} |
namespace ID("" / "0" / ... / "n"、host は空文字) |
{NS_PREFIX} |
namespace prefix(既定 asic) |
{NS_REF_CNT} |
global DB が見るべき外部 DB 参照数(NPU 数と一致) |
NPU 用の database_config.json では {NS != ""} 条件で ASIC_DB / COUNTERS_DB / LOGLEVEL_DB を含める分岐が入る(Global には不要)1。
Python: SonicDBConfig¶
SONIC_DB_GLOBAL_CONFIG_FILE = /var/run/redis/sonic-db/database_global.json、SONIC_DB_CONFIG_FILE = /var/run/redis/sonic-db/database_config.json。load_sonic_global_db_config() で全 namespace を _sonic_db_config[ns] に展開する。namespace='' は local を意味する1:
class SonicDBConfig(object):
@staticmethod
def load_sonic_global_db_config(global_db_file_path=...): ...
@staticmethod
def load_sonic_db_config(sonic_db_file_path=...): ...
@staticmethod
def namespace_validation(namespace): ...
@staticmethod
def db_name_validation(db_name, namespace=''): ...
Python: SonicV2Connector¶
namespace= 引数を受け取って指定 NS の Redis に繋ぐ1:
class SonicV2Connector(DBInterface):
def __init__(self, use_unix_socket_path=False, namespace='', **kwargs):
...
# 別 namespace の Redis には TCP では繋げない(Unix socket 必須)
if namespace != '' and use_unix_socket_path == False:
raise NotImplementedError("TCP connectivity to ... different namespace is not implemented!")
他 NS への TCP 接続は未対応。Unix socket 経由のみ1。
ConfigDBConnector も同様に namespace= を受け取り、内部で SonicV2Connector を構成する。
sonic-utilities への波及¶
sonic-db-cli / sonic-cfggen / db_migrator / portconfig 等が --namespace <NS> 引数を取るように改修される1:
if args.namespace is None:
dbconn = swsssdk.SonicV2Connector()
else:
dbconn = swsssdk.SonicV2Connector(use_unix_socket_path=True, namespace=args.namespace)
dbconn.connect(args.database)
C++ DBConnector¶
C++ 側にも database_global.json パーサを追加し、namespace → database_config.json のマッピングを内部に持たせる1。
📋 検証エビデンス: sonic-net/SONiC/doc/database/multi_namespace_db_instances.md#L341-L372 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/database/multi_namespace_db_instances.md#L341-L372 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
class SonicV2Connector(DBInterface):
def __init__(self, use_unix_socket_path=False, namespace='', **kwargs):
...
if namespace != '' and use_unix_socket_path == False:
raise NotImplementedError("TCP connectivity to ... different namespace is not implemented!")
判断根拠: 異 namespace への接続が Unix socket 必須であることの根拠。
設定¶
関連する CONFIG_DB / CLI / YANG¶
外部設定スキーマは無い。本機能は Redis 配備とクライアントライブラリ の話1。
関連する CLI¶
| CLI | 改修内容 |
|---|---|
sonic-db-cli |
--namespace 引数追加 |
sonic-cfggen |
同上 |
db_migrator |
同上 |
portconfig 等 |
同上 |
設定例¶
# asic0 namespace の COUNTERS_DB を見る
sonic-db-cli COUNTERS_DB --namespace asic0 KEYS '*'
# Python から
from swsssdk import SonicV2Connector
db = SonicV2Connector(use_unix_socket_path=True, namespace='asic0')
db.connect('CONFIG_DB')
制限事項¶
- 異 namespace への TCP 接続は不可: Unix socket 経由のみ。スクリプト改修時にこの制約を踏まえる必要がある1。
{NS_REF_CNT}は NPU 数と等価前提: 1 NPU 1 namespace の前提が組み込まれている。SmartSwitch 等の DPU では別の整理が必要1。- single-ASIC 互換性:
database_global.jsonを作らない(またはINCLUDESが 1 entry のみ)構成で旧来動作を維持する。改修されたクライアントは旧構成でも壊れないこと。 - j2 テンプレで static に展開: 起動時に NPU 数が確定する前提。動的 NPU 追加は本 HLD のスコープ外。
干渉する機能¶
- Multi-ASIC swss / syncd: 各 namespace で独立に走る。本 HLD は彼らが触る Redis の置き場を整える基盤。
is_multi_asic系判定:sonic-py-common.device_infoの関数群と組み合わせて、CLI 各処理が namespace ループを回す。- VoQ Chassis(Chassis DB): 別レイヤの「Chassis DB」概念とは混同しないこと。本ページは 1 デバイス内 multi-NPU、Chassis DB はシャーシ全体の supervisor↔linecards。
- gNMI / REST: クライアントが host で動くなら
database_global.json経由で全 namespace を辿る必要がある。
トラブルシューティング¶
- 別 namespace の DB に繋がらない:
use_unix_socket_path=Trueを渡しているか確認。TCP では接続不可1。 SonicV2ConnectorがRuntimeError:database_global.jsonとdatabase_config<NS>.jsonの存在 / namespace 名綴りを確認。database_global.json不在: single-ASIC として動くべき構成かを確認。multi-ASIC ならdatabase.shの起動経路を確認。