外观
TiDB Kubernetes 部署
TiDB 提供了完整的 Kubernetes 支持,通过 TiDB Operator 可以在 Kubernetes 集群上自动化部署、管理和运维 TiDB 集群。TiDB Operator 基于 Kubernetes 自定义资源定义(CRD)和控制器模式,实现了 TiDB 集群的全生命周期管理。
部署前准备
1. Kubernetes 集群要求
部署 TiDB 集群前,需要准备一个符合以下要求的 Kubernetes 集群:
- Kubernetes 版本:1.19 及以上
- 节点数量:至少 3 个节点,用于部署 TiDB、TiKV 和 PD
- 节点资源:
- TiDB 节点:8 核 CPU、16 GB 内存
- TiKV 节点:8 核 CPU、32 GB 内存、500 GB SSD 磁盘
- PD 节点:4 核 CPU、8 GB 内存、100 GB SSD 磁盘
- 存储:支持动态卷供应,如 Ceph RBD、AWS EBS、GCP PD 等
- 网络:支持 Pod 间通信,建议使用 Calico、Flannel 等网络插件
2. 安装 TiDB Operator
TiDB Operator 是部署和管理 TiDB 集群的核心组件,需要先安装 TiDB Operator:
使用 Helm 安装 TiDB Operator
bash
# 添加 PingCAP Helm 仓库
helm repo add pingcap https://charts.pingcap.org/
helm repo update
# 创建命名空间
kubectl create namespace tidb-operator
# 安装 TiDB Operator
helm install tidb-operator pingcap/tidb-operator --namespace tidb-operator --version v1.5.0
# 验证 TiDB Operator 安装状态
kubectl get pods -n tidb-operator自定义 TiDB Operator 配置
根据 Kubernetes 集群的规模和需求,可以自定义 TiDB Operator 的配置:
bash
# 创建 values.yaml 文件
cat << EOF > values.yaml
tidbOperator:
controllerManager:
replicas: 2
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 500m
memory: 512Mi
EOF
# 安装或升级 TiDB Operator
helm install tidb-operator pingcap/tidb-operator --namespace tidb-operator --version v1.5.0 -f values.yaml3. 配置存储类
TiDB 集群需要使用高性能的存储,建议配置 SSD 存储类:
配置 Ceph RBD 存储类
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: <ceph-cluster-id>
pool: <ceph-pool-name>
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: kube-system
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
EOF
# 应用存储类配置
kubectl apply -f ceph-rbd-sc.yaml配置 AWS EBS 存储类
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp3
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iopsPerGB: "10000"
throughput: "125"
fsType: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
EOF
# 应用存储类配置
kubectl apply -f aws-ebs-sc.yaml部署 TiDB 集群
1. 准备集群配置文件
创建 TiDB 集群的配置文件,定义集群的规模、资源、存储等配置:
yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
name: basic
namespace: tidb-cluster
spec:
version: v7.5.0
timezone: UTC
pvReclaimPolicy: Delete
enableDynamicConfiguration: true
configUpdateStrategy: RollingUpdate
discovery:
image: pingcap/tidb-discovery:v1.5.0
enableTLSCluster: false
pd:
baseImage: pingcap/pd
replicas: 3
requests:
storage: "100Gi"
config:
replication:
max-replicas: 3
storageClassName: ceph-rbd
tikv:
baseImage: pingcap/tikv
replicas: 3
requests:
storage: "500Gi"
config:
storage:
block-cache-size: "24GB"
storageClassName: ceph-rbd
tidb:
baseImage: pingcap/tidb
replicas: 2
service:
type: NodePort
config:
performance:
max-procs: 8
monitor:
baseImage: prom/prometheus
replicas: 1
requests:
storage: "100Gi"
config:
retention: 7d
storageClassName: ceph-rbd
grafana:
baseImage: grafana/grafana
replicas: 1
alertmanager:
baseImage: prom/alertmanager
replicas: 1
EOF2. 部署 TiDB 集群
bash
# 创建命名空间
kubectl create namespace tidb-cluster
# 部署 TiDB 集群
kubectl apply -f tidb-cluster.yaml -n tidb-cluster
# 查看集群部署状态
kubectl get pods -n tidb-cluster
# 查看集群状态
kubectl get tc basic -n tidb-cluster3. 访问 TiDB 集群
部署完成后,可以通过以下方式访问 TiDB 集群:
通过 NodePort 访问
bash
# 获取 TiDB NodePort
TIDB_NODE_PORT=$(kubectl get svc basic-tidb -n tidb-cluster -o jsonpath='{.spec.ports[?(@.name=="mysql-client")].nodePort}')
# 获取 Node IP
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
# 使用 MySQL 客户端访问
mysql -h $NODE_IP -P $TIDB_NODE_PORT -u root通过 LoadBalancer 访问
如果 Kubernetes 集群支持 LoadBalancer,可以修改 TiDB Service 的类型为 LoadBalancer:
yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.service.type 为 LoadBalancer
tidb:
service:
type: LoadBalancerbash
# 应用修改
kubectl apply -f tidb-cluster.yaml -n tidb-cluster
# 获取 LoadBalancer IP
TIDB_LB_IP=$(kubectl get svc basic-tidb -n tidb-cluster -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
# 使用 MySQL 客户端访问
mysql -h $TIDB_LB_IP -P 4000 -u root配置管理
1. 修改集群配置
TiDB 集群部署后,可以通过修改 TidbCluster 自定义资源来调整集群配置:
调整 TiKV 资源配置
yaml
# 修改 tidb-cluster.yaml 文件中的 tikv.requests 和 tikv.limits
tikv:
requests:
cpu: "8"
memory: "32Gi"
storage: "500Gi"
limits:
cpu: "8"
memory: "32Gi"调整 TiDB 配置
yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.config
tidb:
config:
performance:
max-procs: 8
log:
level: "info"应用配置修改
bash
# 应用修改
kubectl apply -f tidb-cluster.yaml -n tidb-cluster
# 查看配置更新状态
kubectl get tc basic -n tidb-cluster -o jsonpath='{.status.conditions}'2. 使用 ConfigMap 配置
对于更复杂的配置,可以使用 ConfigMap 来管理:
bash
# 创建 ConfigMap
kubectl create configmap tikv-config -n tidb-cluster --from-file=tikv.toml
# 在 TidbCluster 中引用 ConfigMap
tikv:
configRef:
name: tikv-config
key: tikv.toml监控和告警
1. 访问监控面板
TiDB 集群部署时会自动部署 Prometheus、Grafana 和 Alertmanager:
访问 Grafana
bash
# 获取 Grafana Service
kubectl get svc basic-grafana -n tidb-cluster
# 端口转发访问 Grafana
kubectl port-forward svc/basic-grafana 3000:3000 -n tidb-cluster访问 http://localhost:3000,使用默认用户名 admin 和密码 admin 登录。
访问 Prometheus
bash
# 端口转发访问 Prometheus
kubectl port-forward svc/basic-prometheus 9090:9090 -n tidb-cluster访问 Alertmanager
bash
# 端口转发访问 Alertmanager
kubectl port-forward svc/basic-alertmanager 9093:9093 -n tidb-cluster2. 配置告警规则
可以通过修改 TidbMonitor 自定义资源来配置告警规则:
yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
name: basic
namespace: tidb-cluster
spec:
clusters:
- name: basic
prometheus:
baseImage: prom/prometheus
replicas: 1
service:
type: NodePort
config:
rule_files:
- /etc/prometheus/rules/alertmanager/tidb.rules.yaml
- /etc/prometheus/rules/alertmanager/tikv.rules.yaml
- /etc/prometheus/rules/alertmanager/pd.rules.yaml
- /etc/prometheus/rules/alertmanager/node.rules.yaml
- /etc/prometheus/rules/alertmanager/k8s.rules.yaml
grafana:
baseImage: grafana/grafana
replicas: 1
service:
type: NodePort
alertmanager:
baseImage: prom/alertmanager
replicas: 1
service:
type: NodePort
config:
global:
resolve_timeout: 5m
route:
group_by:
- alertname
- cluster
- service
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: default-receiver
receivers:
- name: default-receiver
email_configs:
- to: alerts@example.com
from: alertmanager@example.com
smarthost: smtp.example.com:587
auth_username: alertmanager@example.com
auth_password: password
require_tls: true
EOF
# 应用配置
kubectl apply -f tidb-monitor.yaml -n tidb-cluster集群维护
1. 扩容集群
可以通过修改 TidbCluster 自定义资源来扩容集群:
扩容 TiKV 节点
yaml
# 修改 tidb-cluster.yaml 文件中的 tikv.replicas
tikv:
replicas: 5扩容 TiDB 节点
yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.replicas
tidb:
replicas: 3应用扩容配置
bash
# 应用扩容配置
kubectl apply -f tidb-cluster.yaml -n tidb-cluster
# 查看扩容进度
kubectl get pods -n tidb-cluster -w2. 缩容集群
可以通过修改 TidbCluster 自定义资源来缩容集群:
缩容 TiKV 节点
yaml
# 修改 tidb-cluster.yaml 文件中的 tikv.replicas
tikv:
replicas: 3缩容 TiDB 节点
yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.replicas
tidb:
replicas: 2应用缩容配置
bash
# 应用缩容配置
kubectl apply -f tidb-cluster.yaml -n tidb-cluster
# 查看缩容进度
kubectl get pods -n tidb-cluster -w3. 升级集群
可以通过修改 TidbCluster 自定义资源来升级集群:
yaml
# 修改 tidb-cluster.yaml 文件中的 spec.version
spec:
version: v7.6.0bash
# 应用升级配置
kubectl apply -f tidb-cluster.yaml -n tidb-cluster
# 查看升级进度
kubectl get pods -n tidb-cluster -w
# 查看升级状态
kubectl get tc basic -n tidb-cluster -o jsonpath='{.status.conditions}'4. 备份和恢复
在 Kubernetes 上,可以使用 TiDB Operator 提供的 TidbBackup 和 TidbRestore 自定义资源来管理备份和恢复:
创建备份
yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbBackup
metadata:
name: basic-backup
namespace: tidb-cluster
spec:
from:
name: basic
br:
cluster:
namespace: tidb-cluster
clusterName: basic
sendCredToTikv: true
options:
- --ratelimit=128
- --concurrency=64
s3:
provider: aws
secretName: s3-secret
bucket: tidb-backup
prefix: basic
region: us-east-1
endpoint: s3.amazonaws.com
EOF
# 应用备份配置
kubectl apply -f tidb-backup.yaml -n tidb-cluster
# 查看备份状态
kubectl get tb basic-backup -n tidb-cluster -o jsonpath='{.status.conditions}'恢复备份
yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbRestore
metadata:
name: basic-restore
namespace: tidb-cluster
spec:
to:
name: basic
br:
cluster:
namespace: tidb-cluster
clusterName: basic
sendCredToTikv: true
options:
- --ratelimit=128
- --concurrency=64
s3:
provider: aws
secretName: s3-secret
bucket: tidb-backup
prefix: basic
region: us-east-1
endpoint: s3.amazonaws.com
EOF
# 应用恢复配置
kubectl apply -f tidb-restore.yaml -n tidb-cluster
# 查看恢复状态
kubectl get tr basic-restore -n tidb-cluster -o jsonpath='{.status.conditions}'故障排除
1. 查看集群状态
bash
# 查看 TidbCluster 状态
kubectl get tc basic -n tidb-cluster -o yaml
# 查看 Pod 状态
kubectl get pods -n tidb-cluster
# 查看 Pod 日志
kubectl logs -f <pod-name> -n tidb-cluster
# 查看事件
kubectl get events -n tidb-cluster2. 常见故障及解决方案
PD 集群无法启动
可能原因:
- 存储卷无法挂载
- PD 节点间网络通信失败
- 初始集群配置错误
解决方案:
- 检查存储类配置,确保动态卷供应正常
- 检查网络插件配置,确保 Pod 间通信正常
- 检查 PD 配置,特别是
initial-cluster配置
TiKV 节点频繁重启
可能原因:
- 内存不足,导致 OOM
- 磁盘 I/O 性能不足
- 配置错误
解决方案:
- 增加 TiKV 节点的内存资源
- 检查存储性能,确保使用高性能 SSD
- 检查 TiKV 配置,特别是内存相关配置
TiDB 连接失败
可能原因:
- TiDB Pod 未就绪
- Service 配置错误
- 网络访问限制
解决方案:
- 检查 TiDB Pod 状态,确保所有 Pod 就绪
- 检查 Service 配置,确保端口映射正确
- 检查网络策略,确保允许外部访问
最佳实践
1. 资源配置最佳实践
PD 节点:
- CPU:4 核+
- 内存:8 GB+
- 存储:100 GB+ SSD
TiKV 节点:
- CPU:8 核+
- 内存:32 GB+,建议内存大小为 CPU 核心数的 4-8 倍
- 存储:500 GB+ NVMe SSD
TiDB 节点:
- CPU:8 核+
- 内存:16 GB+
- 存储:200 GB+ SSD
2. 存储最佳实践
- 使用 SSD 存储,推荐 NVMe SSD
- 配置合理的存储类,支持动态卷供应
- 设置合适的存储容量,预留足够的扩容空间
- 启用卷扩展功能,便于后续扩容
3. 高可用性最佳实践
- 部署至少 3 个 PD 节点,确保 PD 集群的高可用性
- 部署至少 3 个 TiKV 节点,确保数据的高可用性
- 部署至少 2 个 TiDB 节点,确保服务的高可用性
- 跨可用区部署,提高集群的容灾能力
4. 监控和告警最佳实践
- 配置全面的监控指标,包括集群性能、资源使用、存储状态等
- 设置合理的告警阈值,避免误告警
- 配置多个告警渠道,确保告警及时送达
- 定期审查告警规则,根据业务需求调整
5. 备份和恢复最佳实践
- 定期进行全量备份,建议每天一次
- 启用增量备份,减少数据丢失风险
- 将备份数据存储在异地,提高容灾能力
- 定期进行恢复测试,验证备份数据的可用性
常见问题(FAQ)
Q1: TiDB Operator 支持哪些 Kubernetes 版本?
A1: TiDB Operator 支持 Kubernetes 1.19 及以上版本,建议使用 Kubernetes 1.20 或更高版本。
Q2: 如何选择 TiDB 集群的存储类?
A2: 建议选择高性能的 SSD 存储类,如 Ceph RBD、AWS EBS gp3、GCP PD SSD 等。存储类需要支持动态卷供应和卷扩展功能。
Q3: 如何访问 TiDB 集群的监控面板?
A3: 可以通过以下方式访问监控面板:
- 使用
kubectl port-forward命令进行端口转发 - 将 Service 类型设置为 NodePort 或 LoadBalancer
- 使用 Ingress 或 API Gateway 进行访问
Q4: 如何升级 TiDB 集群?
A4: 可以通过修改 TidbCluster 自定义资源的 spec.version 字段来升级 TiDB 集群。TiDB Operator 会自动执行滚动升级,确保升级过程中服务不中断。
Q5: 如何备份和恢复 TiDB 集群?
A5: 可以使用 TiDB Operator 提供的 TidbBackup 和 TidbRestore 自定义资源来管理备份和恢复。支持备份到 S3、GCS、Azure Blob Storage 等存储服务。
Q6: TiDB 集群的高可用性如何保证?
A6: TiDB 集群通过以下方式保证高可用性:
- PD 集群采用 Raft 协议,确保元数据的高可用性
- TiKV 集群采用 Raft 协议,确保数据的高可用性
- TiDB 节点无状态,可以水平扩展,确保服务的高可用性
- TiDB Operator 自动监控和恢复故障节点
Q7: 如何调整 TiDB 集群的配置?
A7: 可以通过修改 TidbCluster 自定义资源的配置字段来调整 TiDB 集群的配置。支持在线调整配置,无需重启集群。
Q8: 如何监控 TiDB 集群的性能?
A8: TiDB 集群部署时会自动部署 Prometheus 和 Grafana,可以通过 Grafana 查看集群的性能指标。同时,也可以将监控数据导出到外部监控系统,如 Prometheus、InfluxDB 等。
