通过 Kubernetes 部署

作为云原生分布式架构的数据库产品,PolarDB-X 也支持 Kubernetes 集群部署,在 PolarDB-X Operator 的支持下实现完整的生命周期管理能力。 按照本文在 Kubernetes 环境部署 PolarDB-X 数据库之前,我们假设已满足以下前提条件:

  1. 已准备一组服务器,并且按照 系统与环境配置 完成了服务器参数配置与软件安装;
  2. 部署机(ops)可以访问互联网,或者您已经按 软件包下载 提前准备了相关的软件包及镜像。

准备工作

安装 Helm

PolarDB-X Operator 通过 Kubernetes 标准的包管理以及部署工具 Helm 进行部署,推荐选择 v3 以上版本。 如果您采用在线安装的方式(部署机可以访问互联网)则需要提前下载并安装 Helm。如果您采用离线安装的方式,因为离线安装包中自带 Helm 的二进制文件,可以跳过此步骤。 Helm 下载包是二进制形式,需要根据服务器 CPU 架构选择不同的下载包,例如 x86 架构:

wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/helm-v3.9.0-linux-amd64.tar.gz

解压后,复制 helm 文件到 /usr/local/bin 路径完成安装:

tar -zxvf helm-v3.9.0-linux-amd64.tar.gz -C $HOME/
sudo cp $HOME/linux-amd64/helm /usr/local/bin/helm

执行以下命令输出已安装的 Helm 版本:

helm version

安装 Docker

Kubernetes 使用 Docker 作为容器运行环境,因此需要先安装 Docker。另外,我们也推荐使用私有镜像仓库。您可以参考文档《安装 Docker 与镜像仓库》进行部署。

安装 Kubernetes

在安装 PolarDB-X Operator 之前,您需要先安装 Kubernetes 集群。您可以参考文档《安装 Kubernetes》进行部署。

安装 PolarDB-X Operator

目录映射

PolarDB-X 默认在以下目录存储数据,日志及备份文件,建议提前软链接到数据盘:

ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data /polarx/data-log /polarx/filestream "

ansible -i ${ini_file} all -m shell -a " ln -sf /polarx/data /data "
ansible -i ${ini_file} all -m shell -a " ln -sf /polarx/data-log /data-log "
ansible -i ${ini_file} all -m shell -a " ln -sf /polarx/filestream /filestream "

在线安装

如果部署机(ops)可以访问互联网,建议选择在线方式安装。

  1. 在 Helm 仓库中添加 PolarDB-X 相关网址:
helm repo add polardbx https://polardbx-charts.oss-cn-beijing.aliyuncs.com
  1. 检查已发布的 PolarDB-X Operator 版本:
helm search repo polardbx/polardbx-operator -l

推荐安装最新版本,例如:v1.6.0。

  1. 创建 polardbx-operator-system 命名空间:
kubectl create namespace polardbx-operator-system
  1. 用以下 Helm 命令安装 v1.6.0:
helm install --namespace polardbx-operator-system \
    --set node.volumes.data=/polarx/data --set imageRepo=registry:5000 \
    --set extension.config.images.store.galaxy.exporter=register:5000/mysqld-exporter:master \
    --version 1.6.0 \
    polardbx-operator polardbx/polardbx-operator
  1. 检查容器启动是否成功:
kc get pods -n polardbx-operator-system

当所有容器 Pod 进入 "Running" 状态,代表安装已完成。

离线安装

如果部署环境无法访问互联网,请参考《安装 Kubernetes》,下载对应架构的离线安装包,并将离线安装包拷贝到部署环境中的部署机(ops)上。该离线安装包会默认下载 PolarDB-X Operator的最新版本及其依赖的 Docker 镜像。

K8s 的离线安装包目录结构如下所示:

polardbx-install
|-- helm                                       # Helm 包目录
|   |-- bin
|   |   `-- helm                               # helm 的二进制文件,安装使用
|   |-- logger-values.yaml                     # logcollector 安装的values文件
|   |-- monitor-values.yaml                    # monitor 安装的values文件
|   |-- operator-values.yaml                   # operator 安装的values文件
|   |-- polardbx-logcollector-1.3.0.tgz        # logcollector helm 包
|   |-- polardbx-monitor-1.3.0.tgz             # monitor helm 包
|   `-- polardbx-operator-1.3.0.tgz            # operator helm 包
`-- images                                     # Docker 镜像目录
|   |-- image.list                             # 下载的 Docker 镜像列表
|   |-- image.manifest                         # 离线环境镜像清单,导入脚本参数
|   |-- load_image.sh                          # 离线环境导入镜像的脚本
    |-- polardbx-init-latest-arm64.tar.gz
    `-- xstore-tools-latest-arm64.tar.gz
    `-- ....
`-- install.sh                                 # 安装脚本
  1. 在部署环境的部署机(ops) 上执行如下命令,进入离线安装包目录,一键导入 Docker 镜像并安装PolarDB-X Operator及其相关组件。
cd polardbx-install
sh install.sh

上述 install.sh 脚本主要进行如下几项工作:

  • 导入 images 目录下的 Docker 镜像,推送到指定的私有仓库中。本文档以 registry:5000 为例进行说明。
  • 安装 helm 目录下的 helm 包,并通过对应的 values.yaml 文件将 PolarDB-X Operator中的镜像仓库修改为您指定的私有镜像仓库地址。

  • 检查容器启动是否成功:

kubectl get pods -n polardbx-operator-system

当所有容器 Pod 进入 "Running" 状态,代表安装已完成。

部署 PolarDB-X

规划集群拓扑

PolarDB-X 数据库集群由计算节点(CN),存储节点(DN),元数据服务(GMS)以及日志节点(CDC)组成。生产场景的最小部署规模为 3 台服务器,典型数据库集群包含 2 个以上的计算节点,2 组以上的存储节点,1 组元数据节点,以及作为可选功能的 1 组日志节点。 其中,存储节点(DN)、元数据服务(GMS)通过 X-Paxos 协议实现高可用,因此同一组存储节点或元数据服务由 3 个独立的副本容器实例组成,需要分开部署在不同服务器上。 根据服务器型号/数量的不同,规划 PolarDB-X 集群拓扑的主要原则是:

  • 由于对计算与 I/O 能力的不同要求,我们建议计算节点(CN)与存储节点(DN)分别在两组不同的服务器上部署。
  • 选择 I/O 能力较优、磁盘空间较大的服务器部署存储节点(DN); I/O 能力较弱,而 CPU 能力较优的服务器部署计算节点(CN)。
  • 如果单台服务器的 CPU 数量小于 16,建议部署一个计算节点(CN),否则建议部署多个计算节点。
  • 所有计算节点(CN)应该分配相同的服务器资源,防止集群出现“短板效应”:资源最少的节点成为性能瓶颈。所有存储节点(DN)除 log 副本外也应该遵循相同的原则。
  • 同一组存储节点的三个副本应该在三台服务器上分离部署,不同存储节点的三副本可以在同一台服务器上混合部署,保证集群高可用的同时,最大化利用服务器性能。
  • 元数据服务(GMS)存储集群的元数据,它的三个副本应该在三台服务器分别部署,保证高可用。

下面是一份按照上述原则规划的集群拓扑:

服务器 服务器规格 节点 容器限制 容器数量
192.168.1.102 16c64G CN1 16c32G 1
192.168.1.103 16c64G CN2 16c32G 1
192.168.1.104 16c64G CN3 16c32G 1
192.168.1.105 16c128G DN1-1(leader) 16c50G 4
DN2-3(log) -
DN3-2(follower) 16c50G
GMS-1 8c16G
192.168.1.106 16c128G DN1-2(follower) 16c50G 4
DN2-1(leader) 16c50G
DN3-3(log) -
GMS-2 8c16G
192.168.1.107 16c128G DN1-3(log) - 4
DN2-2(follower) 16c50G
DN3-1(leader) 16c50G
GMS-3 2c4G

备注:DN 的 log 节点默认内存限制为 4G,因为 log 只记录日志,需要使用的内存与 CPU 很少,推荐是2c4g

标记集群节点

按照上述拓扑规划,需要将 Kubernetes 集群节点标记成两组,一组用于部署 CN,另一组部署 DN。 首先显示节点名称:

kubectl get nodes -o wide

输出结果示例:

NAME              STATUS   ROLES                  AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
pxc-server-02     Ready    <none>                 4d23h   v1.21.0   192.168.1.2    <none>        CentOS Linux 7 (Core)   3.10.0-1160.81.1.el7.x86_64   docker://19.3.15
pxc-server-03     Ready    <none>                 4d23h   v1.21.0   192.168.1.3    <none>        CentOS Linux 7 (Core)   3.10.0-1160.81.1.el7.x86_64   docker://19.3.15
pxc-server-04     Ready    <none>                 4d23h   v1.21.0   192.168.1.4    <none>        CentOS Linux 7 (Core)   3.10.0-1160.81.1.el7.x86_64   docker://19.3.15
pxc-server-05     Ready    <none>                 4d23h   v1.21.0   192.168.1.5    <none>        CentOS Linux 7 (Core)   3.10.0-1160.81.1.el7.x86_64   docker://19.3.15
pxc-server-06     Ready    control-plane,master   4d23h   v1.21.0   192.168.1.6    <none>        CentOS Linux 7 (Core)   3.10.0-1160.81.1.el7.x86_64   docker://19.3.15
pxc-server-07     Ready    <none>                 4d23h   v1.21.0   192.168.1.7    <none>        CentOS Linux 7 (Core)   3.10.0-1160.81.1.el7.x86_64   docker://19.3.15

标记指定名称的集群节点:

# 标记指定名称的节点部署 CN
kubectl label node pxc-server-02 pxc-server-03 pxc-server-04 polardbx/node=cn

# 标记指定名称的节点部署 DN
kubectl label node pxc-server-05 pxc-server-06 pxc-server-07 polardbx/node=dn

用 Ansible 工具可以更为快捷的完成这一任务:

# 批量标记 CN 节点
ansible -i ${ini_file} cn -m shell -a " kubectl label node \`hostname\` polardbx/node=cn "

# 批量标记 DN 节点
ansible -i ${ini_file} dn -m shell -a " kubectl label node \`hostname\` polardbx/node=dn "

如果集群节点较少,可以执行以下命令设置 Kubernetes 主节点(master)允许调度:

kubectl taint node -l node-role.kubernetes.io/master node-role.kubernetes.io/master-

准备拓扑配置

首先执行如下命令获取 PolarDB-X 各个组件的最新镜像版本(需要填入YAML文件):

curl -s "https://polardbx-opensource.oss-cn-hangzhou.aliyuncs.com/scripts/get-version.sh" | sh

输出内容如下所示(以 PolarDB-X V2.4.0 版本为例):

CN polardbx/polardbx-sql:v2.4.0_5.4.19
DN polardbx/polardbx-engine:v2.4.0_8.4.19
CDC polardbx/polardbx-cdc:v2.4.0_5.4.19

按照拓扑规划,编写如下的 YAML 配置文件,并更新对应组件的image tag:

vi polarx_lite.yaml

配置文件内容:

apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
  name: pxc-product
spec:  
  # PolarDB-X 初始账号密码
  privileges:
  - username: admin
    password: "123456"
    type: SUPER

  # 参数模板,采用生产配置(kubectl get pxpt 查看当前namespace 的参数模板)
  parameterTemplate:
    name: product-80

  # PolarDB-X 集群配置
  config:
    # CN 相关配置
    cn:
      # 静态配置
      static:
        # 使用新 RPC 协议
        RPCProtocolVersion: 2
  # PolarDB-X 集群拓扑
  topology:
    # 集群部署规则
    rules:
      # 预定义节点选择器
      selectors:
      - name: node-cn
        nodeSelector:
          nodeSelectorTerms:
          - matchExpressions:
            - key: polardbx/node
              operator: In
              values: 
              - cn
      - name: node-dn
        nodeSelector:
          nodeSelectorTerms:
          - matchExpressions:
            - key: polardbx/node
              operator: In
              values: 
              - dn

      components:
        # DN 部署规则
        dn:
          nodeSets:
          - name: cands
            role: Candidate
            replicas: 2
            selector:
              reference: node-dn
          - name: log
            role: Voter
            replicas: 1
            selector:
              reference: node-dn

        # CN 部署规则
        cn:
        - name: cn
          selector:
            reference: node-cn
    nodes:
      # GMS 规格配置
      gms:
        template:
          # 存储节点镜像
          image: registry:5000/polardbx-engine:v2.4.0_8.4.19
          # 使用宿主机网络
          hostNetwork: true
          # gms 的资源规格
          resources:
            requests:
              cpu: 4
              memory: 16Gi
            limits:
              cpu: 16
              memory: 16Gi

      # DN 规格配置
      dn:
        # DN 数量配置
        replicas: 3
        template:
          image: registry:5000/polardbx-engine:v2.4.0_8.4.19
          # 使用宿主机网络
          hostNetwork: true
          # dn 的资源规格
          resources:
            requests:
              cpu: 8
              memory: 50Gi
            limits:
              cpu: 16
              memory: 50Gi

      # CN 规格配置
      cn:
        # CN 数量配置
        replicas: 3
        template:
          image: registry:5000/polardbx-sql:v2.4.0_5.4.19
          # 使用宿主机网络
          hostNetwork: true
          resources:
            requests:
              cpu: 8
              memory: 64Gi
            limits:
              cpu: 16
              memory: 64Gi

检查参数模板

PolarDB-X Operator 默认会在 polardbx-operator-system 命名空间下创建一个名为 product 的参数模板。如果您的 PolarDB-X 集群如上述yaml所示,创建在default 命名空间下,需要执行如下命令将 product 参数模板拷贝到 default 命名空间。

kubectl get pxpt product-80 -n polardbx-operator-system -o json | jq '.metadata.namespace = "default"' | kubectl apply -f  -

注意:上述命令需要安装 jq 工具

部署数据库

运行以下命令在 Kubernetes 集群部署 PolarDB-X 数据库:

kubectl create -f polarx_lite.yaml

检查容器 Pod 状态,直到所有容器显示 "Running":

kubectl get pods

用以下命令确认 PolarDB-X 数据库状态:

kubectl get pxc pxc-product

访问数据库

当 PolarDB-X 数据库部署完成后, 用以下命令查询 Cluster-IP 地址:

kubectl get svc pxc-product

输出结果示例:

NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
pxc-product   ClusterIP   10.110.125.95   <none>        3306/TCP,8081/TCP   122m

在 Kubernetes 集群内,使用 CLUSTER-IP 以及拓扑 Yaml 配置中指定的用户名/密码访问数据库:

mysql -h 10.103.174.164 -P3306 -u admin -p123456 -Ac

连接成功后,可以执行以下 SQL 显示存储节点信息:

MySQL [(none)]> show storage;

输出结果示例:

+--------------------+---------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| STORAGE_INST_ID    | LEADER_NODE         | IS_HEALTHY | INST_KIND | DB_COUNT | GROUP_COUNT | STATUS | DELETABLE | DELAY | ACTIVE |
+--------------------+---------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| pxc-product-dn-0   | 192.168.1.105:15420 | true       | MASTER    | 5        | 21          | 0      | false     | null  | null   |
| pxc-product-dn-1   | 192.168.1.106:17907 | true       | MASTER    | 5        | 19          | 0      | true      | null  | null   |
| pxc-product-dn-2   | 192.168.1.107:16308 | true       | MASTER    | 5        | 19          | 0      | true      | null  | null   |
| pxc-product-gms    | 192.168.1.105:17296 | true       | META_DB   | 2        | 2           | 0      | false     | null  | null   |
+--------------------+---------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
4 rows in set (0.01 sec)

部署后任务

切换访问方式

在 Kubernetes 集群内,PolarDB-X 数据库通常使用 Cluster-IP 方式提供服务。但是在 Kubernetes 集群外部的服务器无法访问 Cluster-IP,这时需要调整 PolarDB-X 配置,使用 NodePort 方式提供服务。 运行以下命令:

kubectl edit svc pxc-product

进入 Yaml 编辑模式,修改子项 spec: type: ClusterIP 内容为 NodePort,保存退出编辑:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2023-03-20T08:25:53Z"
  labels:
    polardbx/cn-type: rw
    polardbx/name: pxc-product
    polardbx/rand: brgs
    polardbx/role: cn
  name: pxc-product
  namespace: default
  ownerReferences:
  - apiVersion: polardbx.aliyun.com/v1
    blockOwnerDeletion: true
    controller: true
    kind: PolarDBXCluster
    name: pxc-product
    uid: fe377807-928a-45a2-990d-756181d0e655
  resourceVersion: "2928246"
  uid: fcd423d2-27c7-4319-8840-eaf0ca1308a0
spec:
  clusterIP: 10.110.125.95
  clusterIPs:
  - 10.110.125.95
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: mysql
    port: 3306
    protocol: TCP
    targetPort: mysql
  - name: metrics
    port: 8081
    protocol: TCP
    targetPort: metrics
  selector:
    polardbx/cn-type: rw
    polardbx/name: pxc-product
    polardbx/rand: brgs
    polardbx/role: cn
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

检查 PolarDB-X 数据库服务地址:

kubectl get svc pxc-product

输出结果示例:

NAME          TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                         AGE
pxc-product   NodePort   10.110.125.95  <none>        3306:31504/TCP,8081:30975/TCP   86m

现在从 Kubernetes 集群外部,我们可以通过任意一台 Kubernetes 服务器的 IP 地址与 31504 端口,访问 PolarDB-X 数据库:

mysql -h 192.168.1.105 -P31504 -u admin -p123456 -Ac

results matching ""

    No results matching ""