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