通过 Kubernetes 部署
作为云原生分布式架构的数据库产品,PolarDB-X 也支持 Kubernetes 集群部署,在 PolarDB-X Operator 的支持下实现完整的生命周期管理能力。 按照本文在 Kubernetes 环境部署 PolarDB-X 数据库之前,我们假设已满足以下前提条件:
准备工作
安装 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)可以访问互联网,建议选择在线方式安装。
- 在 Helm 仓库中添加 PolarDB-X 相关网址:
helm repo add polardbx https://polardbx-charts.oss-cn-beijing.aliyuncs.com
- 检查已发布的 PolarDB-X Operator 版本:
helm search repo polardbx/polardbx-operator -l
推荐安装最新版本,例如:v1.6.2。
- 创建 polardbx-operator-system 命名空间:
kubectl create namespace polardbx-operator-system
- 用以下 Helm 命令安装 v1.6.2:
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.2 \
polardbx-operator polardbx/polardbx-operator
- 检查容器启动是否成功:
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 # 安装脚本
- 在部署环境的部署机(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