コンテンツにスキップ

設定

SWSS / SAI / Redis レイヤの「設定」は、機能 CLI のように config bgp で投入できる対象ではなく、SONiC の起動構成そのものを決めるファイル群です。具体的には Redis instance のレイアウト、Multi-ASIC namespace、FEATURE による daemon 起動制御、event-driven な config reload、container health probe の 5 つで、いずれも /etc/sonic/ 配下のファイルと CONFIG_DBFEATURE テーブルで制御されます。

本ページでは「単一 ASIC」「COUNTERS_DB の Redis 分割」「Multi-ASIC / VOQ chassis」「FEATURE と config reload 遅延」「container health probe」の 5 シナリオで、ファイル例 + CLI + 確認手順をまとめます。

設定対象ファイルとテーブル一覧

対象 場所 役割
database_config.json /var/run/redis/sonic-db/database_config.json DB 名 → Redis instance / socket / db_number のマッピング
database_global.json /etc/sonic/database_global.json (Multi-ASIC) namespace ごとの database_config.json の集約
FEATURE テーブル CONFIG_DB container 単位の state / auto_restart / delayed
init_cfg.json /etc/sonic/init_cfg.json 工場出荷時の CONFIG_DB 初期値
config_db.json /etc/sonic/config_db.json 永続化された運用 CONFIG_DB
systemd unit /etc/systemd/system/*.service container 起動順 / dependency / probe

シナリオ 1: 単一 ASIC + 単一 Redis instance (既定)

ホワイトボックス 1 台に SONiC を入れたときの既定構成です。何もしなくてもこの形になります。

database_config.json (既定)

{
  "INSTANCES": {
    "redis": {
      "hostname": "127.0.0.1",
      "port": 6379,
      "unix_socket_path": "/var/run/redis/redis.sock",
      "persistence_for_warm_boot": "yes"
    }
  },
  "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" },
    "RESTAPI_DB":       { "id": 8, "separator": "|",  "instance": "redis" },
    "GB_ASIC_DB":       { "id": 9, "separator": ":",  "instance": "redis" }
  },
  "VERSION": "1.0"
}

確認

# Redis instance の状態
redis-cli ping
redis-cli INFO server | grep ^redis_version

# 各 DB が見えるか
redis-cli -n 4 KEYS 'DEVICE_METADATA|*'
redis-cli -n 1 DBSIZE
redis-cli -n 2 DBSIZE

# DB マッピングの確認
cat /var/run/redis/sonic-db/database_config.json | jq '.DATABASES | keys'

シナリオ 2: COUNTERS_DB を別 Redis instance に切り出す

大規模 SKU で COUNTERS_DB の書き込みが他 DB の応答時間を圧迫するときに使う構成です。設計の前提は 複数 Redis インスタンスのユーザ定義 を読んでください。

database_config.json

{
  "INSTANCES": {
    "redis":          { "unix_socket_path": "/var/run/redis/redis.sock",          "port": 6379 },
    "redis_counters": { "unix_socket_path": "/var/run/redis/redis_counters.sock", "port": 6380 }
  },
  "DATABASES": {
    "APPL_DB":         { "id": 0, "instance": "redis" },
    "ASIC_DB":         { "id": 1, "instance": "redis" },
    "COUNTERS_DB":     { "id": 2, "instance": "redis_counters" },
    "FLEX_COUNTER_DB": { "id": 5, "instance": "redis_counters" },
    "CONFIG_DB":       { "id": 4, "instance": "redis" },
    "STATE_DB":        { "id": 6, "instance": "redis" }
  },
  "VERSION": "2.0"
}

反映手順

# 編集後に database container 再起動
sudo systemctl restart database

# ソケットが両方できているか
ls -l /var/run/redis/redis.sock /var/run/redis/redis_counters.sock

# COUNTERS_DB が新 instance に来ているか
redis-cli -s /var/run/redis/redis_counters.sock DBSIZE
redis-cli -s /var/run/redis/redis.sock DBSIZE

DB 名で参照する API (SonicDBConfig::getDbInst()) は変わらないため、ユーザ daemon は instance 構成を意識せずに済みます。

シナリオ 3: Multi-ASIC / VOQ chassis (namespace 切り替え)

VOQ chassis や 2 ASIC SKU では、ASIC ごとに別の Redis 名前空間を持ちます。詳細は Multi-ASIC 名前空間の Redis を読んでください。

database_global.json

{
  "INCLUDES": [
    { "include": "database_config.json" },
    { "namespace": "asic0", "include": "asic0/database_config.json" },
    { "namespace": "asic1", "include": "asic1/database_config.json" }
  ],
  "VERSION": "1.0"
}

namespace を指定した redis-cli

# host namespace
redis-cli -n 4 HGETALL 'DEVICE_METADATA|localhost'

# asic0 の Redis socket は別ファイル
sudo ip netns exec asic0 redis-cli -n 4 HGETALL 'DEVICE_METADATA|localhost'
sudo ip netns exec asic1 redis-cli -n 1 DBSIZE

# sonic-cfggen を namespace 付きで使う
sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["asic_id"]' -n asic0

確認

show platform summary           # Multi-ASIC platform か
show ip bgp summary -n asic0    # namespace 付き CLI
ip netns list                   # asic0 asic1 が存在

シナリオ 4: FEATURE による daemon 制御と config reload 遅延

FEATURE テーブルは container 単位の有効/無効、自動再起動、起動遅延を一元管理します。

CONFIG_DB スキーマ

{
  "FEATURE|bgp": {
    "state": "enabled",
    "auto_restart": "enabled",
    "delayed": "True",
    "has_global_scope": "True",
    "has_per_asic_scope": "False",
    "high_mem_alert": "disabled",
    "set_owner": "local",
    "support_syslog_rate_limit": "true"
  },
  "FEATURE|telemetry": {
    "state": "disabled",
    "auto_restart": "enabled",
    "delayed": "False"
  }
}

CLI

# state 切り替え
sudo config feature state bgp enabled
sudo config feature state telemetry disabled

# auto restart
sudo config feature autorestart bgp enabled

# 永続化
sudo config save -y

# 確認
show feature status
show feature autorestart

config reload と delayed container

delayed: True の container は、PortInitDone を待ってから起動されます。これは BGP などが「ASIC 上の port がまだない」状態で route を流し始めることを避ける設計です。詳細は config reload の event-driven 化 を読んでください。

# config reload を投げる
sudo config reload -y

# STATE_DB で PortInitDone を待つ
redis-cli -n 6 HGETALL "PORT_TABLE|PortInitDone"

# delayed container がその後に起動したか
systemctl status bgp
journalctl -u bgp -n 50

シナリオ 5: container health probe (k8s readiness)

各機能 container は monit 検査結果を 1 つの判定に集約する health-check を持ちます。k8s に乗せた SONiC では readiness probe としても使われます。意義は コンテナ health-check を読んでください。

# container の health 状態
docker inspect bgp --format '{{.State.Health.Status}}'
docker inspect swss --format '{{json .State.Health}}' | jq

# monit の状態
sudo monit status

# health-check スクリプトの直接実行
docker exec swss /usr/bin/healthcheck.sh

Health.Statusstarting / healthy / unhealthy を返します。unhealthy が継続すると auto_restart=enabled 時に container が再起動されます。

よくある設定エラーと対処

症状 原因 対処
redis-cliConnection refused database container が落ちている / socket 権限 systemctl status databasels -l /var/run/redis/*.sock/var/run/redis-chassis/ パーミッション確認
database_config.json 変更が反映されない container 再起動忘れ / JSON 構文エラー jq . /var/run/redis/sonic-db/database_config.jsonsystemctl restart databaseconfig reload -y
新 instance を追加したが daemon が古い socket を掴む daemon プロセスが既にロード済みの SonicDBConfig をキャッシュ 影響 daemon を再起動 (systemctl restart swss 等)、必要なら config reload -y
Multi-ASIC で redis-cli が host を見てしまう ip netns exec 無しで実行 sudo ip netns exec asic0 redis-cli ... か、-n asic0 付き sonic-cli を使う
config feature state の変更が次回起動で消える config save 忘れ sudo config save -yconfig_db.json を永続化
delayed container が起動しない PortInitDone が来ていない / portmgrd 異常 redis-cli -n 6 KEYS 'PORT_TABLE*'journalctl -u portmgrdshow interfaces status で port が UP か
docker inspectHealth.Status 欄が空 healthcheck が Dockerfile に未定義の古い image image を最新化、または monit 経由の判定にフォールバック
Multi-ASIC で APPL_DB の更新が片側 ASIC にしか反映されない 書き手が namespace を指定せず host Redis を更新 swsscommon.SonicV2Connector(namespace='asic0') を使う、scripts は -n asic<N> フラグを通す
COUNTERS_DB を別 instance に分けたら CLI が値を返さない CLI 側が socket をハードコード swsscommon 経由の CLI を使う、database_config.json の socket と CLI の参照先を一致

確認に使う show / redis コマンドまとめ

# Redis レイアウト
cat /var/run/redis/sonic-db/database_config.json | jq
cat /etc/sonic/database_global.json | jq

# FEATURE
show feature status
show feature autorestart
redis-cli -n 4 KEYS 'FEATURE|*'

# container 健全性
docker ps --format 'table {{.Names}}\t{{.Status}}'
sudo monit summary

# Multi-ASIC
show platform summary
ip netns list

関連ページ