[db] Slurm Operator 如何存取外部資料庫? === ###### tags: `Slurm / SlinkyProject / db` ###### tags: `Slurm`, `SlinkyProject`, `Kubernetes`, `k8s`, `app`, `mariadb`, `mysql` <br> [TOC] <br> ## 討論 ### Slinky 如何存取外部 db?有共同存取介面或協定? - ### Claude Sonnet 4 (2025/11/04) 根據我對程式碼的分析,以下是 **Slinky operator 如何存取外部資料庫**的說明: ### **資料庫存取方式** #### **1. 存取協定:MySQL Protocol** Slinky operator 透過 **Slurm 的 accounting 模組 (slurmdbd)** 存取外部資料庫,使用的是標準的 **MySQL 協定**: ```go // internal/builder/accounting_config.go:61 StorageType: "accounting_storage/mysql" ``` - [internal/builder/accounting_config.go:61](https://github.com/SlinkyProject/slurm-operator/blob/main/internal/builder/accounting_config.go#L61) #### **2. 支援的資料庫** 從程式碼與配置來看,支援 **MySQL/MariaDB**: - 預設 port: **3306** - 範例使用 **MariaDB** (hack/resources/mariadb.yaml) - 透過 Slurm 的 `accounting_storage/mysql` plugin 連線 #### **3. 連線參數配置** (api/v1alpha1/accounting_types.go:66-101) ```go type StorageConfig struct { Host string // 資料庫主機位址 Port int // 預設 3306 Database string // 預設 "slurm_acct_db" Username string // 資料庫使用者 PasswordKeyRef corev1.SecretKeySelector // 從 K8s Secret 取得密碼 } ``` - [api/v1alpha1/accounting_types.go:61-95](https://github.com/SlinkyProject/slurm-operator/blob/main/api/v1alpha1/accounting_types.go#L61-L95) #### **4. 存取流程** 1. **配置生成** ([internal/builder/accounting_config.go:37-79](https://github.com/SlinkyProject/slurm-operator/blob/main/internal/builder/accounting_config.go#L37-L79)) - 從 K8s Secret 讀取資料庫密碼 - 產生 `slurmdbd.conf` 配置檔 - 包含完整連線參數 (host, port, user, password, database) 2. **服務啟動** ([internal/builder/accounting_app.go:163-195](https://github.com/SlinkyProject/slurm-operator/blob/main/internal/builder/accounting_app.go#L160-L192)) - 部署 `slurmdbd` 容器 (StatefulSet) - 監聽 port **6819** (SlurmdbdPort) - 由 slurmdbd daemon 負責連線到外部 MySQL/MariaDB ### **5. 範例配置** (helm/slurm/values.yaml) ```yaml accounting: storageConfig: host: mariadb # 可指向任意 MySQL/MariaDB 主機 port: 3306 database: slurm_acct_db username: slurm passwordKeyRef: # 從 Secret 取得密碼 name: mariadb-password key: password ``` ### **總結** - **不限於特定資料庫**:任何支援 **MySQL 協定**的資料庫都可以(MySQL、MariaDB、相容的衍生版本) - **統一介面**:透過 Slurm 的 `accounting_storage/mysql` storage plugin - **連線方式**:標準 MySQL 協定 (TCP port 3306) - **彈性配置**:可連接 K8s 內部或外部的 MySQL/MariaDB 服務 **關鍵檔案位置**: - 資料庫連線定義: [`api/v1alpha1/accounting_types.go:66-101`](https://github.com/SlinkyProject/slurm-operator/blob/main/api/v1alpha1/accounting_types.go#L61-L95) - 連線配置生成: [`internal/builder/accounting_config.go:37-79`](https://github.com/SlinkyProject/slurm-operator/blob/main/internal/builder/accounting_config.go#L37-L79) - slurmdbd 容器部署: [`internal/builder/accounting_app.go:32-68`](https://github.com/SlinkyProject/slurm-operator/blob/main/internal/builder/accounting_app.go#L160-L192) <br> --- <br> ### 存取 mysql 協定的核心模組在哪裡? - ### Claude Sonnet 4 (2025/11/04) 根據程式碼分析,**存取 MySQL 協定的核心模組並不在此 operator 內**,而是由 **Slurm 本身的 slurmdbd 服務**處理。 ### **MySQL 存取核心模組位置** #### **1. 在 Slurm Operator 中** Operator **只負責配置與部署**,不包含 MySQL 連線實作: - **配置生成**: [`internal/builder/accounting_config.go:37-79`](https://github.com/SlinkyProject/slurm-operator/blob/main/internal/builder/accounting_config.go#L37-L79) - 產生 slurmdbd.conf - 指定使用 `accounting_storage/mysql` plugin - 提供連線參數 (host, port, user, password) - **容器部署**: [`internal/builder/accounting_app.go:163-195`](https://github.com/SlinkyProject/slurm-operator/blob/main/internal/builder/accounting_app.go#L160-L192) - 部署 slurmdbd StatefulSet - 使用預建的 Slurm container image #### **2. 實際 MySQL 連線核心** **位於 Slurm 原始碼中**(不在此 operator repo): ``` Slurm source code: src/plugins/accounting_storage/mysql/ ├── accounting_storage_mysql.c # 主要 MySQL plugin ├── as_mysql_*.c # 各種資料庫操作 └── ... ``` #### **3. Container Image 內含連線模組** 從 `Dockerfile`: ```dockerfile # Dockerfile:47-48 RUN yum install -y slurm-slurmdbd slurm-slurmctld slurm-slurmd ``` 這些 RPM 套件已包含編譯好的 MySQL plugin: - `/usr/lib64/slurm/accounting_storage_mysql.so` (實際路徑可能因發行版而異) #### **4. Operator 如何使用** ```go // internal/builder/accounting_config.go:61 StorageType: "accounting_storage/mysql" // 告訴 slurmdbd 載入 MySQL plugin ``` slurmdbd 啟動時會: 1. 讀取 `slurmdbd.conf` 2. 載入 `accounting_storage/mysql.so` shared library 3. 使用該 plugin 連接資料庫 ### **總結** - **MySQL 協定核心**: **Slurm upstream 專案** (`accounting_storage/mysql` plugin) - **Operator 角色**: 僅產生配置檔與部署容器 - **實際連線**: 由容器內的 **slurmdbd binary + MySQL plugin** 執行 - **無法直接查看**: 需要檢視 **Slurm 原始碼** 或容器內的 shared library **若要深入研究 MySQL 連線實作,需參考**: - Slurm 官方 GitHub: https://github.com/SchedMD/slurm - 路徑: `src/plugins/accounting_storage/mysql/` <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}