01
MongoDB 介绍
1.1 MongoDB 是什么?
-
高性能
-
丰富的查询语言
-
高可用性
-
水平可扩展性
-
支持多种存储引擎
1.2 MongoDB 部署模式
-
Standalone 模式:单点模式,单节点模式指运行在服务器上的一个 mongod 进程,用于读写数据。用户快速部署一个 MongoDB 单节点服务器,用于日常的开发、测试和学习等。 -
Replica Set 模式:副本集模式,一个副本集是一组 mongod 的实例集合,维护着相同的数据集,主要包含三类节点角色,如下图:
图片来源:https://mongodb.net.cn/Upload/replica-set-primary-with-two-secondaries.bakedsvg.svg
-
Sharding 模式:分片集群模式,分片是一种跨多台机器分发数据的方法。其实就是 MongoDB 横向扩容的一个整体架构实现,MongoDB 使用分片来支持具有非常大的数据集和高吞吐量操作的部署。解决 MongoDB 的性能和容量瓶颈等系统增长问题。 一个 MongoDB 分片集群,由 shard、mongos 和 config servers 三个组件组成。
02
需求分析
2.1 单点模式需求
-
可以通过 CR 快速部署单点模式的 MongoDB 容器;
-
可以自动维护 MongoDB 实例节点状态;
-
可以调整 MongoDB 的配置文件;
-
可以设置 MongoDB 资源大小;
-
支持 MongoDB 镜像版本的设置;
-
支持设置 MongoDB 的 root 密码;
-
支持用户设置自定义数据库、用户和密码;
-
可以备份,备份快照数据支持放入 S3 存储;
-
可以设置备份计划,定时创建备份快照;
-
支持 MongoDB 数据的持久化, 使用支持 storageClass 方式的 PVC;
-
支持更新/删除 MongoDB 服务实例;
-
支持查看 MongoDB 服务的慢日志查询;
-
支持查看 MongoDB 服务事件查询;
-
支持对外可访问;
-
支持 Statefulset、Service、Pod 等资源对象的常见操作;
-
支持查看 MongoDB 实例 Pod 的实时日志和离线日志;
-
支持 Pod 的 exec 能力;
-
支持下载 Pod 中的日志文件;
-
支持 MongoDB 的常见能力的运维操作,如查看 mongo 的状态、配置信息、快速搜索等;
-
可以设置监控的资源配置,监控 MongoDB 实例的运行情况。
2.2 副本集模式需求
-
可以通过 CR 快速部署副本集模式的 MongoDB 容器;
-
可以自动维护 MongoDB 实例节点状态;
-
可以调整 MongoDB 的配置文件;
-
可以设置 MongoDB 资源大小;
-
支持 MongoDB 镜像版本的设置;
-
支持设置 MongoDB 的 root 密码;
-
支持用户设置自定义数据库、用户和密码;
-
支持设置仲裁节点;
-
支持快速扩缩容;
-
保证部署的排它能力,避免重要的服务跑在一台机器;
-
可以备份,备份快照数据支持放入 S3 存储;
-
可以设置备份计划,定时创建备份快照;
-
支持 MongoDB 数据的持久化, 使用支持 storageClass 方式的 PVC;
-
支持更新/删除 MongoDB 服务实例;
-
支持查看 MongoDB 服务的慢日志查询;
-
支持查看 MongoDB 服务事件查询;
-
支持对外可访问;
-
支持 Statefulset、Service、Pod 等资源对象的常见操作;
-
支持查看 MongoDB 实例 Pod 的实时日志和离线日志;
-
支持 Pod 的 exec 能力;
-
支持下载 Pod 中的日志文件;
-
支持查看 Mongo 节点的拓扑图;
-
支持手动切换 Mongo 主节点,及查看主从节点切换记录;
-
支持 MongoDB 的常见能力的运维操作,如查看 mongo 的状态、配置信息、插入数据等;
-
可以设置监控的资源配置,监控 MongoDB 实例的运行情况。
2.3 分片模式需求
-
可以通过 CR 快速部署分片模式的 MongoDB 容器;
-
可以自动维护 MongoDB 实例节点状态;
-
可以调整 MongoDB 的配置文件;
-
可以设置 MongoDB 资源大小;
-
支持 MongoDB 镜像版本的设置;
-
支持设置 MongoDB 的 root 密码;
-
支持用户设置自定义数据库、用户和密码;
-
支持设置仲裁节点;
-
支持设置 mongo 路由以及配置中心的数量;
-
保证部署的排它能力,避免重要的服务跑在一台机器;
-
可以备份,备份快照数据支持放入 S3 存储;
-
可以设置备份计划,定时创建备份快照;
-
支持 MongoDB 数据的持久化, 使用支持 storageClass 方式的 PVC;
-
支持更新/删除 MongoDB 服务实例;
-
支持查看 MongoDB 服务的慢日志信息查询;
-
支持查看 MongoDB 服务事件查询;
-
支持 Statefulset、Service、Pod 等资源对象的常见操作;
-
支持查看 MongoDB 实例 Pod 的实时日志和离线日志;
-
支持 Pod 的 exec 能力;
-
支持下载 Pod 中的日志文件;
-
支持查看 Mongo 节点的拓扑图;
-
支持手动切换 Mongo 主节点,及查看主从节点切换记录;
-
支持 MongoDB 的常见能力的运维操作,如查看 mongo 的状态、配置信息、插入数据等;
-
可以设置监控的资源配置,监控 MongoDB 实例的运行情况。
03
方案
-
副本集模式方案:使用 K8s 的 service 的 NodePort 方式作为外部连接的入口。用户可以通过集群外部连接地址访问 mongo 服务,通过 mongoDB Client 客户端本身的能力来发现 master 节点。
-
分片模式方案:在 mongo 高可用分片集群模式中,客户端访问的方式,设置一组 mongos 地址,由 mongo 客户端来连接和使用集群。mongod 存储了分片集群的数据和配置信息,保证状态一致。同时这些地址是外部可达的,也支持集群外部的服务连接访问。
04
架构
-
Operator 部署阶段:作为开发者,确定了 mongo 相关的需求之后,首先要熟悉 mongo 的使用方式和基本知识,掌握 Kubernetes、Operator CRD/Controller Kubebuiler/operator-sdk 等技术,才能创建 mongo operator 项目; -
Opertaor 功能开发阶段:mongo operator 功能主要包含 mongo 实例、备份、备份计划、主从切换等 CRD 设计定义、同时包含相应的监控的指标和告警规则的设计,实现对 Mongo 服务以及 Operator 的监控告警功能; -
Opertaor 持续优化阶段:为实现 mongo CRD 相应的资源管理,通过 mongo operator 的 Reconclie 机制,实现对 CR 实例的监听和自动维护,使 CR 达到用户的期望的状态。
05
案例
5.1 模型样例
-
单点模型
// MongoDBSpec defines the desired state of MongoDB
// Type 类型为 Standalone
type MongoDBSpec struct {
Image string `json:"image,omitempty"`
// +kubebuilder:validation:Enum=Standalone;ReplicaSet;ShardedCluster
Type string `json:"type,omitempty"`
Service string `json:"service,omitempty"`
RootPassword string `json:"rootPassword,omitempty"`
DBUserSpec DBUserSpec `json:"dbUserSpec,omitempty"`
NotPersistent bool `json:"notPersistent,omitempty"`
CustomConfig string `json:"customConfig,omitempty"`
ExportConnect bool `json:"exportConnect,omitempty"`
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
Storage string `json:"storage,omitempty"`
BackUpStorage string `json:"backUpStorage,omitempty"`
StorageClassName string `json:"storageClassName,omitempty"`
MetricsExporterSpec MetricsExporterSpec `json:"metricsExporterSpec,omitempty"`
PodSpec PodSpec `json:"podSpec,omitempty"`
}
-
副本集模型
// MongoDBSpec defines the desired state of MongoDB
// Type 类型为 ReplicaSet
type MongoDBSpec struct {
Image string `json:"image,omitempty"`
// +kubebuilder:validation:Enum=Standalone;ReplicaSet;ShardedCluster
Type string `json:"type,omitempty"`
Members int `json:"members,omitempty"`
Service string `json:"service,omitempty"`
RootPassword string `json:"rootPassword,omitempty"`
DBUserSpec DBUserSpec `json:"dbUserSpec,omitempty"`
Arbiter bool `json:"arbiter,omitempty"`
NotPersistent bool `json:"notPersistent,omitempty"`
CustomConfig string `json:"customConfig,omitempty"`
ExportConnect bool `json:"exportConnect,omitempty"`
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
Storage string `json:"storage,omitempty"`
BackUpStorage string `json:"backUpStorage,omitempty"`
StorageClassName string `json:"storageClassName,omitempty"`
MetricsExporterSpec MetricsExporterSpec `json:"metricsExporterSpec,omitempty"`
PodSpec PodSpec `json:"podSpec,omitempty"`
}
-
分片集群模型
// MongoDBSpec defines the desired state of MongoDB
// Type 类型为 ShardedCluster
type MongoDBSpec struct {
Image string `json:"image,omitempty"`
// +kubebuilder:validation:Enum=Standalone;ReplicaSet;ShardedCluster
Type string `json:"type,omitempty"`
ShardCount int `json:"shardCount,omitempty"`
MongodsPerShardCount int `json:"mongodsPerShardCount,omitempty"`
MongosCount int `json:"mongosCount,omitempty"`
ConfigServerCount int `json:"configServerCount,omitempty"`
Service string `json:"service,omitempty"`
RootPassword string `json:"rootPassword,omitempty"`
DBUserSpec DBUserSpec `json:"dbUserSpec,omitempty"`
Arbiter bool `json:"arbiter,omitempty"`
NotPersistent bool `json:"notPersistent,omitempty"`
CustomConfig string `json:"customConfig,omitempty"`
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
Storage string `json:"storage,omitempty"`
BackUpStorage string `json:"backUpStorage,omitempty"`
StorageClassName string `json:"storageClassName,omitempty"`
MetricsExporterSpec MetricsExporterSpec `json:"metricsExporterSpec,omitempty"`
PodSpec PodSpec `json:"podSpec,omitempty"`
}
-
备份模型
// MongoBackUpSpec defines the desired state of MongoBackUp
type MongoBackUpSpec struct {
Instance string `json:"instance"`
Restart bool `json:"restart,omitempty"`
ChangeMasterTo string `json:"changeMasterTo,omitempty"`
}
-
主从节点切换模型
type MongoChannelSpec struct {
Instance string `json:"instance"`
Restart bool `json:"restart,omitempty"`
ChangeMasterTo string `json:"changeMasterTo,omitempty"`
}
-
单点部署/备份
apiVersion: mongo.daocloud.io/v1alpha1
kind: MongoDB
metadata:
name: mongodb-test
spec:
type: Standalone
image: daocloud.io/atsctoo/mongo:3.6
service: mongodb-001-svc
rootPassword: "654321"
dbUserSpec:
enable: true
name: mongo001
user: user001
password: "123456"
notPersistent: true
customConfig: mongo-operator-mongo-default-config
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "1"
memory: 512Mi
storage: 1Gi
backUpStorage: 1Gi
storageClassName: "nfs"
metricsExporterSpec:
enable: true
resources:
limits:
cpu: "0.1"
memory: 128Mi
requests:
cpu: "0.1"
memory: 128Mi
---
apiVersion: mongo.daocloud.io/v1alpha1
kind: MongoBackUp
metadata:
name: mongobackup-sample
spec:
backUpInstance: mongodb-test
backUpNode: mongodb-test-standalone-0-0
storages: mongo-operator-s3
-
副本集部署/备份/主从切换
apiVersion: mongo.daocloud.io/v1alpha1
kind: MongoDB
metadata:
name: mongodb-test
spec:
image: daocloud.io/atsctoo/mongo:3.6
type: ReplicaSet
members: 3
service: mongodb-test-svc
rootPassword: "123456"
dbUserSpec:
enable: true
name: mongo001
user: user001
password: "123456"
arbiter: false
notPersistent: false
customConfig: mongo-operator-mongo-default-config
exportConnect: true
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "1"
memory: 512Mi
storage: 1Gi
backUpStorage: 1Gi
storageClassName: "" # 存储类型 为空时,表示使用默认
metricsExporterSpec:
enable: true
resources:
limits:
cpu: "0.1"
memory: 128Mi
requests:
cpu: "0.1"
memory: 128Mi
---
apiVersion: mongo.daocloud.io/v1alpha1
kind: MongoBackUp
metadata:
name: mongobackup-sample
spec:
backUpInstance: mongodb-test
backUpNode: mongodb-test-replset-0-0
storages: mongo-operator-s3
---
apiVersion: mongo.daocloud.io/v1alpha1
kind: MongoChannel
metadata:
name: mongochannel-sample
spec:
changeMasterTo: 'mongdb-test-replset-0-2.dce.dsp.ats.io:35966'
instance: mongodb-test
-
分片部署/备份
apiVersion: mongo.daocloud.io/v1alpha1
kind: MongoDB
metadata:
name: mongodb-test
spec:
image: daocloud.io/atsctoo/mongo:3.6
type: ShardedCluster
service: mongodb-test-svc
shardCount: 2
mongodsPerShardCount: 3
configServerCount: 3
mongosCount: 2
rootPassword: "123456"
dbUserSpec:
enable: true
name: mongo001
user: user001
password: "123456"
arbiter: true
notPersistent: true
customConfig: mongo-operator-mongo-default-config
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "1"
memory: 512Mi
storage: 1Gi
backUpStorage: 1Gi
storageClassName: "" # 存储类型 为空时,表示使用默认
metricsExporterSpec:
enable: true
resources:
limits:
cpu: "0.1"
memory: 128Mi
requests:
cpu: "0.1"
memory: 128Mi
---
apiVersion: mongo.daocloud.io/v1alpha1
kind: MongoBackUp
metadata:
name: mongobackup-sample
spec:
backUpInstance: mongodb-test
backUpNode: mongodb-test-replset-0-0
storages: mongo-operator-s3
5.3 监控图表
06
总结
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/310122.html