ClickHouse [1] 是一款用於聯機分析(OLAP)的列式數據庫管理系統(DBMS)。由號稱“俄羅斯Google”的Yandex 公司開發,並於2016 年開源,近年在計算引擎技術領域受到越來越多的關注,算是數據庫後起之秀。

Kubernetes [2] 是Google 公司於2014 年6 月開源的一款容器集群管理系統。適用於管理雲平台多個主機的容器化應用,旨在讓部署容器化的應用簡單並且高效,努力成為跨主機集群的自動部署、擴展以及運行應用程序容器的平台。

借助K8s 和容器化技術,我們不僅可以使得應用的部署和管理更加簡單高效、提高硬件資源利用率等,還可以實現健康檢查和自修復、自動擴縮容、負載均衡等高級功能。

那麼,如果黑馬數據庫ClickHouse 遇上火熱的容器化管理技術K8s,會擦出怎樣的火花呢?

部署方式 Kubectl 原生部署 Kubectl 原生部署 Helm 部署 Helm 部署
是否使用Operator × ×
部署方便程度
管理方便程度

 

| ClickHouse 容器化方案概覽

當前ClickHouse 的主流容器化方案包括 原生(Kubectl)部署 和 Helm 部署 兩種,而每種又包括 是否使用Operator 兩種情況。

| Helm 部署方案

Kubernetes 基於服務力度提供了很多資源類型,比如Service、Deployment 等。當需要部署一個應用時,尤其是有狀態應用,需要組合使用大量的Kubernetes 資源,部署之後還需要管理它們,包括升級、更新換代、刪除等等。這時我們會想,是否有這樣一個工具可以在更上層的維度去管理這些應用呢?這個時候就有了社區的一個包管理工具:Helm[3]。

簡單來講,可把Helm 看作是Linux 中的 Yum,Java 中的Maven。 對於應用發布者而言,可以通過Helm 打包應用,管理應用依賴關係,管理應用版本並發布應用到軟件倉庫。對於使用者而言,使用Helm 後不用需要了解Kubernetes 的Yaml 語法並編寫應用部署文件,可以通過Helm 下載並在Kubernetes 上安裝需要的應用。

| ClickHouse Operator 管理方案

Operator in Kubernetes 是一個Kubernetes 擴展,可以簡化應用的配置、管理和監控等。目前已經有很多應用開發了其Operator in Kubernetes,比如MySQL、PostgreSQL、MongoDB 等等,ClickHouse 也啟動了ClickHouse Operator [4] 項目,用於在K8s 上部署和管理ClickHouse。

可提供如下功能:

  • 創建Replicated 集群;
  • 管理用戶、配置文件;
  • 管理版本升級;
  • 管理數據持久化的存儲卷;
  • 導出ClickHouse metrics 到Prometheus;
  • 配置Pod Deployment,如Pod 模板,關聯規則等;
  • ……

通過這些功能,可以讓ClickHouse 集群部署和管理過程不再繁瑣,用戶只需關心如何創建以及管理CR 即可。

| RadonDB ClickHouse

RadonDB ClickHouse[5] 是由RadonDB 研發團隊研發並開源的,基於原生ClickHouse 的高可用、雲原生集群解決方案。RadonDB ClickHouse 實現了將Operator 管理和Helm 部署方案相結合,並支持在Kubernetes 上輕便快速地創建和管理ClickHouse 集群。

简单说,如果想在 Kubernetes 上使用 ClickHouse 集群,那么 RadonDB ClickHouse 是一个不错的选择。

延續上篇《容器化 ClickHouse on K8s 基本概念解析篇》,可以瞭解到 Operator 提供簡便管理 ClickHouse 叢集功能,Helm 提供便捷部署叢集功能。

本篇將以部署 RadonDB ClickHouse[1] 作為示例。在同樣選用 Operator 的條件下,比較Kubectl 和 Helm 兩種方式在 K8s 上部署 ClickHouse 叢集的便捷性。並簡要介紹如何在 K8s 上通過 Operator 輕便快速地管理 ClickHouse 叢集。

| 使用 Kubectl + Operator 部署

前置條件

  • 已安裝 Kubernetes 叢集。

部署步驟

1、部署 RadonDB ClickHouse Operator

$ kubectl apply -f https://raw.githubusercontent.com/radondb/radondb-clickhouse-kubernetes/main/clickhouse-operator-install.yml

注意:若需 Operator 監控所有的 Kubernetes namespace,則需將其部署在 kube-system namespace 下。否則只會監控部署到的 namespace。

2、編寫 CR 的部署檔案

以下 yaml 檔案描述了應用 RadonDB ClickHouse Operator 安裝兩分片兩副本叢集的 ClickHouse 的配置規範。

apiVersion: "clickhouse.radondb.com/v1"
kind: "ClickHouseInstallation"# 應用 Operator 建立叢集
metadata:
  name: "ClickHouse"
spec:
  defaults:
 templates:# 磁碟掛載
   dataVolumeClaimTemplate: data
   logVolumeClaimTemplate: data
  configuration:
    clusters:# 叢集節點描述,三分片兩副本
      - name: "replicas"
        layout:
          shardsCount: 2
          replicasCount: 2
  templates:
     volumeClaimTemplates:# 磁碟資訊描述
       - name: data
            reclaimPolicy: Retain
         spec:
           accessModes:
             - ReadWriteOnce
           resources:
             requests:
               storage: 10Gi

3、使用 Kubectl 部署

以 test 名稱空間為例:

$ kubectl -n test apply -f hello-kubernetes.yaml
clickhouseinstallation.clickhouse.radondb.com/ClickHouse created

注意:若 RadonDB ClickHouse Operator 沒有部署在 kube-system 中,則需要將 RadonDB ClickHouse 叢集與 Operator 部署在同一名稱空間。

部署成功後,Kubernetes 會將 CR 資訊存入 etcd 中,而 Operator 則將感知 etcd 的變化。當 Operator 獲取 CR 變化內容時,將根據 CR 的內容建立對應的 StatefulSet、Service 等相關內容。

4、檢視叢集的執行情況

可獲取四個正在執行的 RadonDB ClickHouse Pod,組成兩片兩副本的叢集,同時提供一個 LoadBalancer SVC,供外部訪問使用。

https://oscimg.oschina.net/oscnet/up-c5c2f953e22d04b4490d874872fb9ae864b.png

# 檢視 Pod 執行狀態
$ kubectl get pods -n test
NAME                               READY   STATUS    RESTARTS   AGE
pod/chi-ClickHouse-replicas-0-0-0   1/1     Running   0          3m13s
pod/chi-ClickHouse-replicas-0-1-0   1/1     Running   0          2m51s
pod/chi-ClickHouse-replicas-1-0-0   1/1     Running   0          2m34s
pod/chi-ClickHouse-replicas-1-1-0   1/1     Running   0          2m17s

# 檢視 SVC 執行狀態
$ kubectl get service -n test
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
service/chi-ClickHouse-replicas-0-0   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      2m53s
service/chi-ClickHouse-replicas-0-1   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      2m36s
service/chi-ClickHouse-replicas-1-0   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      2m19s
service/chi-ClickHouse-replicas-1-1   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      117s
service/clickhouse-ClickHouse         LoadBalancer   10.96.137.152   <pending>     8123:30563/TCP,9000:30615/TCP   3m14s

至此,如何使用 Kubectl + Operator 的方式部署 RadonDB ClickHouse 叢集便介紹完畢,可看到整個過程還是需要一定 K8s 知識 “功底” 的。

| 使用 Helm + Operator 部署

前置條件

  • 已安裝 Kubernetes 叢集;
  • 已安裝 Helm 包管理工具。

部署步驟

1、新增 RadonDB ClickHouse 的 Helm 倉庫

$ helm repo add ck https://radondb.github.io/radondb-clickhouse-kubernetes/
$ helm repo update

2、部署 RadonDB ClickHouse Operator

$ helm install clickhouse-operator ck/clickhouse-operator

3、部署 RadonDB ClickHouse 叢集

$ helm install clickhouse ck/clickhouse-cluster

4、檢視叢集的執行情況

可獲取六個正在執行的 RadonDB ClickHouse Pod,以及三個 Zookeeper Pod,組成三分片兩副本的叢集,同時提供一個 ClusterIP service,供訪問使用。如果需要在外部對叢集進行訪問,此處可通過 kubectl edit service/clickhouse-ClickHouse 將 service 的型別自行修改為 NodePort 或 LoadBalancer。

https://oscimg.oschina.net/oscnet/up-5904ad1b8ceb3e27a8fcd31cccd93306e03.png

# 檢視 Pod 執行狀態
$ kubectl get pods -n test
NAME                                READY   STATUS    RESTARTS   AGE
pod/chi-ClickHouse-replicas-0-0-0   2/2     Running   0          3m13s
pod/chi-ClickHouse-replicas-0-1-0   2/2     Running   0          2m51s
pod/chi-ClickHouse-replicas-1-0-0   2/2     Running   0          2m34s
pod/chi-ClickHouse-replicas-1-1-0   2/2     Running   0          2m17s
pod/chi-ClickHouse-replicas-2-0-0   2/2     Running   0          115s
pod/chi-ClickHouse-replicas-2-1-0   2/2     Running   0          48s
pod/zk-clickhouse-cluster-0         1/1     Running   0          3m13s
pod/zk-clickhouse-cluster-1         1/1     Running   0          3m13s
pod/zk-clickhouse-cluster-2         1/1     Running   0          3m13s


# 檢視 SVC 執行狀態
$ kubectl get service -n test
NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
service/chi-ClickHouse-replicas-0-0   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      2m53s
service/chi-ClickHouse-replicas-0-1   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      2m36s
service/chi-ClickHouse-replicas-1-0   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      2m19s
service/chi-ClickHouse-replicas-1-1   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      117s
service/chi-ClickHouse-replicas-2-0   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      50s
service/chi-ClickHouse-replicas-2-1   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      13s
service/clickhouse-ClickHouse         ClusterIP   10.96.137.152   <none>        8123/TCP,9000/TCP               3m14s
service/zk-client-clickhouse-cluster  ClusterIP   10.107.33.51    <none>        2181/TCP,7000/TCP               3m13s
service/zk-server-clickhouse-cluster  ClusterIP   None            <none>        2888/TCP,3888/TCP               3m13s

至此 ,通過 Helm 方式部署 RadonDB ClickHouse on Kubernetes 叢集完畢,可以看到 Helm 部署方式相對更方便和簡捷。簡化了 CR 部署檔案配置過程,無需掌握全部 Kubernetes 的 Yaml 語法和 CR 部署檔案各引數含義,可以通過打包應用快速部署。

| 使用 Operator 管理 RadonDB ClickHouse 叢集

上面演示瞭如何使用 Operator 部署 RadonDB ClickHouse 叢集,下面我們來驗證一下 Operator 管理叢集的功能。

新增分片

如果需要給 ClickHouse 新增一個額外的分片應該怎麼操作呢?此時只需要修改我們部署的 CR 即可。

$ kubectl get chi -n test
NAME         CLUSTERS   HOSTS   STATUS
clickhouse   1          6       Completed

$ kubectl edit chi/clickhouse -n test
# 這裡我們僅擷取需要修改的內容spec:
  configuration:
    clusters:
      - name: "replicas"
        layout:
          shardsCount: 4# 將分片改為 4
          replicasCount: 2


修改成功後,Kubernetes 會將 CR 資訊存入 etcd 中,而 Operator 則將感知 etcd 的變化。當 Operator 獲取 CR 變化內容時,將根據 CR 的內容建立對應的 StatefulSet、Service 等相關內容。

下面檢視 RadonDB ClickHouse 叢集的執行情況,可以看到增加了兩個 RadonDB ClickHouse Pod,完成叢集分片的增加。

$ kubectl get pods -n test
NAME                               READY   STATUS    RESTARTS   AGE
pod/chi-ClickHouse-replicas-0-0-0   1/1     Running   0          14m
pod/chi-ClickHouse-replicas-0-1-0   1/1     Running   0          14m
pod/chi-ClickHouse-replicas-1-0-0   1/1     Running   0          13m
pod/chi-ClickHouse-replicas-1-1-0   1/1     Running   0          13m
pod/chi-ClickHouse-replicas-2-0-0   1/1     Running   0          13m
pod/chi-ClickHouse-replicas-2-1-0   1/1     Running   0          12m
pod/chi-ClickHouse-replicas-3-0-0   1/1     Running   0          102s
pod/chi-ClickHouse-replicas-3-1-0   1/1     Running   0          80s


硬碟擴容

同樣的,如果需要給 ClickHouse Pods 進行擴容,也只需修改 CR 即可。

$ kubectl get chi -n test
NAME         CLUSTERS   HOSTS   STATUS
clickhouse   1          8       Completed

$ kubectl edit chi/clickhouse -n test

以修改儲存容量為 20 Gi 為例。

volumeClaimTemplates:
- name: data
  reclaimPolicy: Retain
  spec:
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 20Gi

修改成功後,Operator 將自動申請擴容,重建 StatefulSet,並掛載擴容後的硬碟。

通過檢視叢集的 PVC 掛載情況,可以看到硬碟已經更新為 20Gi 容量。

$ kubectl get pvc -n clickhouse
NAME                                          STATUS   VOLUME   CAPACITY   ACCESS MODES
data-chi-clickhouse-cluster-all-nodes-0-0-0   Bound    pv4      20Gi       RWO
data-chi-clickhouse-cluster-all-nodes-0-1-0   Bound    pv5      20Gi       RWO
data-chi-clickhouse-cluster-all-nodes-1-0-0   Bound    pv7      20Gi       RWO
data-chi-clickhouse-cluster-all-nodes-1-1-0   Bound    pv6      20Gi       RWO
...

結語

至此,我們便了解到在 Kubernetes 平臺上部署 RadonDB ClickHouse 叢集的兩種方法,以及 Operator 管理 ClickHouse 叢集的基本操作。

 

點閱: 27

By tony

自由軟體愛好者~喜歡不斷的思考各種問題,有新的事物都會想去學習嘗試 做實驗並熱衷研究 沒有所謂頂天的技術 只有謙虛及不斷的學習 精進專業,本站主要以分享系統及網路相關知識、資源而建立。 Github http://stnet253.github.io

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料