K8s - 安装部署MongoDB数据库教程2(多副本集群)
作者:hangge | 2022-01-29 13:41
在上文我演示了如何在 Kubernetes 集群上面部署单节点的 MongoDB 数据库(点击查看),但在实际的生产环境中,MongoDB 基本是以集群的方式工作的,这样才能够保证在生产遇到故障时能及时恢复,保障应用程序正常地运行和数据的安全。
MongoDB 有三种集群部署模式:
由于主从复制模式目前已不推荐使用,所以本文首先介绍如何在 K8s 上搭建副本集模式的 MongoDB 数据库集群(1 主 2 副)。- 主从复制模式(Master-Slaver):是一种主从副本的模式,目前已经不推荐使用。
- 副本集模式(Replica Set):该模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。
- 分片模式(Sharding):该模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
二、多副本集群部署
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 节点上可执行如下命令(ip 为 Master 节点 IP)查看 Master 节点上共享的文件夹:
showmount -e 10.0.16.8
2,创建 PV 持久卷
(1)我们创建一个名为 mongodb-pv.yaml 的文件,文件中内容如下:
(2)接着执行如下命令开始创建:
(3)最后执行如下命令查看所有 pv,可以看到三个持久卷均已创建成功:
(2)接着执行如下命令对这个 YAML 文件进行部署:
(3)稍等片刻,执行如下命令可以查看是否创建成功:
注意:配置里的 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
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
kubectl apply -f mongodb-cluster.yaml
(3)稍等片刻,执行如下命令可以查看是否创建成功:
kubectl get pods kubectl get service
(4)执行如下命令可以看到前面创建的 pv 和 pod 也进行了关联:
kubectl get pv
4,配置主、副节点
(1)虽然我们已经创建了三个 Pod 实例,但它们目前还是相互独立的,接下来我们要将它们组建成集群。首先进入任意一个 Pod:
(2)接着执行如下命令连接上任意一个 MongoDB 数据库:
(3)连接成功后执行如下命令:
(4)接着执行如下命令开始配置副本集:
(5)最后执行如下命令使配置生效:
(6)稍等一会执行如下命令查看副本集状态:
(7)可以看到 myset 副本集中已经有一个 Primary 节点和两个 Secondary 节点,说明副本集的启动配置已完成。
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 的关键字,conf,config 都可以。
- 最外层的 _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)由于我们使用了持久卷实现数据持久化,即使将所有的服务都删除:
(2)然后再重新部署:
(3)可看到原来数据库里的数据仍然存在,没有丢失:
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)