绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
在 Kubernetes 上部署 RadonDB MySQL 集群
2022-01-06 16:25:56

简介

RadonDB MySQL 是基于 MySQL 的开源、高可用、云原生集群解决方案。通过使用 Raft 协议,RadonDB MySQL 可以快速进行故障转移,且不会丢失任何事务。

本教程演示如何使用命令行在 Kubernetes 上部署 RadonDB MySQL。

部署准备

  • 已成功部署 Kubernetes 集群。

部署步骤

通过 Git 部署

步骤 1:克隆 RadonDB MySQL Chart

执行如下命令,将 RadonDB MySQL Chart 克隆到 Kubernetes 中。

git clone https://github.com/radondb/radondb-mysql-kubernetes.git

Chart 代表 Helm 包,包含在 Kubernetes 集群内部运行应用程序、工具或服务所需的所有资源定义。

步骤 2:部署

在 radondb-mysql-kubernetes 目录路径下,选择如下方式,部署 release 实例。

release 是运行在 Kubernetes 集群中的 Chart 的实例。通过命令方式部署,需指定 release 名称。

以下命令指定 release 名为 demo,将创建一个名为 demo-radondb-mysql 的有状态副本集。

  • 默认部署方式
<For Helm v2>
cd charts
helm install . --name demo

<For Helm v3>
cd charts
helm install demo .
  • 指定参数部署方式

在 helm install 时使用 --set key=value[,key=value] ,可指定参数部署。


以下示例以创建一个用户名为 my-user ,密码为 my-password 的标准数据库用户,可访问名为 my-database 的数据库。

cd charts
helm install demo \
--set mysql.mysqlUser=my-user,mysql.mysqlPassword=my-password,mysql.database=my-database .
  • 配置 yaml 参数方式

执行如下命令,可通过 value.yaml 配置文件,在安装时配置指定参数。更多安装过程中可配置的参数,请参考 配置 。

cd charts
helm install demo -f values.yaml .

通过 repo 部署

步骤 1 : 添加仓库

添加并更新 helm 仓库。

$ helm repo add test https://charts.kubesphere.io/test
$ helm repo update

步骤 2 : 部署

以下命令指定 release 名为 demo,将创建一个名为 demo-radondb-mysql 的有状态副本集。

$ helm install demo test/radondb-mysql
NAME: demo
LAST DEPLOYED: Wed Apr 28 08:08:15 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The cluster is comprised of 3 pods: 1 leader and 2 followers. Each instance is accessible within the cluster through:

    <pod-name>.demo-radondb-mysql

To connect to your database:

1. Get mysql user `qingcloud`s password:

    kubectl get secret -n default demo-radondb-mysql -o jsonpath="{.data.mysql-password}" | base64 --decode; echo

2. Run an Ubuntu pod that you can use as a client:

    kubectl run ubuntu -n default --image=ubuntu:focal -it --rm --restart='Never' -- bash -il

3. Install the mysql client:

    apt-get update && apt-get install mysql-client -y

4. To connect to leader service in the Ubuntu pod:

    mysql -h demo-radondb-mysql-leader -u qingcloud -p

5. To connect to follower service (read-only) in the Ubuntu pod:

    mysql -h demo-radondb-mysql-follower -u qingcloud -p

分别执行如下指令,查看到 release 名为 demo 的有状态副本集 demo-radondb-mysql,则 RadonDB MySQL 部署成功。

$ helm list
NAME        NAMESPACE REVISION UPDATED                                 STATUS   CHART               APP VERSION
demo        default   1        2021-04-28 08:08:15.828384203 +0000 UTC deployed radondb-mysql-1.0.0 5.7.33   

$ kubectl get statefulset
NAME                 READY   AGE
demo-radondb-mysql   3/3     25h

部署校验

部署指令执行完成后,查看 RadonDB MySQL 有状态副本集,pod 状态及服务。可查看到相关信息,则 RadonDB MySQL 部署成功。

kubectl get statefulset,pod,svc

连接 RadonDB MySQL

您需要准备一个用于连接 RadonDB MySQL 的客户端。

客户端与 RadonDB MySQL 在同一 NameSpace 中

当客户端与 RadonDB MySQL 集群在同一个 NameSpace 中时,可使用 leader/follower service 名称代替具体的 ip 和端口。

  • 连接主节点(读写节点)。
mysql -h <leader service 名称> -u <用户名> -p
  • 连接从节点(只读节点)。
mysql -h <follower service 名称> -u <用户名> -p

客户端与 RadonDB MySQL 不在同一 NameSpace 中

当客户端与 RadonDB MySQL 集群不在同一个 NameSpace 中时,需先分别获取连接所需的节点地址、节点端口、服务名称。

  1. 查询 pod 列表和服务列表,分别获取 pod 名称和服务名称。
kubectl get pod,svc
  1. 开启服务网络访问。

执行如下命令,打开服务配置文件,将 spec 下 type 参数设置为 NodePort

kubectl edit svc <服务名称>
  1. 分别获取 pod 所在的节点地址和节点端口。
kubectl describe pod <pod名称>
kubectl describe svc <服务名称>
  1. 连接节点。
mysql -p <节点地址> -u <用户名> -P <节点端口> -p

说明:使用外网主机连接可能会出现 SSL connection error,需要加上 --ssl-mode=DISABLE 参数,关闭 SSL。

配置

下表列出了 RadonDB MySQL Chart 的配置参数及对应的默认值。

参数描述默认值
imagePullPolicy镜像拉取策略IfNotPresent
fullnameOverride自定义全名覆盖
nameOverride自定义名称覆盖
replicaCountPod 数目3
busybox.imagebusybox 镜像库地址busybox
busybox.tagbusybox 镜像标签1.32
mysql.imagemysql 镜像库地址xenondb/percona
mysql.tagmysql 镜像标签5.7.33
mysql.allowEmptyRootPassword如果为 true,允许 root 账号密码为空true
mysql.mysqlRootPasswordroot 用户密码
mysql.mysqlReplicationPasswordqc_repl 用户密码Repl_123, 如果没有设置则随机12个字符
mysql.mysqlUser新建用户的用户名qingcloud
mysql.mysqlPassword新建用户的密码Qing@123, 如果没有设置则随机12个字符
mysql.mysqlDatabase将要创建的数据库名qingcloud
mysql.initTokudb安装 tokudb 引擎false
mysql.args要传递到 mysql 容器的其他参数[]
mysql.configFiles.node.cnfMysql 配置文件详见 values.yaml
mysql.livenessProbe.initialDelaySecondsPod 启动后进行存活检查的等待时间30
mysql.livenessProbe.periodSeconds存活检查的间隔时间10
mysql.livenessProbe.timeoutSeconds存活探针执行检测请求后,等待响应的超时时间5
mysql.livenessProbe.successThreshold存活探针检测失败后认为成功的小连接成功次数1
mysql.livenessProbe.failureThreshold存活探测失败的重试次数,重试一定次数后将认为容器不健康3
mysql.readinessProbe.initialDelaySecondsPod 启动后进行就绪检查的等待时间10
mysql.readinessProbe.periodSeconds就绪检查的间隔时间10
mysql.readinessProbe.timeoutSeconds就绪探针执行检测请求后,等待响应的超时时间1
mysql.readinessProbe.successThreshold就绪探针检测失败后认为成功的小连接成功次数1
mysql.readinessProbe.failureThreshold就绪探测失败的重试次数,重试一定次数后将认为容器未就绪3
mysql.extraEnvVars其他作为字符串传递给 tpl 函数的环境变量
mysql.resourcesMySQL 的资源请求/限制内存: 256Mi, CPU: 100m
xenon.imagexenon 镜像库地址xenondb/xenon
xenon.tagxenon 镜像标签1.1.5-alpha
xenon.args要传递到 xenon 容器的其他参数[]
xenon.extraEnvVars其他作为字符串传递给 tpl 函数的环境变量
xenon.livenessProbe.initialDelaySecondsPod 启动后进行存活检查的等待时间30
xenon.livenessProbe.periodSeconds存活检查的间隔时间10
xenon.livenessProbe.timeoutSeconds存活探针执行检测请求后,等待响应的超时时间5
xenon.livenessProbe.successThreshold存活探针检测失败后认为成功的小连接成功次数1
xenon.livenessProbe.failureThreshold存活探测失败的重试次数,重试一定次数后将认为容器不健康3
xenon.readinessProbe.initialDelaySecondsPod 启动后进行就绪检查的等待时间10
xenon.readinessProbe.periodSeconds就绪检查的间隔时间10
xenon.readinessProbe.timeoutSeconds就绪探针执行检测请求后,等待响应的超时时间1
xenon.readinessProbe.successThreshold就绪探针检测失败后认为成功的小连接成功次数1
xenon.readinessProbe.failureThreshold就绪探测失败的重试次数,重试一定次数后将认为容器未就绪3
xenon.resourcesxenon 的资源请求/限制内存: 128Mi, CPU: 50m
metrics.enabled以 side-car 模式开启 Prometheus Exportertrue
metrics.imageExporter 镜像地址prom/mysqld-exporter
metrics.tagExporter 标签v0.12.1
metrics.annotationsExporter 注释{}
metrics.livenessProbe.initialDelaySecondsPod 启动后进行存活检查的等待时间15
metrics.livenessProbe.timeoutSeconds存活探针执行检测请求后,等待响应的超时时间5
metrics.readinessProbe.initialDelaySecondsPod 启动后进行就绪检查的等待时间5
metrics.readinessProbe.timeoutSeconds就绪探针执行检测请求后,等待响应的超时时间1
metrics.serviceMonitor.enabled若设置为 true, 将为 Prometheus operator 创建 ServiceMonitortrue
metrics.serviceMonitor.namespace创建 ServiceMonitor 时,可指定命名空间nil
metrics.serviceMonitor.interval数据采集间隔,若未指定,将使用 Prometheus 默认设置10s
metrics.serviceMonitor.scrapeTimeout数据采集超时时间,若未指定,将使用 Prometheus 默认设置nil
metrics.serviceMonitor.selector默认为 kube-prometheus{ prometheus: kube-prometheus }
slowLogTail若设置为 true,将启动一个容器用来查看 mysql-slow.logtrue
resources资源 请求/限制内存: 32Mi, CPU: 10m
service.annotationsKubernetes 服务注释{}
service.typeKubernetes 服务类型NodePort
service.loadBalancerIP服务负载均衡器 IP""
service.nodePort服务节点端口""
service.clusterIP服务集群 IP""
service.port服务端口3306
rbac.create若为 true,将创建和使用 RBAC 资源true
serviceAccount.create指定是否创建 ServiceAccounttrue
serviceAccount.nameServiceAccount 的名称
persistence.enabled创建一个卷存储数据true
persistence.sizePVC 容量10Gi
persistence.storageClassPVC 类型nil
persistence.accessMode访问模式ReadWriteOnce
persistence.annotationsPV 注解{}
priorityClassName设置 Pod 的 priorityClassName{}
schedulerNameKubernetes scheduler 名称(不包括默认)nil
statefulsetAnnotationsStatefulSet 注释{}
podAnnotationsPod 注释 map{}
podLabelsPod 标签 map{}

持久化

MySQL 镜像在容器路径 /var/lib/mysql 中存储 MYSQL 数据和配置。

默认情况下,会创建一个 PersistentVolumeClaim 并将其挂载到指定目录中。 若想禁用此功能,您可以更改 values.yaml禁用持久化,改用 emptyDir。

“当 Pod 分配给节点时,将首先创建一个 emptyDir 卷,只要该 Pod 在该节点上运行,该卷便存在。 当 Pod 从节点中删除时,emptyDir 中的数据将被删除.”

注意:PersistentVolumeClaim 中可以使用不同特性的 PersistentVolume,其 IO 性能会影响数据库的初始化性能。所以当使用 PersistentVolumeClaim 启用持久化存储时,可能需要调整 livenessProbe.initialDelaySeconds 的值。数据库初始化的默认限制是60秒 (livenessProbe.initialDelaySeconds + livenessProbe.periodSeconds * livenessProbe.failureThreshold)。如果初始化时间超过限制,kubelet将重启数据库容器,数据库初始化被中断,会导致持久数据不可用。

自定义 MYSQL 配置

在 mysql.configFiles 中添加/更改 MySQL 配置。

configFiles:
 node.cnf: |
  [mysqld]
  default_storage_engine=InnoDB
  max_connections=65535

  # custom mysql configuration.
  expire_logs_days=7
分享好友

分享这个小栈给你的朋友们,一起进步吧。

RadonDB
创建时间:2022-01-06 15:34:19
RadonDB
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • gaokeke123
    专家
戳我,来吐槽~