kingbase教程FG194-金仓数据库Kubernetes高可用配置
内容简介:本文档详细介绍金仓数据库在Kubernetes环境中的高可用配置方法和实战案例,包括Kubernetes基础、高可用架构、部署步骤等。风哥教程参考kingbase官方文档kingbase8系统管理员手册、kingbase8高可用指南等。
Part01-基础概念与理论知识
1.1 Kubernetes概述
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。主要组件包括:,风哥提示:
- Master节点:负责集群的管理和控制
- Worker节点:运行容器的节点
- Pod:K8s的最小部署单位,包含一个或多个容器
- Service:提供访问Pod的稳定网络地址
- Deployment:管理Pod的部署和更新
- StatefulSet:管理有状态应用的部署
- PersistentVolume:持久化存储
1.2 高可用架构概述
金仓数据库在K8s环境中的高可用架构主要包括:
- 主从复制:基于WAL日志的异步或同步复制
- MGR集群:金仓数据库的原生高可用解决方案,学习交流加群风哥微信: itpux-com
- StatefulSet部署:使用K8s的StatefulSet确保Pod的稳定网络标识和持久化存储
- Service负载均衡:使用K8s的Service实现负载均衡和故障转移
1.3 K8s高可用优势
K8s高可用的优势包括:
- 自动故障转移:当节点或Pod故障时,自动将工作负载转移到其他节点
- 弹性扩展:根据负载自动扩展Pod数量
- 统一管理:使用K8s的API统一管理容器
- 持久化存储:使用PersistentVolume确保数据持久化
- 服务发现:使用Service实现服务发现和负载均衡
Part02-生产环境规划与建议
2.1 K8s集群规划
K8s集群规划:
- Master节点:至少3个节点,实现高可用
- Worker节点:根据负载确定节点数量,至少2个节点,学习交流加群风哥QQ113257174
- 网络:使用Calico、Flannel等网络插件
- 存储:使用NFS、Ceph等存储解决方案
2.2 高可用策略选择
高可用策略选择:
- MGR集群:使用金仓数据库的MGR集群实现高可用
- 主从复制:使用主从复制实现高可用
- StatefulSet:使用K8s的StatefulSet确保Pod的稳定网络标识
- Service:使用K8s的Service实现负载均衡和故障转移
2.3 资源规划
资源规划:
- CPU:根据数据库负载分配足够的CPU资源
- 内存:根据数据库大小和并发连接数分配足够的内存,更多视频教程www.fgedu.net.cn
- 存储:使用高性能存储,如SSD
- 网络:确保网络带宽足够,延迟低
Part03-生产环境项目实施方案
3.1 K8s部署步骤
K8s部署步骤:
- 搭建K8s集群:安装和配置K8s集群
- 配置存储:设置PersistentVolume和PersistentVolumeClaim
- 部署Kingbase:使用StatefulSet部署Kingbase
- 配置高可用:设置主从复制或MGR集群
- 配置Service:设置Service实现负载均衡
3.2 高可用配置
高可用配置:
- 配置主从复制:设置主库和从库的复制关系
- 配置MGR集群:设置MGR集群的节点和参数,更多学习教程公众号风哥教程itpux_com
- 配置StatefulSet:确保Pod的稳定网络标识
- 配置Service:设置Service实现负载均衡和故障转移
3.3 监控与维护
监控与维护:
- 监控K8s集群:使用Prometheus和Grafana监控K8s集群
- 监控Kingbase:使用金仓数据库的监控工具
- 备份与恢复:定期备份数据库并测试恢复
- 更新与升级:定期更新K8s和Kingbase版本
Part04-生产案例与实战讲解
4.1 K8s集群搭建
K8s集群搭建:
# K8s集群搭建
# 步骤1:安装Docker
$ yum install -y docker
$ systemctl start docker
$ systemctl enable docker
# 步骤2:安装kubeadm、kubelet和kubectl
$ cat <
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
$ yum install -y kubeadm kubelet kubectl
$ systemctl enable kubelet
# 步骤3:初始化Master节点
$ kubeadm init –pod-network-cidr=10.244.0.0/16
# 步骤4:配置kubectl
$ mkdir -p $HOME/.kube
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config
# 步骤5:安装网络插件
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 步骤6:添加Worker节点
$ kubeadm join
# 步骤7:验证集群状态
$ kubectl get nodes
# 输出日志
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane,master 1h v1.21.0
worker1 Ready
worker2 Ready
4.2 Kingbase部署
Kingbase部署:
# Kingbase部署
# 步骤1:创建命名空间
$ kubectl create namespace kingbase
# 步骤2:创建存储类
$ vi storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: kingbase-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
$ kubectl apply -f storageclass.yaml
# 步骤3:创建持久卷
$ vi persistentvolume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: kingbase-pv
spec:
capacity:
storage: 100Gi
accessModes:
– ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: kingbase-storage
hostPath:
path: /data/kingbase
$ kubectl apply -f persistentvolume.yaml
# 步骤4:创建StatefulSet
$ vi statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kingbase
namespace: kingbase
spec:
serviceName: kingbase
replicas: 3
selector:
matchLabels:
app: kingbase
template:
metadata:
labels:
app: kingbase
spec:
containers:
– name: kingbase
image: kingbase/kingbasees:v8r6
ports:
– containerPort: 54321
env:
– name: KINGBASE_USER
value: “fgedu”
– name: KINGBASE_PASSWORD
value: “fgedu123”
– name: KINGBASE_DATABASE
value: “fgedudb”
volumeMounts:
– name: kingbase-data
mountPath: /kingbase/data
volumeClaimTemplates:
– metadata:
name: kingbase-data
spec:
accessModes: [ “ReadWriteOnce” ]
storageClassName: “kingbase-storage”
resources:
requests:
storage: 100Gi
$ kubectl apply -f statefulset.yaml
# 步骤5:创建Service
$ vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: kingbase
namespace: kingbase
spec:
selector:
app: kingbase
ports:
– port: 54321
targetPort: 54321
clusterIP: None
$ kubectl apply -f service.yaml
# 步骤6:创建负载均衡Service
$ vi loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: kingbase-lb
namespace: kingbase
spec:
selector:
app: kingbase
ports:
– port: 54321
targetPort: 54321
type: LoadBalancer
$ kubectl apply -f loadbalancer.yaml
# 步骤7:验证部署
$ kubectl get pods -n kingbase
# 输出日志
NAME READY STATUS RESTARTS AGE
kingbase-0 1/1 Running 0 10m
kingbase-1 1/1 Running 0 9m
kingbase-2 1/1 Running 0 8m
# 步骤8:配置主从复制
$ kubectl exec -it kingbase-0 -n kingbase — /bin/bash
# 在主库中创建复制用户
$ ksql -U fgedu -d fgedudb -c “CREATE USER repl WITH REPLICATION PASSWORD ‘repl123’;”
# 配置主库
$ vi /kingbase/app/etc/postgresql.conf
# 添加以下配置
listen_addresses = ‘*’
wal_level = replica
max_wal_senders = 10
wal_keep_segments = 32
# 配置pg_hba.conf
$ vi /kingbase/app/etc/pg_hba.conf
# 添加以下配置
host replication repl 0.0.0.0/0 md5
# 重启主库
$ kingbase restart
# 在从库中配置复制
$ kubectl exec -it kingbase-1 -n kingbase — /bin/bash
# 初始化从库
$ rm -rf /kingbase/data/*
$ pg_basebackup -h kingbase-0.kingbase.kingbase.svc.cluster.local -p 54321 -U repl -D /kingbase/data -Fp -Xs -P
# 创建recovery.conf文件
$ vi /kingbase/data/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=kingbase-0.kingbase.kingbase.svc.cluster.local port=54321 user=repl password=repl123’
trigger_file = ‘/kingbase/data/failover.trigger’
# 启动从库
$ kingbase start
# 验证复制状态
$ ksql -U fgedu -d fgedudb -c “SELECT * FROM pg_stat_replication;”
# 输出日志
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
——+———-+———+——————+————-+—————–+————-+——————————-+————–+———–+————+———–+———–+————+———–+———–+————+—————+————
1234 | 16384 | repl | walreceiver | 10.244.1.3 | | 54321 | 2026-04-09 10:00:00.000000+00 | | streaming | 0/12345678 | 0/12345678 | 0/12345678 | 0/12345678 | | | | 0 | async
4.3 高可用测试
高可用测试:,from DB视频:www.itpux.com
# 高可用测试
# 步骤1:测试主库写入
$ kubectl port-forward svc/kingbase-lb -n kingbase 54321:54321 &
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “INSERT INTO fgedu_test (id, name) VALUES (1, ‘fgedudb’);”
# 步骤2:测试从库读取
$ kubectl port-forward pod/kingbase-1 -n kingbase 54322:54321 &
$ psql -h fgedu.localhost -p 54322 -U fgedu -d fgedudb -c “SELECT * FROM fgedu_test;”
# 输出日志
id | name
—-+——
1 | fgedudb
# 步骤3:模拟主库故障
$ kubectl delete pod kingbase-0 -n kingbase
# 步骤4:等待新的主库选举
$ kubectl get pods -n kingbase
# 输出日志
NAME READY STATUS RESTARTS AGE
kingbase-1 1/1 Running 0 20m
kingbase-2 1/1 Running 0 19m
kingbase-0 1/1 Running 0 5m
# 步骤5:测试故障转移
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “INSERT INTO fgedu_test (id, name) VALUES (2, ‘fgedu2’);”
# 步骤6:检查数据一致性
$ kubectl port-forward pod/kingbase-2 -n kingbase 54323:54321 &
$ psql -h fgedu.localhost -p 54323 -U fgedu -d fgedudb -c “SELECT * FROM fgedu_test;”
# 输出日志
id | name
—-+——-
1 | fgedudb
2 | fgedu2
# 步骤7:验证集群状态
$ kubectl exec -it kingbase-1 -n kingbase — ksql -U fgedu -d fgedudb -c “SELECT * FROM pg_stat_replication;”
# 输出日志
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
——+———-+———+——————+————-+—————–+————-+——————————-+————–+———–+————+———–+———–+————+———–+———–+————+—————+————
5678 | 16384 | repl | walreceiver | 10.244.2.3 | | 54321 | 2026-04-09 10:10:00.000000+00 | | streaming | 0/87654321 | 0/87654321 | 0/87654321 | 0/87654321 | | | | 0 | async
4.4 生产环境K8s高可用最佳实践
生产环境K8s高可用最佳实践:
# 生产环境K8s高可用最佳实践
# 步骤1:使用Helm部署
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm install kingbase bitnami/postgresql –namespace kingbase –set auth.username=fgedu –set auth.password=fgedu123 –set auth.database=fgedudb –set primary.persistence.size=100Gi
# 步骤2:配置监控
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install prometheus prometheus-community/prometheus –namespace monitoring
$ helm install grafana grafana/grafana –namespace monitoring
# 步骤3:配置备份
$ vi backup-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: kingbase-backup
namespace: kingbase
spec:
schedule: “0 1 * * *”
jobTemplate:
spec:
template:
spec:
containers:
– name: backup
image: kingbase/kingbasees:v8r6
command:
– /bin/sh
– -c
– |
ksql -U fgedu -d fgedudb -c “SELECT pg_start_backup(‘full_backup’);”
tar -czf /backup/kingbase_backup_$(date +%Y%m%d%H%M%S).tar.gz /kingbase/data
ksql -U fgedu -d fgedudb -c “SELECT pg_stop_backup();”
volumeMounts:
– name: backup-volume
mountPath: /backup
restartPolicy: OnFailure
volumes:
– name: backup-volume
persistentVolumeClaim:
claimName: backup-pvc
$ kubectl apply -f backup-cronjob.yaml
# 步骤4:配置自动扩缩容
$ vi hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: kingbase-hpa
namespace: kingbase
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: StatefulSet
name: kingbase
minReplicas: 3
maxReplicas: 5
metrics:
– type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
– type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
$ kubectl apply -f hpa.yaml
# 步骤5:配置网络策略
$ vi networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: kingbase-network-policy
namespace: kingbase
spec:
podSelector:
matchLabels:
app: kingbase
policyTypes:
– Ingress
– Egress
ingress:
– from:
– podSelector:
matchLabels:
app: kingbase
– namespaceSelector:
matchLabels:
name: default
ports:
– protocol: TCP
port: 54321
egress:
– to:
– podSelector:
matchLabels:
app: kingbase
ports:
– protocol: TCP
port: 54321
$ kubectl apply -f networkpolicy.yaml
# 步骤6:定期更新
$ kubectl set image statefulset/kingbase kingbase=kingbase/kingbasees:v8r6-latest -n kingbase
Part05-风哥经验总结与分享
5.1 K8s高可用部署常见问题与解决方案
K8s高可用部署常见问题与解决方案:
- 存储问题:使用持久化存储,确保数据安全
- 网络问题:配置正确的网络策略,确保Pod之间可以通信
- 资源限制问题:设置Pod的资源限制,避免资源竞争
- 高可用配置问题:正确配置主从复制或MGR集群
- 监控问题:配置合适的监控工具,及时发现问题
5.2 K8s高可用部署最佳实践
K8s高可用部署最佳实践:
- 使用StatefulSet:确保Pod的稳定网络标识和持久化存储
- 使用PersistentVolume:确保数据持久化
- 使用Service:实现负载均衡和故障转移
- 配置监控:及时发现和处理问题
- 定期备份:确保数据安全
- 定期更新:保持系统安全和稳定
- 使用Helm:简化部署和管理
5.3 K8s部署脚本分享
以下是一个K8s部署脚本示例:
#!/bin/bash
# k8s_deployment.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置信息
NAMESPACE=”kingbase”
STORAGE_CLASS=”kingbase-storage”
PV_SIZE=”100Gi”
REPLICAS=”3″
# 记录日志
log() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” >> k8s_deployment.log
}
# 创建命名空间
create_namespace() {
log “创建命名空间:${NAMESPACE}”
kubectl create namespace ${NAMESPACE} || true
log “命名空间创建完成”
}
# 创建存储类
create_storage_class() {
log “创建存储类:${STORAGE_CLASS}”
cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ${STORAGE_CLASS}
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
kubectl apply -f storageclass.yaml
log “存储类创建完成”
}
# 创建持久卷
create_persistent_volume() {
log “创建持久卷”
cat > persistentvolume.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: kingbase-pv
spec:
capacity:
storage: ${PV_SIZE}
accessModes:
– ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: ${STORAGE_CLASS}
hostPath:
path: /data/kingbase
EOF
kubectl apply -f persistentvolume.yaml
log “持久卷创建完成”
}
# 创建StatefulSet
create_statefulset() {
log “创建StatefulSet”
cat > statefulset.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kingbase
namespace: ${NAMESPACE}
spec:
serviceName: kingbase
replicas: ${REPLICAS}
selector:
matchLabels:
app: kingbase
template:
metadata:
labels:
app: kingbase
spec:
containers:
– name: kingbase
image: kingbase/kingbasees:v8r6
ports:
– containerPort: 54321
env:
– name: KINGBASE_USER
value: “fgedu”
– name: KINGBASE_PASSWORD
value: “fgedu123”
– name: KINGBASE_DATABASE
value: “fgedudb”
volumeMounts:
– name: kingbase-data
mountPath: /kingbase/data
volumeClaimTemplates:
– metadata:
name: kingbase-data
spec:
accessModes: [ “ReadWriteOnce” ]
storageClassName: “${STORAGE_CLASS}”
resources:
requests:
storage: ${PV_SIZE}
EOF
kubectl apply -f statefulset.yaml
log “StatefulSet创建完成”
}
# 创建Service
create_service() {
log “创建Service”
cat > service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: kingbase
namespace: ${NAMESPACE}
spec:
selector:
app: kingbase
ports:
– port: 54321
targetPort: 54321
clusterIP: None
EOF
kubectl apply -f service.yaml
cat > loadbalancer.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: kingbase-lb
namespace: ${NAMESPACE}
spec:
selector:
app: kingbase
ports:
– port: 54321
targetPort: 54321
type: LoadBalancer
EOF
kubectl apply -f loadbalancer.yaml
log “Service创建完成”
}
# 验证部署
verify_deployment() {
log “验证部署”
sleep 30
kubectl get pods -n ${NAMESPACE}
if [ $? -eq 0 ]; then
log “Pod运行正常”
else
log “Pod运行失败”
fi
}
# 主函数
main() {
log “开始K8s部署”
create_namespace
create_storage_class
create_persistent_volume
create_statefulset
create_service
verify_deployment
log “K8s部署完成”
}
# 执行主函数
main
风哥提示:Kubernetes高可用部署是现代数据库部署的重要方式,通过K8s的容器编排能力和金仓数据库的高可用特性,可以实现数据库的自动故障转移、弹性扩展和统一管理,为企业提供更加可靠、高效的数据库服务。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
