---
# System prepended metadata

title: '[db] Slurm Operator 如何存取外部資料庫？'
tags: [mariadb, k8s, Slurm / SlinkyProject / db, Slurm, mysql, app, SlinkyProject, Kubernetes]

---

[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 %}