1. 首页 > 国产数据库教程 > Kingbase教程 > 正文

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部署步骤:

  1. 搭建K8s集群:安装和配置K8s集群
  2. 配置存储:设置PersistentVolume和PersistentVolumeClaim
  3. 部署Kingbase:使用StatefulSet部署Kingbase
  4. 配置高可用:设置主从复制或MGR集群
  5. 配置Service:设置Service实现负载均衡

3.2 高可用配置

高可用配置:

  1. 配置主从复制:设置主库和从库的复制关系
  2. 配置MGR集群:设置MGR集群的节点和参数,更多学习教程公众号风哥教程itpux_com
  3. 配置StatefulSet:确保Pod的稳定网络标识
  4. 配置Service:设置Service实现负载均衡和故障转移

3.3 监控与维护

监控与维护:

  1. 监控K8s集群:使用Prometheus和Grafana监控K8s集群
  2. 监控Kingbase:使用金仓数据库的监控工具
  3. 备份与恢复:定期备份数据库并测试恢复
  4. 更新与升级:定期更新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 < /etc/yum.repos.d/kubernetes.repo
[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 : –token –discovery-token-ca-cert-hash
# 步骤7:验证集群状态
$ kubectl get nodes
# 输出日志
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane,master 1h v1.21.0
worker1 Ready 1h v1.21.0
worker2 Ready 1h v1.21.0

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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息