16 MogDB Stack

简介: 16 MogDB Stack

一、工具讲解

 

1. MogDB Stack 简介

 

 

MogDB StackKubernetes上的MogDB集群自动运维系统,提供包括部署、高可用、扩缩容、监控、备份恢复的MogDB全生命周期管理。借助MogDB StackMogDB可以无缝运行在公有云或私有部署的Kubernetes集群上。

 

 

2. MogDB Stack特性

简单便捷的自动部署/回收

 

 Kubernetes作为原生的容器编排系统,以扩展资源的方式,轻松便捷地创建整套MogDB集群,并且根据用户的期望任意扩缩容。

 

稳定可靠的备份恢复能力

 

 支持基于SQL的备份方式,并且存储在远端分布式存储中,多副本保证备份的可靠性,指定point-in-time的恢复方式,恢复到指定的时间点。

 

企业级的高可用性

 

 自动故障探测、切换,并自动化的拉取数据快照恢复故障节点或重新调度新节点,实现系统的自愈能力,保证用户期望的副本数。

 

完善可靠的监控能力

 

 基于Prometheus实现多维度的统一监控,囊括了系统层、容器层、数据库层的完整的监控指标。

 

精细化的资源管控

 

 针对CPU、内存、存储等资源的限额,保证容器层的独立性,不会互相干扰,支持容器的亲和性、反亲和性调度。

 

 

3. 系统架构

 

![](https://cdn-mogdb.enmotech.com/docs-media/mogdb-stack/v1.0.0/overview-arch.png)

 

4. 操作系统与平台支持

MogDB Stack 目前支持在如下操作系统和平台架构下运行:

 

Linux x86_64

Linux arm64

 

二、 快速部署

 

 

1. 快速上手

本文介绍了如何创建一个简单的 Kubernetes 集群,部署MogDB Operator,并使用 Mogdb Operator 部署 MogDB 集群。

 本文中的部署说明仅用于测试目的,不要直接用于生产环境。如果要在生产环境部署,请参阅部署部署 MogDB 集群章节。

 

2. 创建Kubernetes测试集群

本节介绍如何使用 minikube 部署 Kubernetes 集群。

 

minikube 可以在虚拟机中创建一个 Kubernetes 集群,可在 macOS, Linux Windows 上运行。

 

部署前,请确保满足以下要求:

 

minikube:版本 1.18.1+

 

minikube 需要安装一个兼容的 hypervisor,详情见官方安装教程。

 

kubectl: 版本 >= 1.18.1

 

安装完 minikube 后,可以执行下面命令启动一个Kubernetes 集群:

```s
minikube start
```

如果一切运行正常,会看到类似下面的输出,根据操作系统和使用的 hypervisor 会有些许差异。

```s
😄  minikube v1.10.1 on Darwin 10.15.4
✨  Automatically selected the hyperkit driver. Other choices: docker, vmwarefusion
💾  Downloading driver docker-machine-driver-hyperkit:
    docker-machine-driver-hyperkit.sha256: 65 B / 65 B [---] 100.00% ? p/s 0s
    docker-machine-driver-hyperkit: 10.90 MiB / 10.90 MiB  100.00% 1.76 MiB p
🔑  The 'hyperkit' driver requires elevated permissions. The following commands will be executed:
    $ sudo chown root:wheel /Users/user/.minikube/bin/docker-machine-driver-hyperkit
    $ sudo chmod u+s /Users/user/.minikube/bin/docker-machine-driver-hyperkit
💿  Downloading VM boot image ...
    minikube-v1.10.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    minikube-v1.10.0.iso: 174.99 MiB / 174.99 MiB [] 100.00% 6.63 MiB p/s 27s
👍  Starting control plane node minikube in cluster minikube
💾  Downloading Kubernetes v1.18.2 preload ...
    preloaded-images-k8s-v3-v1.18.2-docker-overlay2-amd64.tar.lz4: 525.43 MiB
🔥  Creating hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.18.2 on Docker 19.03.8 ...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"
```

对于中国大陆用户,可以使用国内 gcr.io mirror 仓库,例如 registry.cn-hangzhou.aliyuncs.com/google_containers

```s
minikube start --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
```

或者给 Docker 配置 HTTP/HTTPS 代理。

 

将下面命令中的 127.0.0.1:1086 替换为您自己的HTTP/HTTPS 代理地址:

```s
minikube start --docker-env https_proxy=http://127.0.0.1:1086 \
     --docker-env http_proxy=http://127.0.0.1:1086
```

 注意:

 由于minikube(默认)通过虚拟机运行,127.0.0.1 指向虚拟机本身,所以在有些情况下可能需要将代理修改为您的主机的实际 IP

 

参考 minikube setup 查看配置虚拟机和Kubernetes 集群的更多选项。

 

你可以使用 minikube 的子命令 kubectl 来进行集群操作。要使 kubectl 命令生效,你需要在 shell 配置文件中添加以下别名设置命令,或者在打开一个新的 shell 后执行以下别名设置命令。

```s
alias kubectl='minikube kubectl --'
```

执行以下命令检查集群状态,并确保可以通过 kubectl 访问集群:

```s
kubectl cluster-info
```

期望输出:

```s
Kubernetes master is running at https://192.168.64.2:8443
KubeDNS is running at https://192.168.64.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

现在就可以开始部署 MogDB Operator 了!

 

测试完成后,执行下面命令来销毁集群:

```s
minikube delete
```

 

2. 部署MogDB Operator

开始之前,确保以下要求已满足:

 

可以使用 kubectl 访问的 Kubernetes 集群

已安装 Kustomize v3+

步骤1: 下载样例

```s
wget https://cdn-mogdb.enmotech.com/mogdb-stack/v1.0.0/mogdb-operator-examples.tar
tar xf mogdb-operator-examples.tar
cd mogdb-operator-examples
```

步骤2: 安装MogDB Operator

```s
kustomize build ./kustomize/install/default | kubectl apply -f -
```

期望输出:

```s
namespace/mogdb-operator-system created
customresourcedefinition.apiextensions.k8s.io/mogdbbackups.mogdb.enmotech.io created
customresourcedefinition.apiextensions.k8s.io/mogdbclusters.mogdb.enmotech.io created
customresourcedefinition.apiextensions.k8s.io/mogdbrecoveries.mogdb.enmotech.io created
serviceaccount/mogdb-operator-controller-manager created
role.rbac.authorization.k8s.io/mogdb-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/mogdb-operator-manager-role created
rolebinding.rbac.authorization.k8s.io/mogdb-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/mogdb-operator-manager-rolebinding created
configmap/mogdb-operator-manager-config created
secret/mogdb-operator-huawei-registry created
deployment.apps/mogdb-operator-controller-manager created
```

 

3. 部署MogDB集群

```s
kubectl apply -f https://cdn-mogdb.enmotech.com/mogdb-stack/v1.0.0/mogdb-cluster.yaml
```

期望输出:

```s
mogdbcluster.mogdb.enmotech.io/cluster1 created
```

 

查看pod状态

```s
kubectl get pods -n mogdb-operator-system
```

期望输出:

```s
NAME                          READY   STATUS            RESTARTS   AGE
cluster1-jl2kn                3/3     Running           0          4m18s
cluster1-zuveg                0/3     PodInitializing   0         108s
```

等待所有pod都处于running状态,然后进行下一步,连接到MogDB集群。

 

 

4. 连接MogDB集群

(1) 安装gsql命令行工具

要连接到MogDB集群,您需要在使用kubectl的主机上安装MogDB客户端工具gsql安装与物理机匹配的命令行工具。

 

 

(2) 查看MogDB服务端口

首先,将端口从本地主机转发到 Kubernetes 中的 MogDB Service。 我们先获取 mogdb-operator-system 命名空间中的服务列表:

```s
kubectl get svc -n mogdb-operator-system
```

期望输出:

```s
NAME                       TYPE       CLUSTER-IP     EXTERNAL-IP        PORT(S)          AGE
cluster1-svc-master        NodePort   10.1.115.245   <none>       5432:30013/TCP   38m
cluster1-svc-replicas      NodePort  10.1.41.187    <none>       5432:30012/TCP   38m
```

输出结果显示了,k8s集群内部通过5432端口,集群外部通过30013端口访问实际的MogDB集群。

 

 

(3) 连接集群

在连接之前,需要修改默认用户的密码。可以通过kubectl命令连接到容器,修改密码。

```s
kubectl exec -it cluster1-xxx -c ha-sidecar -/bin/bash
gsql -dpostgres
ALTER USER mogdb WITH PASSWORD 'new_password';
gsql -h 10.1.115.245 -p 5432 -U mogdb -W
```

期望输出:

```s
gsql ((MogDB 3.0.0 build b5f25b20) compiled at 2022-06-30 14:41:25 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
MogDB=
```

以下是一些可以用来验证集群功能的命令。

 

查看MogDB版本

```s
MogDB=select version();
                                                                      version
---------------------------------------------------------------------------------------------------------------------------------------------------
 (MogDB 3.0.0 build b5f25b20) compiled at 2022-06-30 14:41:25 commit 0 last mr   on aarch64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)
```

创建t1

```s
MogDB=create table t1(id int);
CREATE TABLE
```

插入数据

```s
MogDB=insert into t1(id) values(1),(2),(3);
INSERT 0 3
```

查看数据

```s
MogDB=select * from t1;
 id
----
  1
  2
  3
(3 rows)
```

 

5. 销毁MogDB集群

完成测试后,您可能希望销毁MogDB集群。

 

删除MogDB集群

```s
kubectl delete mogdbcluster cluster1
```

期望输出:

```s
mogdbcluster.mogdb.enmotech.io "cluster1" deleted
```

 

卸载MogDB Operator

```s
kustomize build ./kustomize/install/default | kubectl delete -f -
```

期望输出:

```s
namespace/mogdb-operator-system created
customresourcedefinition.apiextensions.k8s.io/mogdbbackups.mogdb.enmotech.io created
customresourcedefinition.apiextensions.k8s.io/mogdbclusters.mogdb.enmotech.io created
customresourcedefinition.apiextensions.k8s.io/mogdbrecoveries.mogdb.enmotech.io created
serviceaccount/mogdb-apiserver created
serviceaccount/mogdb-operator-controller-manager created
role.rbac.authorization.k8s.io/mogdb-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/mgo-cluster-role created
clusterrole.rbac.authorization.k8s.io/mogdb-operator-manager-role created
rolebinding.rbac.authorization.k8s.io/mogdb-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/mgo-cluster-role created
clusterrolebinding.rbac.authorization.k8s.io/mogdb-operator-manager-rolebinding created
configmap/mogdb-operator-manager-config created
configmap/mogdb-operator-mgo-config created
secret/mgorole-admin created
secret/mgouser-admin created
secret/mogdb-operator-huawei-registry created
service/mogdb-apiserver created
deployment.apps/mogdb-apiserver created
deployment.apps/mogdb-operator-controller-manager created
```

 

三、架构

 

1. 高可用

高可用是MogDB Stack体系中的,一个功能组件,以sidecar模式运行在MogDB所在的pod中,实时的监测MogDB的运行状态,当primary出现不可用状态时,触发切换逻辑。

 

发生切换的场景如下:

 

 数据库磁盘故障或者某些硬件故障

 主库的网络不可达

 数据库发生故障宕机

 机架掉电

 

特性

 通过dcs保证ha自身的高可用

 ha具备leaderfollower角色,leader具有决策权

 实时修复MogDB集群的复制状态

 维护MogDB的角色

 

架构图

![](https://cdn-mogdb.enmotech.com/docs-media/mogdb-stack/v1.0.0/ha.png)


2. 监控


(1) Kubernetes监控与告警  

本文介绍如何对 Kubernetes 集群进行监控。在MogDB集群运行的过程中,需要对容器资源、宿主机、Kubernetes 组件等进行监控。对于这些组件或资源的监控,需要在整个Kubernetes 集群维度部署监控系统来实现。


(2) 宿主机监控

通过node exporter对物理机指标进行采集,统一抓取到prometheus中。Node Exporter Prometheus 官方提供的一个节点资源采集组件,可以用于收集服务器节点的数据,如 CPU频率信息、磁盘IO统计、剩余可用内存 等等。Node Exporter 会将收集到的信息转换为 Prometheus 可识别的 Metrics 数据。Prometheus 可以从 Node Exporter 中对这些指标进行收集与存储,并且可以根据这些数据的实时变化进行服务器节点资源监控。

 

(3) 容器监控

cAdvisorGoogle开源的容器资源监控和性能分析工具,它是专门为容器而生,在Kubernetes中,我们不需要单独去安装,cAdvisor作为kubelet内置的一部分程序可以直接使用,也就是我们可以直接使用cadvisor采集数据,可以采集到和容器运行相关的所有指标。

 

cadvisor中获取到的典型监控指标如下:

 

| 指标名称                                       | 类型      | 含义                          |
|--------------------------------------------|---------|-----------------------------|
| container\_cpu\_load\_average\_10s         | gauge   | 过去10秒容器CPU的平均负载             |
| container\_cpu\_usage\_seconds\_total      | counter | 容器在每个CPU内核上的累积占用时间 \(单位:秒\) |
| container\_cpu\_system\_seconds\_total     | counter | System CPU累积占用时间(单位:秒)      |
| container\_cpu\_user\_seconds\_total       | counter | User CPU累积占用时间(单位:秒)        |
| container\_fs\_usage\_bytes                | gauge   | 容器中文件系统的使用量\(单位:字节\)        |
| container\_fs\_limit\_bytes                | gauge   | 容器可以使用的文件系统总量\(单位:字节\)      |
| container\_fs\_reads\_bytes\_total         | counter | 容器累积读取数据的总量\(单位:字节\)        |
| container\_fs\_writes\_bytes\_total        | counter | 容器累积写入数据的总量\(单位:字节\)        |
| container\_memory\_max\_usage\_bytes       | gauge  | 容器的最大内存使用量(单位:字节)          |
| container\_memory\_usage\_bytes            | gauge   | 容器当前的内存使用量(单位:字节)           |
| container\_spec\_memory\_limit\_bytes      | gauge  | 容器的内存使用量限制                 |
| machine\_memory\_bytes                     | gauge   | 当前主机的内存总量                   |
| container\_network\_receive\_bytes\_total  | counter | 容器网络累积接收数据总量(单位:字节)         |
| container\_network\_transmit\_bytes\_total | counter | 容器网络累积传输数据总量(单位:字节)         |


(4) 资源对象监控

kube-state-metrics提供资源对象本身的监控,如pod运行状态、有多少job在运行中等等,它基于client-go开发,轮询Kubernetes API,并将Kubernetes的结构化信息转换为metrics

 

指标类别包括:

 

CronJob Metrics
DaemonSet Metrics
Deployment Metrics
Job Metrics
LimitRange Metrics
Node Metrics
PersistentVolume Metrics
PersistentVolumeClaim Metrics
Pod Metrics
Pod Disruption Budget Metrics
ReplicaSet Metrics
ReplicationController Metrics
ResourceQuota Metrics
Service Metrics
StatefulSet Metrics
Namespace Metrics
Horizontal Pod Autoscaler Metrics
Endpoint Metrics
Secret Metrics
ConfigMap Metrics


(5) MogDB监控

为了获取MogDB自身的监控指标,需要配套的MogDB exporter采集相应的数据。


(6) 架构图

 

![](https://cdn-mogdb.enmotech.com/docs-media/mogdb-stack/v1.0.0/monitor.png)


3. 备份


(1) 备份管理

MogDB Operator使用MogDB原生的dump命令执行备份,因此,备份内容为可移殖的sql形式,这样的好处是可以跨版本恢复。


(2) 架构图

 

![](https://cdn-mogdb.enmotech.com/docs-media/mogdb-stack/v1.0.0/backup-management.png)


4. 恢复

 

(1) 恢复管理

 

MogDB Operator通过在s3存储上,查找合适的备份数据,恢复数据库到指定的时间点。

 

(2) 架构图

 

![](https://cdn-mogdb.enmotech.com/docs-media/mogdb-stack/v1.0.0/recovery-management.png)


5. 客户端

 

1 mgo客户端

MogDB Operator Client,又叫做mgo,是与MogDB Operator 交互的最便捷方式。mgo通过一系列简单的命令,为创建、管理和删除 MogDB 集群提供了许多便捷的方法。 MogDB Operator 提供了于 mgo 客户端连接的接口,并通过 RBAC TLS 进行验证管理。


2) 架构图

![](https://cdn-mogdb.enmotech.com/docs-media/mogdb-stack/v1.0.0/single-idc-operator-arch.png)


目录
相关文章
|
9月前
|
缓存 监控 网络协议
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(三)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(三)
169 0
|
9月前
|
监控 Linux
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(一)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data
112 0
|
9月前
|
缓存 监控 Ubuntu
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(七)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(七)
70 0
|
9月前
|
监控 Linux 数据处理
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(五)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(五)
51 0
|
9月前
|
缓存 监控 网络协议
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(八)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(八)
44 0
|
9月前
|
存储 缓存 监控
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(六)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(六)
87 0
|
9月前
|
监控 Ubuntu Linux
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(二)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(二)
66 0
|
9月前
|
缓存 监控 网络协议
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(九)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(九)
213 0
|
9月前
|
监控 Linux 数据处理
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(四)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(四)
77 0
|
9月前
|
缓存 监控 Linux
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(九)
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(九)
137 0