用这个方法,docker部署mongo集群只要3分钟
自己的小项目在使用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
- MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
- keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
- 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
- 可以使用任意方法生成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)
这里依旧有一些坑
- 没有指定protocolVersion,会报protocolVersion版本错误的问题。
- 外部应用连接会报找不到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改为自己的即可。
相关文章
- 前端利器躬行记(5)——Git
- Linux安装Nginx(菜鸟教程简单易懂)
- Git 常见问题 冲突原因分析及解决方案
- Linux安装Nginx
- Linux时区
- Linux 查看系统配置参数
- Linux 防火墙开放端口(有时不生效可能是没有保存、重启导致)
- Linux安装Redis
- Linux权限
- GitHub 热点速览 Vol.27:程序员的自我救赎——GitHub 摸鱼
- GitHub 热点速览 Vol.26:手把手带你做数据库
- 《HelloGitHub》第 51 期
- GitHub 热点速览 Vol.25:距离优雅编程你差个它
- GitHub 热点速览 Vol.24:程序员自我增值,优雅赚零花钱
- GitHub 热点速览 Vol.23:前后端最佳实践
- GitHub 热点速览 Vol.22:如何打造超级技术栈
- 《HelloGitHub》第 50 期
- GitHub 热点速览 Vol.21:Go 新手起手式,学就完事儿了
- 第 6 篇:django rest framework 分页接口
- GitHub 热点速览 Vol.20:VSCode 插件全家桶新增画图小能手