第 2 章 · 关系型数据库:MySQL / MariaDB / PostgreSQL
场景说明
demo-mall 的 api-go-demo 需要持久化订单与用户数据。你在 应用商店 → 数据库 看到 MySQL、MariaDB、PostgreSQL 多个卡片,镜像 tag 和 env 名称各不相同——选错或漏配 MYSQL_ROOT_PASSWORD,Pod 会 CrashLoop,应用连不上 mysql:3306。
本章在 paas ch01 四步向导 基础上,分别跟练三款关系库:部署 → 写 env → 集群内连接 → 业务集成 → 小紫运维入口。
前置:xiaozi-cloud ch04 应用商店;paas ch01 有状态约束(单副本、PVC、改 env 后重启)。
学完你能
| 能力 | 说明 |
|---|---|
| 选对引擎 | MySQL / MariaDB / PG 适用场景 |
| 商店一键部署 | 四步向导 + 确认页 YAML |
| 写连接串 | 集群 DNS 与 JDBC / DSN |
| 运维操作 | 备份、扩 PVC、看日志 |
| 业务集成 | Spring / Go / Django 配置项 |
2.1 MySQL 8.0
适用场景
| 选用 | 不选用 |
|---|---|
| 电商订单、用户账户、财务台账等 强事务 业务 | 非结构化日志、海量时序点(用 InfluxDB) |
| 团队熟悉 SQL、生态成熟(JDBC、ORM 遍地) | 需要灵活 Schema 的文档模型(用 MongoDB) |
| 主从/读写分离可后续扩展 | 超大规模分片首选(可考虑 TiDB 等,商店另有目录) |
商店部署参数
| 项 | 值 |
|---|---|
| 目录 id | mysql |
| 镜像 | mysql:8.0(基础系统 Debian) |
| 端口 | 3306 |
| PVC | 20 Gi → /var/lib/mysql |
| 资源 | 中型 · 2 核 4Gi |
| 命名空间建议 | data |
| 应用名称建议 | mysql |
部署路径:应用商店 → 数据库 → MySQL → 一键部署 → 步骤 ④ 补 env → 确认部署。
环境变量与核心配置
env:
- name: MYSQL_ROOT_PASSWORD
value: "强密码_至少16位"
- name: MYSQL_DATABASE
value: "appdb"
- name: MYSQL_USER
value: "app"
- name: MYSQL_PASSWORD
value: "应用账号密码"
# 可选:字符集
- name: MYSQL_CHARSET
value: "utf8mb4"
- name: MYSQL_COLLATION
value: "utf8mb4_unicode_ci"
| 变量 | 必填 | 说明 |
|---|---|---|
MYSQL_ROOT_PASSWORD | 是 | 不设则 Pod CrashLoop |
MYSQL_DATABASE | 否 | 首次启动自动建库 |
MYSQL_USER / MYSQL_PASSWORD | 否 | 自动建用户并授权到 MYSQL_DATABASE |
连接语法
集群内(同 Namespace data)
mysql://app:密码@mysql:3306/appdb
JDBC
jdbc:mysql://mysql.data.svc.cluster.local:3306/appdb?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai
命令行(应用部署 → 终端)
mysql -h 127.0.0.1 -P 3306 -u root -p
外网(NodePort 30306 示例)
mysql -h <节点IP> -P 30306 -u app -p appdb
常用 SQL 语法
-- 建库建用户(若未用 env 自动创建)
CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'shop'@'%' IDENTIFIED BY '密码';
GRANT ALL ON shop.* TO 'shop'@'%';
FLUSH PRIVILEGES;
-- 业务表示例
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
amount DECIMAL(12,2) NOT NULL,
status TINYINT NOT NULL DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user (user_id)
) ENGINE=InnoDB;
-- 运维
SHOW VARIABLES LIKE 'max_connections';
SHOW ENGINE INNODB STATUS\G
业务集成
Spring Boot application.yml
spring:
datasource:
url: jdbc:mysql://mysql:3306/appdb?useSSL=false&serverTimezone=Asia/Shanghai
username: app
password: ${MYSQL_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: validate
Django settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'mysql',
'PORT': '3306',
'NAME': 'appdb',
'USER': 'app',
'PASSWORD': os.environ['MYSQL_PASSWORD'],
'OPTIONS': {'charset': 'utf8mb4'},
}
}
小紫运维
| 操作 | 入口 |
|---|---|
| 扩容磁盘 | 应用部署 → 存储(Longhorn 校验池容量) |
| 升 CPU/内存 | 资源 |
| 改密码 | 工作负载 YAML 改 env → 重启 |
| 慢查询 | 终端 → mysql → SHOW PROCESSLIST |
| 备份逻辑 | 终端 mysqldump -uroot -p appdb > /tmp/backup.sql 或 Namespace YAML 导出 |