云原生存储与数据库选型实战:从传统数据库到云原生数据库的演进
大家好,我是迪哥。随着业务从传统架构向云原生架构演进,存储和数据库的选型变得越来越重要。从 MySQL 到 TiDB,从 Redis 到 Dragonfly,从本地存储到分布式存储,我们经历了多次技术选型的纠结。今天就和大家聊聊云原生时代的存储和数据库选型策略。
存储架构演进
传统存储 → 分布式存储 → 云原生存储
SAN/NAS Ceph/Gluster CSI/Cloud Storage
云原生存储方案对比
| 方案 | 适用场景 | 特点 |
|---|---|---|
| Local PV | 单节点状态应用 | 高性能,低延迟 |
| HostPath | 开发测试环境 | 简单,不推荐生产 |
| NFS | 多节点共享 | 兼容性好,性能一般 |
| Ceph | 大规模分布式存储 | 高可用,弹性伸缩 |
| CSI Volume | 云厂商存储 | 托管服务,省心 |
CSI 配置示例
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-disk
数据库选型策略
关系型数据库
| 数据库 | 适用场景 | 特点 |
|---|---|---|
| MySQL | 通用场景 | 成熟稳定,生态完善 |
| PostgreSQL | 复杂查询 | 功能强大,支持JSON |
| TiDB | 分布式事务 | 水平扩展,强一致 |
| CockroachDB | 全球分布式 | 多活,强一致 |
NoSQL 数据库
| 数据库 | 适用场景 | 特点 |
|---|---|---|
| Redis | 缓存/会话 | 高性能,支持多种数据结构 |
| Dragonfly | 替代Redis | 更高性能,兼容Redis协议 |
| MongoDB | 文档存储 | 灵活schema,水平扩展 |
| Cassandra | 时序/日志 | 高写入,分布式 |
选型决策树
┌─────────────────┐
│ 需要事务吗? │
└────────┬────────┘
│
┌─────────────┴─────────────┐
│ │
Yes │ │ No
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 需要水平扩展? │ │ 数据结构? │
└────────┬────────┘ └────────┬────────┘
│ │
┌──────┴──────┐ ┌─────────┴─────────┐
│ │ │ │
Yes │ │ No Key-Value Document
▼ ▼ ▼ ▼
TiDB/CRDB MySQL Redis/Dragonfly MongoDB
TiDB 实战配置
yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
name: basic
spec:
version: v6.5.0
timezone: UTC
pvReclaimPolicy: Retain
discovery: {}
tikv:
baseImage: pingcap/tikv
replicas: 3
storageClaims:
- resources:
requests:
storage: 100Gi
tidb:
baseImage: pingcap/tidb
replicas: 2
service:
type: NodePort
Dragonfly 替代 Redis
yaml
# Dragonfly 配置
apiVersion: v1
kind: Deployment
metadata:
name: dragonfly
spec:
replicas: 3
selector:
matchLabels:
app: dragonfly
template:
spec:
containers:
- name: dragonfly
image: docker.dragonflydb.io/dragonflydb/dragonfly
args:
- --dbfilename=dragonfly
- --dir=/data
- --bind=0.0.0.0
- --port=6379
ports:
- containerPort: 6379
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: dragonfly-pvc
数据库高可用配置
MySQL 主从复制
yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
- name: mysql
port: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
replicas: 3
selector:
matchLabels:
app: mysql
serviceName: mysql
template:
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
备份与恢复
Velero 备份配置
yaml
apiVersion: velero.io/v1
kind: Schedule
metadata:
name: daily-backup
spec:
schedule: "0 0 * * *"
template:
includedNamespaces:
- default
- prod
snapshotVolumes: true
ttl: 720h
最佳实践清单
| 维度 | 最佳实践 |
|---|---|
| 存储 | 使用 CSI Volume,避免 HostPath |
| 数据库 | 关键业务用 TiDB,缓存用 Dragonfly |
| 高可用 | 至少 3 副本,跨 AZ 部署 |
| 备份 | 定期备份,测试恢复流程 |
| 监控 | 监控存储使用率、IOPS、延迟 |
说到存储,我家那只叫 Docker 的哈士奇最近学会了"分布式存储"------把玩具藏到家里各个角落,美其名曰"数据备份",这备份策略比我们的 Velero 还强 😂
我是迪哥,我们下期再见!