zl程序教程

您现在的位置是:首页 >  其他

当前栏目

用这个方法,docker部署mongo集群只要3分钟

2023-02-18 16:32:45 时间

自己的小项目在使用mongodb后,会发现mongodb比起mysql是如此的简单,不用提前生成数据模型,支持ttl索引,并且每次存的数据都是一个json文档,只需要保证格式正确,可以任意的增加字段。十分方便开发小项目使用,特别当听说4.2版本后,mongodb可以支持事务,对它的喜爱又更加了一分。

#我为什么需要一个mongo副本集群

为什么不直接使用单机mongodb

MongoDB的副本集,相对单节点的MongoDB,提供了可用性、安全性、读写性能提升、实现事务等几大特性。

需要提前装好的工具:docker, docker-compose

使用docker-compose部署多服务

Docker-Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。因为这里我创建三个mongodb服务构成了集群,为了更方便的管理,就使用到了它。

1

创建mongodb用于通信的keyfile

  1. MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
  2. keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
  3. 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
  4. 可以使用任意方法生成keyFile。例如,使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。

在当前文件夹下创建conf文件夹,并执行如下命令,当前文件夹可为任意文件夹,以下所有命令行都在这个文件夹下执行。

mkdir conf

cd conf

openssl rand -base64 756 > mongodb.key

chmod 400 mongodb.key

2

创建数据持久化目录以及挂载配置目录

为了在服务重启后数据还没有丢失,我们需要建立数据持久化。这一步很简单,只需要创建目录即可。在当前目录下执行:

# 创建持久化目录

mkdir runtime && cd runtime

mkdir mongodb{0..2}

# 进入每个mongo的目录创建配置

cd mongodb0

mkdir data && mkdir data/configdb && mkdir data/configdb/mongodb.conf

cd ../mongodb1

mkdir data && mkdir data/configdb && mkdir data/configdb/mongodb.conf

cd ../mongodb2

mkdir data && mkdir data/configdb && mkdir data/configdb/mongodb.conf

3

创建docker-compose.yml文件

在当前目录下创建 docker-compose.yml文件,因为比较长,文章最后会给出这个配置。(片段如下)

yaml文件中的MONGO_INITDB_ROOT_USERNAME,MONGO_INITDB_ROOT_PASSWORD为mongo初始化服务的用户名和密码。可以修改为自己的。这里容易出错的点是挂在配置文件的路径写为/etc/mongod.conf而不是/etc/mongod.conf.orig。这样docker对mongodb的配置并不会生效。前三步后文件夹结构如下

随后我们执行在目录下执行docker-compose up -d

看到集群已经完美运行起来了

4

进入容器建立副本集

这里有个细节,有的开发者会想直接通过外部引擎直接连接到数据库如下图。

会出现连接错误的情况,但是明明27017-27019这三个端口已经被我们映射出来了。这里是因为目前挂载出来的配置还没有修改,bindIp默认127.0.0.1。如果想通过外部应用连接docker,将所有mongo下面的mongodb.conf修改为以下内容即可,这里有个坑,只添加bindIp是没用的,因为4.0版本的镜像配置文件有规范,我下面是直接把docker里面的mongo配置文件/etc/mongod.conf.orig粘贴到了外部的mongodb.conf中并修改了bindIp。直接进入到容器内部修改/etc/mongod.conf.orig也可以,注意三个mongo都要修改,如下图:

完整的mongodb.conf最后会给出。

这里我们不通过外部连接,我们进入容器内部创建副本集群。执行以下语句

#进入你想设置mongo为master节点的容器,我这里选择mongo0

docker exec -it mongo0 /bin/bash

# 进入mongo

mongo

# 修改配置需要鉴权

use admin

db.auth("admin","mima")

# 初始化配置

cfg = {_id: "rs0",protocolVersion : 1,members:[{_id: 0,host: 'mongo0:27017',priority: 3},{_id: 1,host: 'mongo1:27018',priority: 2},{_id: 2,host: 'mongo2:27019',priority: 1}]};

rs.initiate(cfg)

这里依旧有一些坑

  1. 没有指定protocolVersion,会报protocolVersion版本错误的问题。
  2. 外部应用连接会报找不到mongo1,mongo2的域名,因为我们初始化配置的时候写的mongo成员是docker内部的容器通信方式。如果要想外部连接需要修改集群配置如下。

# 修改配置(120.18.52.210改为你的公网ip名称)

cfg = {_id: "rs0",protocolVersion : 1,members:[{_id: 0,host: '120.18.52.210:27017',priority: 3},{_id: 1,host: '120.18.52.210:27018',priority: 2},{_id: 2,host: '120.18.52.210:27019',priority: 1}]};

rs.reconfig(cfg)

看到这里,你就可以创建一个mongodb的副本集群了。为了更加方便的部署,我这里将我的所有目录下的文件整理了出来,只需要下载在本地,然后进入目录conf中重新生成自己的mongo.key(参考第一章【创建mongodb用于通信的keyfile】)执行docker-compose up -d 即可成功运行。运行后,还需要进入容器改下自己的配置,参考【进入容器建立副本集】最后一个修改配置的内容将ip改为自己的即可。