ShinTech | 云原生于openGauss数据库的技术实践
openGauss是一款开源的高性能、高安全、高可靠的企业级关系型数据库,推出后备受欢迎与关注。而容器化和云原生技术可以为用户提供计算和存储资源的弹性伸缩、快速故障感知与切换、微服务化或者无服务化等面向云上资源和架构设计的能力。
新数科技积极拥抱openGauss生态,和社区、客户、高校以及合作伙伴共同发起成立了openGauss CloudNative SIG开源项目,并结合大型金融客户的实际需求,和客户联合设计和开发了openGauss数据库容器云平台,并在openGauss社区中开源发布了openGauss Operator(可通过阅读原文获取)。
本文将介绍openGauss Operator的设计和使用,以及openGauss Operator如何帮助用户在kubernetes环境中快速部署和管理openGauss数据库集群,提供基于kubernetes的高可用数据库云服务。
运行环境
openGauss Operator可以在标准的kubernetes环境中运行,目前支持K8S 1.18版本以上,硬件支持X86和ARM架构,亦在鲲鹏服务器和麒麟操作系统上成功验证。
架构设计
通过openGauss Operator,可以在K8S集群中快速部署openGauss单实例或一主多从集群。openGauss Operator在K8S集群中部署的openGauss集群结构如下图:
每个openGauss实例,包含以下部分:
Init container:完成集群的初始化配置的容器
openGauss container: 运行数据库实例的容器
Sidecar container:运行数据库日志收集、备份操作等
Data PVC: 数据存储
Log PVC: 日志存储
集群还通过Service实现了读写分离:
Read Service:对应于standby节点的读服务
Write Service:对应于primary节点的写服务
基本功能
3.1
CRD
openGauss Operator的CRD支持以下属性:
属性名 | 类型 | 说明 |
ReadPort | int32 | 读服务端口 |
WritePort | int32 | 写服务端口 |
DBPort | int32 | 数据库端口 |
Image | string | 数据库容器镜像 |
SidecarImage | string | Sidecar容器镜像 |
Cpu | string | 数据库CPU资源 |
Memory | string | 数据库内存资源 |
Storage | string | 数据库存储资源 |
BandWidth | string | 带宽 |
SidecarCpu | string | Sidecar CPU资源 |
SidecarMemory | string | Sidecar内存资源 |
SidecarStorage | string | Sidecar存储资源 |
IpList | IpNodeEntry | 节点IP列表 |
HostpathEnable | string | 是否使用host path存储 |
Maintenance | Bool | 集群是否处于人工维护状态 |
3.2
部署openGauss Operator
要使用openGauss Operator,需要先在K8S集群中部署openGauss Operator。可以参考openGauss社区上关于Operator的安装教程(参考阅读原文)。
Operator 在K8S集群中安装完成之后,使用以下命令创建openGauss CRD:
kubectl apply -f config/crd/bases/opengauss.sig_opengaussclusters.yaml
完成之后,可以在集群中查看Operator的运行状况:
3.3
创建openGauss集群
使用如下的CR就可以创建一个主从复制架构的openGauss集群。
apiVersion: opengauss.cmbc.com.cn/v1
kind: OpenGaussCluster
metadata:
name: og-sample-a
spec:
image: opengauss.sig/opengauss/container:2.0.0.v1
readport: 30020
writeport: 30021
iplist:
- ip: 10.244.2.21
nodename: k8snode02
- ip: 10.244.2.22
nodename: k8snode01
使用kubectl apply -f 运行该CR即可在指定的两个worknode上创建一主一从的openGauss集群,并给每个数据库实例所在的pod设置对应的IP,并且使用指定的读写服务端口。
命令执行完成后,可以查看数据库集群的pod运行状况:
对集群执行describe命令,可以查看集群中各容器的详细配置和运行状况:
在K8S集群内部,可以使用pod的ip直接访问集群数据库服务,如果从集群外部访问,则需要使用任意worknode的ip加上服务端口号。
对于上面一主一从openGauss集群,读端口为30020,写端口为30021,内部数据库端口是26000。其中10.244.2.21和10.244.2.22是数据库实例所在pod的内部ip,只能在集群内部访问;192.168.2.2.181和192.168.2.2.182是集群所在worknode的ip,可以从集群外部访问。集群的数据库服务访问地址如下:
访问方式 | 写服务访问地址 | 读服务访问地址 |
内部 | 10.244.2.21:26000 | 10.244.2.22:26000 |
外部 | 192.168.2.181:30021 192.168.2.182:30021 | 192.168.2.181:30020 192.168.2.182:30020 |
可以看到从外部访问的话,连接任意worknode的ip都可以,通过服务端口来区分读写操作。
集群建立后,可以在K8S集群内部通过pod ip和数据库监听26000端口访问openGauss,如下图:
3.4
集群扩/缩容
通过在CR中增加或删除IpNodeEntry来实现集群的扩缩容。扩容的时候,新增实例自动加入集群,并通过gs_basebackup来初始化数据;缩容的时候,指定节点上的实例会被删除,但存储该实例的数据和日志的PVC不会自动清除,将被保留,需要手动清理。
通过kutectl执行如下CRD可实现集群扩容:
apiVersion: opengauss.cmbc.com.cn/v1
kind: OpenGaussCluster
metadata:
name: og-sample-a
spec:
image: opengauss.sig/opengauss/container:2.0.0.v1
readport: 30020
writeport: 30021
iplist:
- ip: 10.244.2.21
nodename: k8snode02
- ip: 10.244.2.22
nodename: k8snode01
- ip: 10.244.2.23
nodename: k8snode02
扩容后的pod运行状态:
扩容后的集群中每个容器和实例的详细信息:
同样,可以kutectl执行如下CRD将集群缩容为一个单节点实例:
apiVersion: opengauss.cmbc.com.cn/v1
kind: OpenGaussCluster
metadata:
name: og-sample-a
spec:
image: opengauss.sig/opengauss/container:2.0.0.v1
readport: 30020
writeport: 30021
iplist:
- ip: 10.244.2.21
nodename: k8snode02
3.5
集群升级
修改镜像地址、容器资源(CPU、内存)和带宽限制将触发容器升级。升级采用滚动方式轮流进行,升级过程中保持至少有一个主节点在运行。
apiVersion: opengauss.cmbc.com.cn/v1
kind: OpenGaussCluster
metadata:
name: og-sample
spec:
image: opengauss.sig/opengauss/container:2.0.0.v1
readport: 30020
writeport: 30021
cpu: 4
memory: 8Gi
bandwidth: 100Mi
iplist:
- ip: 10.244.2.21
nodename: k8snode02
- ip: 10.244.2.22
nodename: k8snode01
优势特点
4.1
简便快捷
相较于传统的安装部署方式,openGauss Operator能够快速便捷的进行集群部署。完成一主一从的集群配置仅需60秒左右,期间无需人工干预。
通过CRD简化了多项系统资源的描述方式,使用者无需了解kubernetes内置的描述文件结构,降低了使用门槛。
4.2
配置灵活
通过编辑CR,就可以实现集群扩缩容,以及集群实例的配置修改。openGauss Operator能够支持数据库版本升级、资源(CPU、内存、带宽)变更、存储动态扩容、端口动态变更等。
4.3
读写分离
4.4
高可用
openGauss Operator持续监控每个集群的拓扑结构、实例运行状态和多种系统资源,能够自动修复多主、无主、节点故障等问题,确保集群的高可用。
通过使用PVC存储数据和日志,能够在实例故障时快速重建。Operator可以在一分钟内使用原有PVC重建整个集群。
从节点发生故障时,Operator能够自动重建从节点。主节点发生故障时,Operator从所有从节点中选择数据最完整的实例切换为主节点,然后将原主节点重建为从节点。
扩容、缩容、整体迁移和滚动升级过程中,始终确保集群主节点和必要数目的从节点可用。
4.5
维护模式
独特的维护状态设计,通过设置Maintenance=true就可以开启人工维护状态。处于维护状态中的集群,Operator仅维持系统资源,把数据库管理交给人工处理,适用于DBA做更精细的数据库实例维护。4.6
外部依赖低
openGauss Operator不依赖于第三方项目,编译部署简单便捷。
openGauss Operator对存储依赖度低。在没有合适的CSI支持的情况下,可以通过设置HostpathEnable=true,启用本地存储(Hostpath)。
发展路线
openGauss Operator未来的计划包括支持同城双中心灾备、可定制数据库配置等更多企业级特性。
作者简介 AUTHOR
亓明涛
毕业于清华大学计算机系,加入新数科技之前,是Oracle的资深架构师,参与过Oracle公司多款软件产品的设计和开发工作。目前在新数科技带领团队参与负责数据库容器云平台等产品的研发工作。您可以通过邮箱或留言交流关于openGauss Operator的问题。
欢迎联系我们进行技术交流
邮箱:tech@shindata.com
关于新数
ShinData新数科技成立于2014年,先后获得天创资本、曦域资本和博彦科技等多家机构投资,致力于为广大用户提供企业级数据库智能生态软件产品和数据云服务。产品形态兼有私有化部署和公有云SaaS模式,主要涵盖dbPaaS数据库云管理平台、分布式数据库和数据迁移传输平台等多个系列。应用于多家大型银行、证券、央企和能源制造行业企业,为广大企业在新时期云计算、大数据、人工智能等环境下的数据库基础软件转型变革提供持久源动力。
+
推荐阅读