MongoDB可以支持裸机运行、容器运行和Kubernetes集群运行等多种方式,其中Kubernetes上可以采用yaml部署容器、Helm Chart部署和Operator等方式,运行的动态伸缩能力有所不同。我在Kubernetes上部署MongoDB采用helm chart,还是有一些问题(非授权模式部分功能无法使用),Operator还在开发之中。部署完成后,可以使用mongo shell或者mongodb compass(如下图)来进行管理。
1、裸机部署mongodb
安装 MongoDB 服务,参考:
- MongoDB官方文档,https://docs.mongodb.com/manual/installation/
- Ubuntu安装, https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
首先,添加apt源的key:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
添加 apt source,如下:
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
安装mongdb软件,执行:
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo apt install mongodb-org-tools mongodb-org-shell mongodb-server-core
设置版本保持(为固定的版本),执行:
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections
安装完毕。
2、启动MongoDB服务
2.1 启动服务进程
直接启动为命令行任务,执行:
mongod --port 27017 --dbpath /home/supermap/gvzr00/mongodb/mongodbx --bind_ip 10.1.1.203
作为服务,启动 mongod,执行:
sudo service mongod start
2.2 确认 MongoDB 启动成功
检查 mongod 集成成功启动,检查log 文件,位于 /var/log/mongodb/mongod.log
,是否出现:
[initandlisten] waiting for connections on port 27017
27017
是独立模式下的缺省 mongod 服务端口。
你可以看到一些非致命的 mongod 警告输出信息,在初始的评估MongoDB阶段,可以安全地忽略掉这些警告信息。
2.3 停止 MongoDB服务
停止 mongod 服务,使用命令:
sudo service mongod stop
2.4 重新启动MongoDB
执行下面的命令:
sudo service mongod restart
2.5 使用MongoDB
启动 mongo shell 在与 mongod同一个主机上,运行 mongo shell,不带任何命令行参数连接到 mongod服务,缺省主机为localhost,端口27017:
mongo
使用mongo shell的更多连接参数, 如使用不同的主机和端口,参阅 The mongo Shell。
MongoDB 提供了 Getting Started Guides,参阅 Getting Started 获取不同的版本信息。
3、Docker部署MongoDB
只需要一个命令即可启动MongoDB服务,具体操作和使用方法与裸机方式基本相同。如下:
$ docker run -d --name mongo --restart=always -p 27017:27017 mongo:4.1
通过compose来运行,示例 stack.yml
部署 mongo
如下:
# Use root/example as user/password credentials
version: '3.1'
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: example
4、Helm Chart部署MongoDB
使用Helm Chart可以快速部署MongoDB到Kubernetes集群中。但是,由于Helm Chart开发和MongoDB版本变化的原因,一些部署参数需要根据实际情况调整才能正常运行起来。
helm install --namespace mongodb --name mongodb ./mongo-helm
4.1 固定节点
作为服务,需要固定的IP主地址或者通过Ingress作为访问入口进行服务的重定向。作为最为简单的入门,我将其部署到固定节点,通过修改helm chart的values.yaml文件,然后更新helm部署即可。添加如下的信息:
nodeSelector:
kubernetes.io/hostname: podc02
4.2 存储使用
可以使用本地存储(需要固定运行的节点)或者网络存储(我这里用GlusterFS)。当然,也可以使用NSF/Ceph/iSCSI等存储系统(我没有测试过)。
- Hostpath存储
创建本地存储卷,如下:
PV-物理卷创建yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb
namespace: mongodb
spec:
capacity:
storage: 80Gi
accessModes:
- ReadWriteMany
hostPath:
path: /home/supermap/mongodb/mongodb
PVC-卷声明创建yaml::
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mongodb
namespace: mongodb
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 80Gi
- GlusterFS
创建相应的卷即可,如下:
endpoint创建yaml:
apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs-gvzr00
namespace: mongodb
subsets:
- addresses:
- ip: 10.1.1.193
- ip: 10.1.1.234
- ip: 10.1.1.205
- ip: 10.1.1.112
ports:
- port: 10000
protocol: TCP
pv-物理卷创建yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb
namespace: mongodb
spec:
capacity:
storage: 800Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: "glusterfs-gvzr00"
path: "gvzr00/mongodb/mongodb"
readOnly: false
pvc-卷请求创建yaml:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mongodb
namespace: mongodb
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 800Gi
4.3 权限控制
在裸机部署下,可以按照官方文档的方式使用。
- 缺省情况下,不需要账号密码即可访问。
- 然后创建账号数据库,再将mongod添加 -auth参数启动,即可启用认证访问模式。
但在Kubernetes部署中,缺省部署未使用授权模式。出现的一些问题包括:
- 但是db.tables等命令提示需要授权才能使用。
- 对admin数据库调用createUser时也提示需要授权才能使用。
- 因为无法创建账户数据库,因此无法启用授权模式。
- 需要进一步调整helm chart的参数,待续。
5、Operator部署
Operator是Kubernetes的一种应用管理自定义资源。
通过Kubernetes的操作器(Operator),可以管理mongdb集群多个实例的动态运行情况。获取关于mongodb operator的信息,参考:
或者,访问最新的 https://www.operatorhub.io/ 获取版本,使用参考:
目前,该Operator还在开发之中,仅用于评估。
6、更多参考
- 管理 GUI。
- Bitnami的容器镜像。
- https://hub.docker.com/r/bitnami/mongodb
- https://github.com/bitnami/charts/tree/master/upstreamed/mongodb
- 启用Auth权限控制。
- Kubernetes Operator。