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 类型为 Standalonetype MongoDBSpec struct {Image string `json:"image,omitempty"`// +kubebuilder:validation:Enum=Standalone;ReplicaSet;ShardedClusterType 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 类型为 ReplicaSettype MongoDBSpec struct {Image string `json:"image,omitempty"`// +kubebuilder:validation:Enum=Standalone;ReplicaSet;ShardedClusterType 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 类型为 ShardedClustertype MongoDBSpec struct {Image string `json:"image,omitempty"`// +kubebuilder:validation:Enum=Standalone;ReplicaSet;ShardedClusterType 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 MongoBackUptype 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/v1alpha1kind: MongoDBmetadata:name: mongodb-testspec:type: Standaloneimage: daocloud.io/atsctoo/mongo:3.6service: mongodb-001-svcrootPassword: "654321"dbUserSpec:enable: truename: mongo001user: user001password: "123456"notPersistent: truecustomConfig: mongo-operator-mongo-default-configresources:limits:cpu: "1"memory: 512Mirequests:cpu: "1"memory: 512Mistorage: 1GibackUpStorage: 1GistorageClassName: "nfs"metricsExporterSpec:enable: trueresources:limits:cpu: "0.1"memory: 128Mirequests:cpu: "0.1"memory: 128Mi---apiVersion: mongo.daocloud.io/v1alpha1kind: MongoBackUpmetadata:name: mongobackup-samplespec:backUpInstance: mongodb-testbackUpNode: mongodb-test-standalone-0-0storages: mongo-operator-s3
-
副本集部署/备份/主从切换
apiVersion: mongo.daocloud.io/v1alpha1kind: MongoDBmetadata:name: mongodb-testspec:image: daocloud.io/atsctoo/mongo:3.6type: ReplicaSetmembers: 3service: mongodb-test-svcrootPassword: "123456"dbUserSpec:enable: truename: mongo001user: user001password: "123456"arbiter: falsenotPersistent: falsecustomConfig: mongo-operator-mongo-default-configexportConnect: trueresources:limits:cpu: "1"memory: 512Mirequests:cpu: "1"memory: 512Mistorage: 1GibackUpStorage: 1GistorageClassName: "" # 存储类型 为空时,表示使用默认metricsExporterSpec:enable: trueresources:limits:cpu: "0.1"memory: 128Mirequests:cpu: "0.1"memory: 128Mi---apiVersion: mongo.daocloud.io/v1alpha1kind: MongoBackUpmetadata:name: mongobackup-samplespec:backUpInstance: mongodb-testbackUpNode: mongodb-test-replset-0-0storages: mongo-operator-s3---apiVersion: mongo.daocloud.io/v1alpha1kind: MongoChannelmetadata:name: mongochannel-samplespec:changeMasterTo: 'mongdb-test-replset-0-2.dce.dsp.ats.io:35966'instance: mongodb-test
-
分片部署/备份
apiVersion: mongo.daocloud.io/v1alpha1kind: MongoDBmetadata:name: mongodb-testspec:image: daocloud.io/atsctoo/mongo:3.6type: ShardedClusterservice: mongodb-test-svcshardCount: 2mongodsPerShardCount: 3configServerCount: 3mongosCount: 2rootPassword: "123456"dbUserSpec:enable: truename: mongo001user: user001password: "123456"arbiter: truenotPersistent: truecustomConfig: mongo-operator-mongo-default-configresources:limits:cpu: "1"memory: 512Mirequests:cpu: "1"memory: 512Mistorage: 1GibackUpStorage: 1GistorageClassName: "" # 存储类型 为空时,表示使用默认metricsExporterSpec:enable: trueresources:limits:cpu: "0.1"memory: 128Mirequests:cpu: "0.1"memory: 128Mi---apiVersion: mongo.daocloud.io/v1alpha1kind: MongoBackUpmetadata:name: mongobackup-samplespec:backUpInstance: mongodb-testbackUpNode: mongodb-test-replset-0-0storages: mongo-operator-s3
5.3 监控图表

06
总结
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/310122.html