使用StatefulSet搭建MongoDB集群

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 主要讲解使用StatefulSet搭建MongoDB集群的一些概念以及案例

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

本文**以MongoDB为例,使用StatefulSet完成MongoDB集群的创建,为每个
MongoDB实例在共享存储(本例使用GlusterFS)中都申请一片存储空间**
,以实现一个无单点故障、高可用、可动态扩展的MongoDB集群,部署架构如图下所示:

在这里插入图片描述

注意:在 创建StatefulSet之前,需要确保在Kubernetes集群中管理员已经创建好共享存储,并能够与StorageClass对接,以实现动态存储供应的模式,本文的示例将使用 GlusterFS作为共享存储。

02 部署StatefulSet

为了完成MongoDB集群的搭建,需要部署以下三个资源对象,分别为:

  • StorageClass:用于StatefulSet自动为各个应用Pod申请PVC;
  • Headless Service:用于设置MongoDB实例的域名;
  • StatefulSet

2.1 创建StorageClass对象

首先,创建一个StorageClass对象,storageclass-fast.yaml文件的内容如下:

apiVersion: storage.k8s.io/v1 
kind: Storageclass
metadata:
    name: fast
provisioner: kubernetes.io/glusterfs
parameters:
    resturl: "http://<heketi-rest-url>"

运行kubectl create命令创建该StorageClass:
在这里插入图片描述

2.2 创建Headless Service对象

接下来,创建对应的Headless Service,mongo-sidecar作为MongoDB集群的管理者,将使用此Headless Service来维护各个MongoDB实例之间的集群关系,以及集群规模变化时的自动更新。

mongo-headless-service.yaml文件的内容如下:

apiVersion: v1
kind: Service
metadata: 
    name: mongo
    labels:
        name: mongo
spec:
    ports:
    - port: 27017
      targetPort: 27017
    clusterIP: None
    selector:
        role: mongo

运行kubectl create命令创建该Headless Service:
在这里插入图片描述

2.3 创建StatefulSet对象

最后,创建MongoDB StatefulSet,statefulset-mongo.yaml文件的内容如下:

apiversion: apps/v1
kind: StatefulSet
metadata:
    name: mongo
spec:
    serviceName: "mongo"
    replicas: 3
    template:
        metadata:
            labels:
                role: mongo
                environment: test
        spec:
            terminationGracePeriodSeconds: 10 
            containers:
            - name: mongo
              image: mongo
              command:
              - mongod
              - "--replSet"
              - rs0
              - "--smallfiles"
              - "--noprealloc"
              ports:
              - containerPort: 27017
              volumeMounts:
              - name: mongo-persistent-storage 
                 mountPath: /data/db
            - name: mongo-sidecar
              image: cvallance/mongo-k8s-sidecar
              env:
              - name: MONGO SIDECAR POD LABELS
                value: "role=mongo,environment=test" 
              - name: KUBERNETES MONGO SERVICE NAME 
                value: "mongo"
    volumeClaimTemplates: 
    - metadata:
      name: mongo-persistent-storage 
      annotations: 
          volume.beta.kubernetes.io/storage-class:"fast"
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
            requests:
                storage: 100Gi

对其中的主要配置说明如下:

① 在该StatefulSet的定义中包括两个容器:mongo和mongo-sidecar,mongo是主服务程序,mongo-sidecar是将多个mongo实例进行集群设置的工具, mongo--sidecar中的环境变量如下

  • MONGO_SIDECAR_POD_LABELS:设置为mongo容器的标签,用于sidecar查询它所要管理的MongoDB集群实例;
  • KUBERNETES_MONGO_SERVICE_NAME:它的值为mongo,表示sidecar将使用mongo这个服务名来完成MongoDB集群的设置。

replicas=3表示这个MongoDB集群由3个mongo实例组成

volumeClaimTemplates是StatefulSet最重要的存储设置,在 annotations段设置volume.beta.kubernetes.io/storage-class="fast"表示使用名为 fast的StorageClass自动为每个mongo Pod实例都分配后端存储。resources.requests.storage=100Gi表示为每个mongo实例都分配100GiB的磁盘空间。

使用kubectl create命令创建这个StatefulSet:

$ kubectl create -f statefulset-mongo.yaml
statefulset.apps/mongo created

最终可以看到StatefulSet依次创建并启动了3个mongo Pod实例,它们的名字依次为mongo-0、mongo-1、mongo-2:
在这里插入图片描述
StatefulSet会用volumeClaimTemplates中的定义为每个Pod副本都创建一个 PVC实例,每个PVC实例的名称都由StatefulSet定义中volumeClaimTemplates的名称和Pod副本的名称组合而成,查看系统中的PVC便可以验证这一点:
在这里插入图片描述
下面是mongo-0这个Pod中的Volume设置,可以看到系统自动为其挂载了对应的PVC:
在这里插入图片描述
至此,一个由3个实例组成的MongoDB集群就创建完成了,其中的每个实例都拥有稳定的名称(DNS域名格式) 和独立的存储空间

03 查看mongodb的集群状态

登录任意一个mongo Pod,在mongo命令行界面用rs.status()命令查看MongoDB集群的状态,可以看到mongo集群已通过sidecar完成了创建。

在集群中 包含3个节点,每个节点的名称都是StatefulSet设置的DNS域名格式的网络标识名称:

  • mongo-o.mongo.default.svc.cluster.local;
  • mongo-1.mongo.default.svc.cluster.local;
  • mongo-2.mongo.default.svc.cluster.local.

同时,可以看到3个mongo实例各自的角色(PRIMARY或SECONDARY)也都进行了正确的设置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

04 StatefulSet的常见应用场景

下面对MongoDB集群常见的两种场景进行操作,说明StatefulSet对有状态应用的自动化管理功能

4.1 MongoDB集群的扩容

假设在系统运行过程中,3个mongo实例不足以满足业务的要求,这时就需要对mongo集群进行扩容。仅需要通过对StatefulSet进行scale操作,就能实现在 mongo集群中自动添加新的mongo节点。

使用kubectl scale命令将StatefulSet设置为4个实例:

kubectl scale --replicas=4 statefulset mongo 
statefulset.apps/mongo scaled

等待一会儿,看到第4个实例mong0-3创建成功:
在这里插入图片描述
同时,系统也为mongo-3分配了一个新的PVC用于保存数据,此处不再赘述。

4.2 自动故障恢复(MongoDB集群的高可用)

假设在系统运行过程中,某个mongo实例或其所在主机发生故障,则StatefulSet将会自动重建该mongo实例,并保证其身份(ID)和使用的数据(PVC)不变。

以mongo-0实例发生故障为例,StatefulSet将会自动重建mongo-0实例,并为其挂载之前分配的PVC“mongo-persistent-storage-mongo-0”。“mongo-0”服务在重新启动后,原数据库中的数据不会丢失,可继续使用。
在这里插入图片描述
从上面的例子中可以看出,Kubernetes使用StatefulSet来搭建有状态的应用集群(MongoDB、MySQL等),同部署无状态的应用一样简便。

Kubernetes能够保证StatefulSet中各应用实例在创建和运行的过程中,都具有固定的身份标识和独立的后端存储;还支持在运行时对集群规模进行扩容、保障集群的高可用等 非常重要的功能。

05 文末

本文主要讲解使用StatefulSet搭建MongoDB集群的一些概念以及案例,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
5月前
|
NoSQL Cloud Native MongoDB
MongoDB 主从集群 2
MongoDB 主从集群 2
|
6月前
|
运维 NoSQL 安全
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。 适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。
490 1
|
5月前
|
存储 NoSQL 网络协议
MongoDB 主从集群 1
MongoDB 主从集群 1
|
1月前
|
NoSQL MongoDB
搭建MongoDB分片式集群
搭建MongoDB分片式集群
15 0
|
6月前
|
NoSQL MongoDB
MongoDB分片+副本集高可用集群的启停步骤
MongoDB分片+副本集高可用集群的启停步骤
139 0
|
2月前
|
存储 缓存 NoSQL
MongoDB详解(三)——MongoDB集群
MongoDB详解(三)——MongoDB集群
35 4
|
7月前
|
存储 NoSQL 网络安全
如何开通MongoDB的专属集群
本案例旨在展示如何开通MongoDB的专属集群。
68 1
|
9月前
|
NoSQL MongoDB 数据库
【mongo 系列】mongodb 学习九,MongoDB 主从集群 2
继续咱们 mongodb 集群的学习和分享 上次分享了 mongodb 主从集群的同步机制(oplog),心跳机制,这次我们继续看看选举机
|
4月前
|
NoSQL MongoDB Docker
docker搭建mongodb集群
docker搭建mongodb集群
90 0
|
4月前
|
Kubernetes NoSQL MongoDB
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
455 1