返回 导航

Docker / K8s

hangge.com

K8s - 安装部署MongoDB数据库教程2(多副本集群)

作者:hangge | 2022-01-29 13:41
    在上文我演示了如何在 Kubernetes 集群上面部署单节点的 MongoDB 数据库(点击查看),但在实际的生产环境中,MongoDB 基本是以集群的方式工作的,这样才能够保证在生产遇到故障时能及时恢复,保障应用程序正常地运行和数据的安全。
MongoDB 有三种集群部署模式:
  • 主从复制模式(Master-Slaver):是一种主从副本的模式,目前已经不推荐使用。
  • 副本集模式(Replica Set):该模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。
  • 分片模式(Sharding):该模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
    由于主从复制模式目前已不推荐使用,所以本文首先介绍如何在 K8s 上搭建副本集模式的 MongoDB 数据库集群(1 2 副)。

二、多副本集群部署

1,创建 NFS 存储

    NFS 存储主要是为了给 MongoDB 提供稳定的后端存储,当 MongoDB 的 Pod 发生故障重启或迁移后,依然能获得原先的数据。
(1)这里我选择在 master 节点创建 NFS 存储,首先执行如下命令安装 NFS
yum -y install nfs-utils
yum -y install rpcbind

(2)接着要创建共享文件夹,因为本次要搭建一个主节点,两个副本节点的集群。所以我们执行如下命令创建 3 个文件夹:
mkdir -p /usr/local/k8s/mongodb/pv1
mkdir -p /usr/local/k8s/mongodb/pv2
mkdir -p /usr/local/k8s/mongodb/pv3

(3)编辑 /etc/exports 文件:
vi /etc/exports

(4)在里面添加如下内容:
/usr/local/k8s/mongodb/pv1 *(rw,sync,no_root_squash)
/usr/local/k8s/mongodb/pv2 *(rw,sync,no_root_squash)
/usr/local/k8s/mongodb/pv3 *(rw,sync,no_root_squash)

(5)保存退出后执行如下命令重启服务:
如果执行 systemctl restart nfs 报“Failed to restart nfs.service: Unit nfs.service not found.”错误,可以尝试改用如下命令:
  • sudo service nfs-server start
systemctl restart rpcbind
systemctl restart nfs
systemctl enable nfs

(6)执行 exportfs -v 命令可以显示出所有的共享目录:

(7)而其他的 Node 节点上需要执行如下命令安装 nfs-utils 客户端:
yum -y install nfs-util

(8)然后其他的 Node 节点上可执行如下命令(ipMaster 节点 IP)查看 Master 节点上共享的文件夹:
showmount -e 10.0.16.8

2,创建 PV 持久卷

(1)我们创建一个名为 mongodb-pv.yaml 的文件,文件中内容如下:
注意:配置里的 IP 地址改成实际 NFS 主机地址。
#创建第1个PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv1
labels:
app: mongodb
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: mongodb-storage
nfs:
server: 10.0.16.8
path: "/usr/local/k8s/mongodb/pv1"
persistentVolumeReclaimPolicy: Retain
---
#创建第2个PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv2
labels:
app: mongodb
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: mongodb-storage
nfs:
server: 10.0.16.8
path: "/usr/local/k8s/mongodb/pv2"
persistentVolumeReclaimPolicy: Retain
---
#创建第3个PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv3
labels:
app: mongodb
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: mongodb-storage
nfs:
server: 10.0.16.8
path: "/usr/local/k8s/mongodb/pv3"
persistentVolumeReclaimPolicy: Retain

(2)接着执行如下命令开始创建:
kubectl apply -f mongodb-pv.yaml

(3)最后执行如下命令查看所有 pv,可以看到三个持久卷均已创建成功:
kubectl get pv

3、部署 MongoDB 应用服务

(1)首先创建一个名为 mongodb-cluster.yaml 的配置文件,文件里的内容如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
selector:
matchLabels:
app: mongodb
serviceName: "mongodb-hs"
replicas: 3
template:
metadata:
labels:
app: mongodb
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongodb
image: mongo:4.4
command:
- mongod
- "--replSet"
- rs0
- "--bind_ip"
- 0.0.0.0
ports:
- containerPort: 27017
volumeMounts:
- name: mongdb-persistent-storage
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: mongdb-persistent-storage
spec:
storageClassName: mongodb-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
# headless 无头服务(提供域名供StatefulSet内部pod访问使用)
apiVersion: v1
kind: Service
metadata:
name: mongodb-hs
labels:
name: mongodb
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
app: mongodb
---
# 标准服务(供外部访问)
apiVersion: v1
kind: Service
metadata:
name: mongodb-cs
labels:
name: mongodb
spec:
ports:
- port: 27017
targetPort: 27017
nodePort: 30717
selector:
app: mongodb
type: NodePort

(2)接着执行如下命令对这个 YAML 文件进行部署:
kubectl apply -f mongodb-cluster.yaml

(3)稍等片刻,执行如下命令可以查看是否创建成功:
kubectl get pods
kubectl get service

(4)执行如下命令可以看到前面创建的 pvpod 也进行了关联:
kubectl get pv

4,配置主、副节点

(1)虽然我们已经创建了三个 Pod 实例,但它们目前还是相互独立的,接下来我们要将它们组建成集群。首先进入任意一个 Pod
kubectl exec -it mongodb-0 /bin/bash

(2)接着执行如下命令连接上任意一个 MongoDB 数据库:
bin/mongo mongodb-0.mongodb-hs.default.svc.cluster.local:27017

(3)连接成功后执行如下命令:
use adminrs

(4)接着执行如下命令开始配置副本集:
各参数说明:
  • cfg 是可以任意的名字,当然最好不要是 mongodb 的关键字,confconfig 都可以。
  • 最外层的 _id 表示 replica set 的名字(由于前面yaml文件中我们设置 replica set 的名字为 rs0,所以这里也要保持一致)
  • members 里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的 mongodb-0.mongodb-hs.default.svc.cluster.local:27017
cfg = {_id: "rs0",members:[{_id: 0,host: 'mongodb-0.mongodb-hs.default.svc.cluster.local:27017',priority: 3},{_id: 1,host: 'mongodb-1.mongodb-hs.default.svc.cluster.local:27017',priority: 2},{_id: 2,host: 'mongodb-2.mongodb-hs.default.svc.cluster.local:27017',priority: 1}]};

(5)最后执行如下命令使配置生效:
rs.initiate(cfg)

(6)稍等一会执行如下命令查看副本集状态:
rs.status()

(7)可以看到 myset 副本集中已经有一个 Primary 节点和两个 Secondary 节点,说明副本集的启动配置已完成。

5,持久化测试

(1)由于我们使用了持久卷实现数据持久化,即使将所有的服务都删除:
kubectl delete -f mongodb-cluster.yaml
kubectl delete -f mongodb-pv.yaml

(2)然后再重新部署:
kubectl apply -f mongodb-cluster.yaml
kubectl apply -f mongodb-pv.yaml

(3)可看到原来数据库里的数据仍然存在,没有丢失:
评论

全部评论(0)

回到顶部