MatrixOne 分布式集群部署

本篇文档将主要讲述如何从 0 开始部署一个基于私有化 Kubernetes 集群的云原生存算分离的分布式数据库 MatrixOne

主要步骤

  1. 部署 Kubernetes 集群
  2. 部署对象存储 MinIO
  3. 创建并连接 MatrixOne 集群

名词解释

由于该文档会涉及到众多 Kubernetes 相关的名词,为了让大家能够理解搭建流程,这里对涉及到的重要名词进行简单解释,如果需要详细了解 Kubernetes 相关的内容,可以直接参考 Kubernetes 中文社区 | 中文文档

  • Pod

Pod 是 Kubernetes 中最小的资源管理组件,Pod 也是最小化运行容器化应用的资源对象。一个 Pod 代表着集群中运行的一个进程。简单理解,我们可以把一组提供特定功能的应用成为一个 pod,它会包含一个或者多个容器对象,共同对外提供服务。

  • Storage Class

Storage Class,简称 SC,用于标记存储资源的特性和性能,管理员可以将存储资源定义为某种类别,正如存储设备对于自身的配置描述(Profile)。根据 SC 的描述可以直观的得知各种存储资源的特性,就可以根据应用对存储资源的需求去申请存储资源了。

  • PersistentVolume

PersistentVolume,简称 PV,PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。

  • PersistentVolumeClaim

PersistentVolumeClaim,简称 PVC,作为用户对存储资源的需求申请, 主要包括存储空间请求、访问模式、PV 选择条件和存储类别等信息的设置。

1. 部署 Kubernetes 集群

由于 MatrixOne 的分布式部署依赖于 Kubernetes 集群,因此我们需要一个 Kubernetes 集群。本篇文章将指导你通过使用 Kuboard-Spray 的方式搭建一个 Kubernetes 集群。

准备集群环境

对于集群环境,需要做如下准备:

  • 3 台 VirtualBox 虚拟机
  • 操作系统使用 Ubuntu 20.04 (默认不允许 root 账号远程登入,请预先修改 sshd 的配置文件,允许 root 远程登入):其中两台作为部署 Kubernetes 以及 MatrixOne 相关依赖环境的机器,另外一台作为跳板机,来搭建 Kubernetes 集群。

各个机器情况分布具体如下所示:

hostIPmemcpudiskrole
kuboardspray192.168.56.92G1C50G跳板机
master0192.168.56.104G2C50Gmaster etcd
node0192.168.56.114G2C50Gworker

跳板机部署 Kuboard Spray

Kuboard-Spray 是用来可视化部署 Kubernetes 集群的一个工具。它会使用 Docker 快速拉起一个能够可视化部署 Kubernetes 集群的 Web 应用。Kubernetes 集群环境部署完成后,可以将该 Docker 应用停掉。

跳板机环境准备

  • 安装 Docker

由于会使用到 Docker,因此需要具备 Docker 的环境。使用以下命令在跳板机安装并启动 Docker:

  1. sudo apt-get update && sudo apt-get install -y docker.io

环境准备完成后,即可部署 Kuboard-Spray。

部署 Kuboard-Spray

执行以下命令安装 Kuboard-Spray:

  1. docker run -d \
  2. --privileged \
  3. --restart=unless-stopped \
  4. --name=kuboard-spray \
  5. -p 80:80/tcp \
  6. -v /var/run/docker.sock:/var/run/docker.sock \
  7. -v ~/kuboard-spray-data:/data \
  8. eipwork/kuboard-spray:v1.2.2-amd64

如果由于网络问题导致镜像拉取失败,可以使用下面的备用地址:

  1. docker run -d \
  2. --privileged \
  3. --restart=unless-stopped \
  4. --name=kuboard-spray \
  5. -p 80:80/tcp \
  6. -v /var/run/docker.sock:/var/run/docker.sock \
  7. -v ~/kuboard-spray-data:/data \
  8. swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64

执行完成后,即可在浏览器输入 http://192.168.56.9 (跳板机 IP 地址)打开 Kuboard-Spray 的 Web 界面,输入用户名 admin,默认密码 Kuboard123,即可登录 Kuboard-Spray 界面,如下所示:

MatrixOne 分布式集群部署 - 图1

登录之后,即可开始部署 Kubernetes 集群。

可视化部署 Kubernetes 集群

登录 Kuboard-Spray 界面之后,即可开始可视化部署 Kubernetes 集群。

导入 Kubernetes 相关资源包

安装界面会通过在线下载的方式,下载 Kubernetes 集群所对应的资源包,以实现离线安装 Kubernetes 集群。

  1. 点击资源包管理,选择对应版本的 Kubernetes 资源包下载:

    下载 spray-v2.19.0c_Kubernetes-v1.24.10_v2.9-amd64 版本

    MatrixOne 分布式集群部署 - 图2

  2. 点击导入后,选择加载资源包,选择合适的下载源,等待资源包下载完成。

    MatrixOne 分布式集群部署 - 图3

  3. 此时会 pull 相关的镜像依赖:

    MatrixOne 分布式集群部署 - 图4

  4. 镜像资源包拉取成功后,返回 Kuboard-Spray 的 Web 界面,可以看到对应版本的资源包已经导入完成。

    MatrixOne 分布式集群部署 - 图5

安装 Kubernetes 集群

本章节将指导你进行 Kubernetes 集群的安装。

  1. 选择集群管理,选择添加集群安装计划

    MatrixOne 分布式集群部署 - 图6

  2. 在弹出的对话框中,定义集群的名称,选择刚刚导入的资源包的版本,再点击确定。如下图所示:

    MatrixOne 分布式集群部署 - 图7

集群规划

按照事先定义好的角色分类,Kubernetes 集群采用 1 master + 1 worker +1 etcd 的模式进行部署。

在上一步定义完成集群名称,并选择完成资源包版本,点击确定之后,接下里可以直接接入到集群规划阶段。

  1. 选择对应节点的角色和名称:

    MatrixOne 分布式集群部署 - 图8

    • master 节点:选择 ETCD 和控制节点;名称填写 master0
    • worker 节点:仅选择工作节点;名称填写 node0
  2. 在每一个节点填写完角色和节点名称后,请在右侧填写对应节点的连接信息,如下图所示:

    MatrixOne 分布式集群部署 - 图9

  3. 填写完所有的角色之后,点击保存。接下里就可以准备安装 Kubernetes 集群了。

开始安装 Kubernetes 集群

在上一步填写完成所有角色,并保存后,点击执行,即可开始 Kubernetes 集群的安装。

  1. 如下图所示,点击确定,开始安装 Kubernetes 集群:

    MatrixOne 分布式集群部署 - 图10

  2. 安装 Kubernetes 集群时,会在对应节点上执行 ansible 脚本,安装 Kubernetes 集群。整体事件会根据机器配置和网络不同,需要等待的时间不同,一般情况下需要 5 ~ 10 分钟。

    Note: 如果出现错误,你可以看日志的内容,确认是否是 Kuboard-Spray 的版本不匹配,如果版本不匹配,请更换合适的版本。

  3. 安装完成后,到 Kubernetes 集群的 master 节点上执行 kubectl get node

    MatrixOne 分布式集群部署 - 图11

  4. 命令结果如上图所示,即表示 Kubernetes 集群安装完成。

2. 部署 helm

Operator 的安装依赖于 helm,因此需要先安装 helm。

Note: 本章节均是在 master0 节点操作。

  1. 下载 helm 安装包:

    1. wget https://get.helm.sh/helm-v3.10.2-linux-amd64.tar.gz

    如果由于网络问题造成下载缓慢,你可以到官网下载最新的二进制安装包,上传到服务器。

  2. 解压并安装:

    1. tar -zxf helm-v3.10.2-linux-amd64.tar.gz
    2. mv linux-amd64/helm /usr/local/bin/helm
  3. 验证版本,查看是否安装完成:

    1. [root@k8s01 home]# helm version
    2. version.BuildInfo{Version:"v3.10.2", GitCommit:"50f003e5ee8704ec937a756c646870227d7c8b58", GitTreeState:"clean", GoVersion:"go1.18.8"}

    出现上面所示版本信息即表示安装完成。

3. CSI 部署

CSI 为 Kubernetes 的存储插件,为 MinIO 和 MarixOne 提供存储服务。本章节将指导你使用 local-path-provisioner 插件。

Note: 本章节均是在 master0 节点操作。

  1. 使用下面的命令行,安装 CSI:

    1. wget https://github.com/rancher/local-path-provisioner/archive/refs/tags/v0.0.23.zip
    2. unzip v0.0.23.zip
    3. cd local-path-provisioner-0.0.23/deploy/chart/local-path-provisioner
    4. helm install --set nodePathMap[0].paths[0]="/opt/local-path-provisioner",nodePathMap[0].node=DEFAULT_PATH_FOR_NON_LISTED_NODES --create-namespace --namespace local-path-storage local-path-storage ./
  2. 安装成功后,命令行显示如下所示:

    1. root@master0:~# kubectl get pod -n local-path-storage
    2. NAME READY STATUS RESTARTS AGE
    3. local-path-storage-local-path-provisioner-57bf67f7c-lcb88 1/1 Running 0 89s

    Note: 安装完成后,该 storageClass 会在 worker 节点的 “/opt/local-path-provisioner” 目录提供存储服务。你可以修改为其它路径。

  3. 设置缺省 storageClass

    1. kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
  4. 设置缺省成功后,命令行显示如下:

    1. root@master0:~# kubectl get storageclass
    2. NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
    3. local-path (default) cluster.local/local-path-storage-local-path-provisioner Delete WaitForFirstConsumer true 115s

4. MinIO 部署

MinIO 的作用是为 MatrixOne 提供对象存储。本章节将指导你部署一个单节点的 MinIO。

Note: 本章节均是在 master0 节点操作。

安装启动

  1. 安装并启动 MinIO 的命令行如下:

    1. helm repo add minio https://charts.min.io/
    2. helm install --create-namespace --namespace mostorage --set resources.requests.memory=512Mi --set replicas=1 --set persistence.size=10G --set mode=standalone --set rootUser=rootuser,rootPassword=rootpass123 --set consoleService.type=NodePort minio minio/minio

    Note

    • --set resources.requests.memory=512Mi 设置了 MinIO 的内存最低消耗
    • --set persistence.size=1G 设置了 MinIO 的存储大小为 1G
    • --set rootUser=rootuser,rootPassword=rootpass123 这里的 rootUser 和 rootPassword 设置的参数,在后续创建 Kubernetes 集群的 scrects 文件时,需要用到,因此使用一个能记住的信息。
  2. 安装并启动 MinIO 成功后,命令行显示如下所示:

    MatrixOne 分布式集群部署 - 图12

    然后,执行下面的命令行,使 mo-log 连接至 9000 端口:

    1. nohup kubectl port-forward --address 0.0.0.0 pod-name -n mostorage 9000:9000 &
  3. 启动后,使用 http:// Kubernetes 集群任何一台机器的 ip:32001 即可登录 MinIO 的页面,创建对象存储的信息。如下图所示,账户密码即上述步骤中 --set rootUser=rootuser,rootPassword=rootpass123 设置的 rootUser 和 rootPassword:

    MatrixOne 分布式集群部署 - 图13

  4. 登录完成后,你需要创建对象存储相关的信息:

    a. 点击 Bucket > Create Bucket,在 Bucket Name 中填写 Bucket 的名称 minio-mo。填写完成后,点击右下方按钮 Create Bucket

    MatrixOne 分布式集群部署 - 图14

    b. 在当前 minio-mo 中,点击 Choose or create a new path,在 New Folder Path 中填写名称 test,填写完成后,点击 Create,即完成创建。

    MatrixOne 分布式集群部署 - 图15

5. MatrixOne 集群部署

本章节将指导你部署 MatrixOne 集群。

Note: 本章节均是在 master0 节点操作。

安装 matrixone-operator

使用如下命令行安装 matrixone-operator:

  1. wget https://github.com/matrixorigin/matrixone-operator/releases/download/0.7.0-alpha.1/matrixone-operator-0.7.0-alpha.1.tgz
  2. tar -xvf matrixone-operator-0.7.0-alpha.1.tgz
  3. cd /root/matrixone-operator/
  4. helm install --create-namespace --namespace mo-hn matrixone-operator ./ --dependency-update

安装成功后,使用如下命令行进行再次确认:

  1. root@master0:~# kubectl get pod -n mo-hn
  2. NAME READY STATUS RESTARTS AGE
  3. matrixone-operator-66b896bbdd-qdfrp 1/1 Running 0 2m28s

如上上代码行所示,对应 Pod 状态均正常。

创建 MatrixOne 集群

自定义 MatrixOne 集群的 yaml 文件,示例如下:

  1. 编写如下 mo.yaml 的文件:

    1. apiVersion: core.matrixorigin.io/v1alpha1
    2. kind: MatrixOneCluster
    3. metadata:
    4. name: mo
    5. namespace: mo-hn
    6. spec:
    7. dn:
    8. config: |
    9. [dn.Txn.Storage]
    10. backend = "TAE"
    11. log-backend = "logservice"
    12. [dn.Ckp]
    13. flush-interval = "60s"
    14. min-count = 100
    15. scan-interval = "5s"
    16. incremental-interval = "60s"
    17. global-interval = "100000s"
    18. [log]
    19. level = "error"
    20. format = "json"
    21. max-size = 512
    22. replicas: 1
    23. logService:
    24. replicas: 3
    25. sharedStorage:
    26. s3:
    27. type: minio
    28. path: minio
    29. endpoint: http://minio.mostorage:9000
    30. secretRef:
    31. name: minio
    32. pvcRetentionPolicy: Retain
    33. volume:
    34. size: 1Gi
    35. config: |
    36. [log]
    37. level = "error"
    38. format = "json"
    39. max-size = 512
    40. tp:
    41. serviceType: NodePort
    42. config: |
    43. [cn.Engine]
    44. type = "distributed-tae"
    45. [log]
    46. level = "debug"
    47. format = "json"
    48. max-size = 512
    49. replicas: 1
    50. version: nightly-556de418
    51. imageRepository: matrixorigin/matrixone
    52. imagePullPolicy: Always
  2. 定义 MatrixOne 访问 MinIO 的 secret 服务:

    1. kubectl -n mo-hn create secret generic minio --from-literal=AWS_ACCESS_KEY_ID=rootuser --from-literal=AWS_SECRET_ACCESS_KEY=rootpass123

    用户名和密码使用创建 MinIO 集群时设定的 rootUser 和 rootPassword。

  3. 使用如下命令行部署 MatrixOne 集群:

    1. kubectl apply -f mo.yaml
  4. 需等待 10 来分钟,如发生 pod 重启,请继续等待。直到如下显示表示部署成功:

    1. root@k8s-master0:~# kubectl get pods -n mo-hn
    2. NAME READY STATUS RESTARTS AGE
    3. matrixone-operator-66b896bbdd-qdfrp 1/1 Running 1 (99m ago) 10h
    4. mo-dn-0 1/1 Running 0 46m
    5. mo-log-0 1/1 Running 0 47m
    6. mo-log-1 1/1 Running 0 47m
    7. mo-log-2 1/1 Running 0 47m
    8. mo-tp-cn-0 1/1 Running 1 (45m ago) 46m

6. 连接 Matrix0ne 集群

由于提供对外访问的 CN 的 pod id 不是 node ip,因此,你需要将对应服务的端口映射到 MatrixOne 节点上。本章节将指导你使用 kubectl port-forward 连接 MatrixOne 集群。

  • 只允许本地访问:
  1. nohup kubectl port-forward svc/mo-tp-cn 6001:6001 &
  • 指定某台机器或者所有机器访问:
  1. nohup kubectl port-forward --address 0.0.0.0 svc/mo-tp-cn 6001:6001 &

指定允许本地访问指定某台机器或者所有机器访问后,使用 MySQL 客户端连接 MatrixOne:

  1. mysql -h $(kubectl get svc/mo-tp-cn -n mo-hn -o jsonpath='{.spec.clusterIP}') -P 6001 -udump -p111
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 1004
  5. Server version: 638358 MatrixOne
  6. Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql>

显式 mysql> 后,分布式的 MatrixOne 集群搭建连接完成。