介绍 #
DBPlusEngine-Mate 是为 DBPlusEngine-Proxy 打造的注册中心,可以帮助用户以更加云原生的方式管理 DBPlusEngine-Proxy,易运维同时也节约资源,为 SRE 和 DBA 提供符合操作的体验。
特性 #
目前 Mate 支持以下特性
- 支持高可用
目前的 Mate 使用主备模式支持高可用架构。
- 支持订阅事件
Mate 使用类似 Zookeeper 的 ZNode 结构存储数据,DBPlusEngine-Proxy 通过和 Mate 建立双向 GRPC 流交互,并订阅相关路径的事件。当有事件产生时,Mate 将会给所有订阅者发送事件。
- 支持多种后端数据持久化
Mate 支持使用 kubernettes 的 ConfigMap,对象存储,MySQL,PostgreSQL 进行数据持久化。
- 支持不同的部署方式
Mate 支持在虚拟机和 kubernetes 中部署。
架构 #
Mate 架构 #
- 工作原理 Mate 在启动的时候会向 backend 中的固定位置写入值,根据 “先到先得” 原则,先写成功的 Mate 会成为主节点提供服务,同时 Mate 也会周期性的更新信息。
Proxy 连接 Mate架构图 #
- 工作原理 DBPlusEngine-Proxy 启动时,会通过 Mate 的接口获取当前的主节点信息,根据获取到的主节点信息访问 Mate 的服务接口,如果获取不到,会周期性的一直获取主节点,直到获取到为止。
部署 #
虚拟机中部署 #
说明:
- DBPlusEngine-Prxoy 会通过内网 LB 地址获取到所有 Mate 实例的信息,然后通过返回的信息拼接 Mate Leader 的 RPC 地址,最终和 RPC 地址建立连接。
- DBPlusEngine-Proxy 所在的主机 IP 需要与 Mate 所在的主机 IP 互通。
- 如果在私有化环境下不能创建 LB, 可使用以下方案: a. 部署 keepalived + vip b. 将 DBPlusEngine-Proxy 的配置文件 server.yaml 中的 server-lists 配置项更改为 机器1 ip:9090, 机器2 ip:9090 , 如以下
copy...
mode:
type: Cluster
repository:
type: ZooKeeper
props:
namespace: governance_ds
server-lists: 192.168.0.1:9090,192.168.0.2:9090
...
安装 #
copysudo rpm -ivh sphereex-mate*.rpm
说明:RPM 包会创建以下文件
文件 | 描述 |
---|---|
/etc/sphereex-mate/mate.conf | Mate 的配置文件,主要包含启动时的命令行参数 |
/usr/lib/systemd/system/sphereex-mate.service | Mate 的服务配置文件,由 systemd 管理 |
/usr/local/sphereex-mate/mate | Mate 的可执行文件 |
/usr/local/sphereex-mate/mate-cli | Mate 的运维工具,主要用于对当前 Mate 存储的 key 的 操作 |
前置步骤
- 安装完 Mate RPM 包后,需要执行如下命令使 Mate 服务生效
copysystemctl daemon-reload #只需运行一次
- 在启动 Mate 之前需要按实际情况修改 /etc/sphereex-mate/mate.conf 配置文件。 如使用 MySQL 数据库选举 leader 并作为 Mate 持久化数据的存储的配置如下:
copyARGS="-db-leader \
-mysql-backend \
-db-host=127.0.0.1 \
-db-port=13306 \
-db-user=root \
-db-password=123456 \
启动 #
copysudo systemctl start sphereex-mate
- Mate 默认会启动如下端口
端口 | 描述 |
---|---|
21510 | Mate GRPC 服务端口,DBPlusEngine-Proxy 会最终与此端口通信 |
21511 | Mate GRPC-Web 端口,为预留端口 |
9090 | Mate metrics 端口, DBPlusEngine-Proxy 会通过此端口获取 Mate 的实例信息 |
- 查看状态
copysudo systemctl status sphereex-mate
- 关闭
copysudo systemctl stop sphereex-mate
- 卸载
copysudo rpm -e sphereex-mate
- 配置 DBPlusEngine-Proxy
DBPlusEngine-Proxy 使用 Mate 需要做如下配置:
copy...
mode:
type: Cluster
repository:
type: SphereEx:MATE
props:
namespace: governance_ds
server-lists: ${LB IP}:9090
将 ${LB IP} 替换为实际LB 的 IP 地址。
- 参数列表
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
-grpc-addr | 字符串 | :21510 | GRPC 服务监听地址 |
-grpc-web-addr | 字符串 | :21511 | GRPC Web 服务监听地址 |
-metrics-addr | 字符串 | :9090 | 指标服务监听地址,DBPlusEngine-Proxy 会使用该地址获取当前正在运行的 Mate leader 信息 |
-kube-leader | 布尔值 | false | 是否通过 kubernetes 选举 leader |
-obs-leader | 布尔值 | false | 是否通过对象存储选举 leader |
-db-leader | 布尔值 | false | 是否通过数据库选举 leader |
-kube-backend | 布尔值 | false | 是否使用 kubernetes 中的 configmap 持久化数据 |
-obs-backend | 布尔值 | false | 是否使用对象存储持久化数据 |
-pg-backend | 布尔值 | false | 是否使用 PostgreSQL 持久化数据 |
-mysql-backend | 布尔值 | false | 是否使用 MySQL 持久化数据 |
-null-backend | 布尔值 | false | 是否数据只保留到内存,此参数没有实际意义,仅在测试中使用 |
-rate | 整数 | 0 | 限制 GRPC 服务中一元 GRPC 方法的速率,默认为 0,代表不限制 |
-kube-backend-name | 字符串 | mate-backend | 数据持久化到 kubernetes 中 configmap 的名称 |
-obs-access-key | 字符串 | "" | 指定连接对象存储的 access-key |
-obs-secret-key | 字符串 | "" | 指定连接对象存储的 secret-key |
-obs-endpoint | 字符串 | "" | 指定连接对象存储的地址 |
-obs-region | 字符串 | "" | 指定对象存储中 bucket 所在的区域,可以不填 |
-obs-bucket | 字符串 | "" | 指定对象存储中使用的 bucket |
-obs-ssl | 布尔值 | false | 连接对象存储时是否启用 ssl |
-db-host | 字符串 | "" | 指定数据库地址 |
-db-port | 字符串 | "" | 指定数据库端口 |
-db-user | 字符串 | "" | 指定连接数据库的用户名 |
-db-password | 字符串 | "" | 指定连接数据库的密码 |
-db-dbname | 字符串 | "" | 指定连接的数据库名称 |
-zap-log-level | 字符串 | info | 日志级别,可以是 ‘debug’, ‘info’, ’error’ |
Kubernetes 中部署 #
DBPlusEngine-Proxy 会通过 Service 地址获取到所有 Mate 实例的信息,然后通过返回的信息拼接 Mate Leader 的 RPC 地址,最终和 RPC 地址建立连接。 说明
- DBPlusEngine-Proxy 会通过 Service 获取到所有 Mate POD 的信息,然后通过返回的信息拼接 Mate Leader 的 RPC 地址,最终和 RPC 地址建立连接。
- DBPlusEngine-Proxy 的 POD IP 需要与 Mate 的 POD IP 互通
安装 #
前置步骤
- 在安装 Mate 之前需要按实际情况修改 Chart 的 values.yaml 文件。 如使用 kubernetes 选举 leader, s3 作为 Mate 持久化数据的存储的配置如下:
copy...
kubeLeader:
## @param kubeLeader.enabled 是否启用在 kubernetes 中使用 Lease 选举主节点
enabled: true
nullBackend:
## @param nullBackend.enabled 是否设置为使用内存模式, 此模式只为测试使用
enabled: false
kubeBackend:
## @param kubeBackend.enabled 是否启用 kubeBackend, 数据持久化到 kubernetes 的 configmap
enabled: false
## @param kubeBackend.backendName configmap 的名称
backendName: "mate-backend"
obsBackend:
## @param obsBackend.enabled 是否启用 obsBackend,数据持久化到对象存储
enabled: true
## @param obsBackend.accessKey 对象存储的认证 access key
accessKey: "AKIAXRZPPZNGWHZDZX1Z"
## @param obsBackend.secretKey 对象存储的认证 secret key
secretKey: "1Reu8cOyTLl57jccjLMSTh5qFOH3Rayx0R2UWCUd"
## @param obsBackend.endpoint 对象存储的地址
endpoint: "s3.amazonaws.com"
## @param obsBackend.bucket 对象存储中 bucket 的名称
bucket: "mate-test-chaos"
## @param obsBackend.region 对象存储中 bucket 的区域
region: ""
## @param obsBackend.useSSL 访问对象存储是否启用 ssl
useSSL: true
...
运行以下命令安装
copyhelm install release-name dbplusengine-mate [-n namespace]
将创建如下资源
资源 | 描述 |
---|---|
deployment | Mate 的 deployment,默认副本数为 2 |
service | Mate 的 service,默认暴露 21510, 9090 端口 |
secret | 如果 imagePullAccount.enabled,将创建 |
配置 DBPlusEngine-Proxy DBPlusEngine-Proxy 使用 Mate 需要做如下配置:
copy...
mode:
type: Cluster
repository:
type: SphereEx:MATE
props:
namespace: governance_ds
server-lists: ${Service Name}:9090
将 ${Service Name} 替换为实际 ServiceName 的名称。
卸载 #
运行以下命令卸载
copyhelm delete release-name
参数列表 #
Helm Chart 参数列表
参数 | 默认值 | 描述 |
---|---|---|
replicas | 2 | Mate 副本数 |
image.repository | uhub.service.ucloud.cn/cloud-ops/mate | Mate 镜像名 |
image.tag | latest | Mate 镜像tag |
image.pullPolicy | Always | 镜像拉取策略 |
imagePullAccount.enabled | false | 是否根据认证信息自动创建 secret |
imagePullAccount.username | "" | 私有仓库认证用户名 |
imagePullAccount.password | "" | 私有仓库认证密码 |
imagePullSecrets.enabled | true | 是否使用已存在的私有仓库认证 secrets |
imagePullSecrets.secrets[0].name | "" | 指定已存在的私有仓库认证 secret 名称 |
resources | {} | Mate 需要的资源 |
podTemplateAnnotations | {} | Pod template 的注解 |
grpcAddr | :21510 | grpc server 的监听地址 |
grpcWebAddr | :21511 | grpc web server 的监听地址 |
metricsAddr | :9090 | metrics server 的监听地址 |
kubeLeader.enabled | true | 是否启用在 kubernetes 中使用 Lease 选举主节点 |
nullBackend.enabled | false | 是否设置为使用内存模式, 此模式只为测试使用 |
kubeBackend.enabled | true | 是否启用 kubeBackend, 数据持久化到 kubernetes 的 configmap |
kubeBackend.backendName | mate-backend | configmap 的名称 |
obsBackend.enabled | false | 是否启用 obsBackend,数据持久化到对象存储 |
obsBackend.accessKey | "" | 对象存储的认证 access key |
obsBackend.secretKey | "" | 对象存储的认证 secret key |
obsBackend.endpoint | "" | 对象存储的地址 |
obsBackend.bucket | "" | 对象存储中 bucket 的名称 |
obsBackend.region | "" | 对象存储中 bucket 的区域 |
obsBackend.useSSL | false | 访问对象存储是否启用 ssl |
dbBackend.enabled | false | 是否启用 dbBackend, 数据持久化到数据库 |
dbBackend.kind.mysql | true | 是否使用 mysql 数据库 |
dbBackend.kind.pg | false | 是否使用 postgresql 数据库 |
dbBackend.host | "" | 数据库地址 |
dbBackend.user | "" | 数据库认证用户名 |
dbBackend.password | "" | 数据库认证密码 |
dbBackend.db | "" | 数据库名称 |
MateCli 使用说明 #
介绍 #
MateCli 实现了类似 Zookeeper 的 zkCli.sh 功能,可以交互式的查询到 Mate 内部存储的数据,以提升 Mate 的可维护性。
交互式命令 #
前提
虚拟机中部署执行以下命令进入交互式终端,例如
copy# /mate-cli -mate-addr 127.0.0.1:9090
Mate[/]>
Kubernetes 中部署需要进入到容器中执行以下命令进入交互式终端,例如
copy❯ kubectl exec -it -n ss mate-sphereex-dbplusengine-mate-d569b4b69-9zhbk sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ./mate-cli -mate-addr 127.0.0.1:9090
Mate[/]>
说明: -mate-addr 参数需要替换成实际地址
- ls 执行下面命令
copyls
执行下面命令, 递归显示所有 key
copyls -r
- cd
执行下面命令,切换到某个节点
copycd /tm/nodes/compute_nodes/online/proxy/
- put
执行下面命令,创建 key
copyput /ts/a c
- get
执行下面命令,查看 key
copyget /ts/a
- stat
执行下面命令,查看 key 的元信息
copystat /ts/a
- delete
执行下面命令,删除 key
copydelete /ts/a
- pwd
执行下面命令,查看当前路径
copypwd
- help
执行下面命令,查看帮助信息
copyhelp
执行下面命令查看具体命令的帮助信息
copyput -h
- exit
执行下面命令退出终端
exit