本文主要介绍如何在阿里云【容器服务 Kubernetes 版 ACK】上部署 RisingWave 集群。RisingWave当前提供单机试玩模式,以及基于 K8s 的分布式部署模式,生产中我们只推荐后者。K8s 虽然上手门槛高,但只需按照本篇文章的步骤依次操作,你依然能轻松驾驭一个生产集群。
安装组件
这里首先介绍一个成功部署的 RisingWave 集群在 K8s 上会运行哪些组件:
> kubectl get pods -l app.kubernetes.io/instance=my-risingwave NAME READY STATUS RESTARTS AGE my-risingwave-compactor-5c4469c979-njqmd 1/1 Running 1 (107s ago) 2m49s my-risingwave-compute-0 2/2 Running 1 (106s ago) 2m49s my-risingwave-etcd-0 1/1 Running 0 2m49s my-risingwave-frontend-7d85dd748b-9hft6 1/1 Running 1 (107s ago) 2m49s my-risingwave-meta-0 1/1 Running 0 2m49s my-risingwave-minio-649b57ddcc-xrvft 1/1 Running 0 2m49s
- Compactor:负责数据的清理及压缩。在生产中 Compactor 的运行很大程度影响了流计算的性能。
- Compute:负责流计算以及状态维护等。
- Etcd:负责元数据存储。
- Frontend:负责响应用户的 SQL 请求。
- Meta:用于集群的元信息管理,包括节点健康状态,数据库对象信息,流计算快照点(Checkpoint)的维护等。
- MinIO(可选):兼容 S3 的对象存储。如用户部署在诸如阿里云,腾讯云等云厂商上,则可直接使用云厂商提供的对象存储服务,无需安装 MinIO。
阿里云 ACK 服务配置
用户在购买及配置阿里云 ACK 服务时,基本可以完全采用默认项。
但需注意,为了稳定流畅运行,RisingWave 对生产中的机器规格有一定要求。具体可参考官方文档 Hardware requirements。这里建议用户购买高于文档中推荐配置的阿里云机型。
除去对 CPU 和内存的要求外,RisingWave 也建议用户选择相对较快的本地磁盘存储以搭配 etcd,避免生产中由于 etcd 的服务异常导致整个集群故障。这里具体的操作如下:
- 查询当前K8s中已存在的存储类。阿里云提供数个存储类可供选择(参考),具体如下:
> kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-disk-available diskplugin.csi.alibabacloud.com Delete Immediate true 5h37m alicloud-disk-efficiency diskplugin.csi.alibabacloud.com Delete Immediate true 5h37m alicloud-disk-essd diskplugin.csi.alibabacloud.com Delete Immediate true 5h37m alicloud-disk-ssd diskplugin.csi.alibabacloud.com Delete Immediate true 5h37m alicloud-disk-topology diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 5h37m alicloud-disk-topology-alltype diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 5h37m
- 我们直接将 alicloud-disk-essd 设置为默认存储类:
> kubectl annotate storageclass alicloud-disk-essd storageclass.kubernetes.io/is-default-class=true metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"allowVolumeExpansion":true,"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"alicloud-disk-ssd"},"parameters":{"type":"cloud_ssd"},"provisioner":"diskplugin.csi.alibabacloud.com","reclaimPolicy":"Delete"} storageclass.kubernetes.io/is-default-class: "true"
- 请在 metadata → annotations 的子项中加上
storageclass.kubernetes.io/is-default-class: "true"
,这将会设置该存储类为默认。这意味着它会自动购买并挂载阿里云ESSD云盘。
集群安装
接着按照 RisingWave Helm 部署文档 的步骤来进行安装部署即可。需注意的是,该流程要求使用 Helm 3.7+ 版本,而**阿里云 CloudShell** 所预装的 Helm 版本仅为 3.5,因此我们不建议通过CloudShell来执行操作。
- 首先安装 RisingWave 的 Helm Chart
helm repo add risingwavelabs <https://risingwavelabs.github.io/helm-charts/>
- 确保你正在使用最新的 Helm Chart
helm repo update
- 注意!!:本地编辑 values.yml 文件并配置 etcd 的存储空间为 20GB。这是因为阿里云不允许申请小于 20GB 的块存储。
etcd: persistence: size: 20Gi
- 本地编辑 values.yml 并配置后端存储为**阿里云 OSS 对象存储服务**。请按注释正确填入:
tags: minio: false stateStore: minio: enabled: false oss: enabled: true region: # OSS 地域,如 cn-beijing bucket: # OSS bucket name root: risingwave useInternalEndpoint: false authentication: useServiceAccount: false # 具体请参考 <https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair> accessKey: # 阿里云 Access Key secretKey: # 阿里云 Secret Key
- 通过 Helm 安装 RisingWave 集群:
helm install --set wait=true -f values.yml my-risingwave risingwavelabs/risingwave
- 你可以将 my-risingwave 替代为任何其他合法名字。
- 确认 RisingWave 是否已被成功安装。往往完成安装需花费 3-5 分钟。
> kubectl get pods -l app.kubernetes.io/instance=my-risingwave NAME READY STATUS RESTARTS AGE my-risingwave-compactor-8dd799db6-hdjjz 1/1 Running 1 (8m33s ago) 11m my-risingwave-compute-0 2/2 Running 0 11m my-risingwave-etcd-0 1/1 Running 0 11m my-risingwave-frontend-7bd7b8c856-czdgd 1/1 Running 1 (8m33s ago) 11m my-risingwave-meta-0 1/1 Running 0 11m
访问集群
K8s 提供多种网络访问模式,分别为:
- ClusterIP
- NodePort
- LoadBalancer
RisingWave 默认采用 ClusterIP,即仅允许同一K8s集群内的服务之间相互联通。
为便于测试和开发,用户可以借 API Server 路由来访问 RisingWave:
kubectl port-forward svc/my-risingwave 4567:svc
随后用户即可通过psql或其他Postgres客户端来访问 RisingWave:
psql -h localhost -p 4567 -d dev -U root
卸载集群
如要完整下线该 RisingWave 集群,您需要执行以下操作:
- 下线所有的 Pod
helm uninstall my-risingwave
- 删除所有的 存储卷(PersistenVolume)
kubectl delete pvc -l app.kubernetes.io/instance=my-risingwave
- 参考 OSS 文档 删除 OSS 中的数据