Docker 下搭建 mongodb 副本集

发布于 2024-11-17 09:24:42 字数 5672 浏览 14 评论 0

有需求需要对 mongodb 做一个容灾备份。根据官网,发现 mongodb 最新版本(4.0) 已经抛弃了主从模式而采用副本集进行容灾。副本集的优势在于:”有自动故障转移和恢复特性,其任意节点都可以是主节点,并能实现读写分离,提供高负载“。官方建议副本集最低配置三个节点。关于副本集的原理更多请参考 这位小姐姐的博客

搭建步骤

制作 mongodb 镜像

首先需要做一个 mongodb 的 docker 镜像,这里我采用 dockerfile 进行制作,dockerfile 内容如下:

# 指定镜像源
FROM  ubuntu:16.04

RUN apt-get update
RUN apt-get install gcc -y
RUN apt-get install g++ -y
RUN apt-get install make -y
RUN apt-get install wget -y

# Install MongoDB.
RUN \
  apt-key adv --keyserver  hkp://keyserver.ubuntu.com:80  --recv 7F0CEB10 && \
  echo 'deb  http://downloads-distro.mongodb.org/repo/ubuntu-upstart  dist 10gen' > /etc/apt/sources.list.d/mongodb.list && \
  apt-get update && \
  apt-get install -y mongodb-org && \
  rm -rf /var/lib/apt/lists/*

# Define mountable directories.
VOLUME ["/data/db"]

# Define working directory.
WORKDIR /data
RUN mkdir bin && mkdir log
COPY mongodb.conf ./bin/

# Expose ports.
#   - 27017: process
#   - 28017: http
EXPOSE 27017
EXPOSE 28017

# Define default command.
# CMD ["mongod", "-f", "./bin/mongodb.conf"]

这里指定了以 ubuntu 为源镜像制作 mongodb 镜像。并将 mongodb 配置文件 mongodb.conf 拷贝到镜像中,最后运行 mongodb 的启动服务。(关于 mongodb 的 dockerfile 请参考: 这里 )
mongodb.conf 的配置如下:

# 指定数据库保存位置
dbpath = /data/db/
# 指定 mongodb 运行中 log 的保存位置
logpath = /data/log/logs.log
# mongodb 的暴露端口
port = 27017
# 是否在后台运行
# fork = true
# 是否进行用户认证
# auth = true

可以看到配置文件中只指定了前三项。其中 dockerfile 文件与 mongodb.conf 必须在同一目录下。然后在该目录下使用 docker 命令制作 mongodb 镜像:

docker build -t mongodb:v1.0 .

上面命令的最后一个点不要忘记了。
没有问题的话,mongodb 的基本镜像算是制作成功了。下面就是启动一个该镜像的容器来进行验证:

docker run -it --name mongodb_test -p 27017:27017 -p 27018:27018 -v /home/root/user/mongodb_dir/data/db:/data/db -v /home/root/user/mongodb_dir/data/log:/data/log mongodb:v1.0

运行命令中将 27017 与 27018 两个端口进行了映射。并在宿主机中建立 mongodb_dir/data 文件夹,该文件夹下有 db 与 log 子文件夹,这两个子文件夹与 mongodb_test 的容器中文件夹进行了映射。进入到容器中后运行”mongod -f ./bin/mongodb.conf“即可打开 mongodb 服务。

制作 mongodb 副本集

上一步仅仅只是完成了 mongodb 服务,下面便是制作 mongodb 副本集了。因为只有一台机器,故最低需要三个节点制作副本集,这个要求我们可以用三个 mongodb 容器来代替。
首先在宿主机上建立一个文件夹 db_test(名字随意取),然后在 db_test 文件夹下建立 data1、data2、data3 三个文件夹下,这三个文件夹下再分别建立 db、log 文件夹。其目录大致如下:

--db_test
 --data1
   --db
   --log
 --data2
   --db
   --log
 --data3
   --db
   --log

这三个 data 文件夹分别用来存放三个节点(即三个 mongodb 容器) 的数据与 log。为了满足副本集的需要,我们需要重新修改 mongodb.conf 配置文件
mongodb.conf 文件如下:

dbpath = /data/db/
logpath = /data/log/logs.log
port = 27017
# 副本集的名称
replSet = testrepl
fork = true

因 mongodb.conf 配置文件变化了。所以 mongodb 的镜像我们需要重新编一次,为了好区分这里将新的镜像版本变为 2.0,运行命令:

docker build -t mongodb:v2.0 .

然后运行以下命令,创建三个 mongodb 容器:

docker run -it --name mongodb_test1 -p 27017:27017 -p 27018:27018 -v /home/root/user/db_test/data1/db/:/data/db -v /home/root/user/db_test/data1/log/:/data/log mongodb_vs:v2.0
docker run -it --name mongodb_test2 -p 27019:27017 -p 27020:27018 -v /home/root/user/db_test/data2/db/:/data/db -v /home/root/user/db_test/data2/log/:/data/log mongodb_vs:v2.0
docker run -it --name mongodb_test3 -p 27021:27017 -p 27022:27018 -v /home/root/user/db_test/data3/db/:/data/db -v /home/root/user/db_test/data3/log/:/data/log mongodb_vs:v2.0

如此,我们便打开了三个 mongodb 容器:mongodb_test1、mongodb_test2、mongodb_test3。然后在三个容器下运行”mongod -f ./bin/mongodb.conf“命令,打开三个 mongodb 服务。此时相当于有三个 mongodb 节点,但这三个节点还没有在一个副本集中。我们在最先打开的那个 mongodb 服务节点中(例如最先打开了 mongodb_test1 容器的服务),运行命令:mongo
然后输入如下命令,将三个节点加入到一个副本集中:

config={  
     _id:"testrepl",
    members:[
        {_id:0,host:"10.22.33.44:27017"},        
        {_id:1,host:"10.22.33.44:27019"},
        {_id:2,host:"10.22.33.44:27021"}]
    } 

上面的 ip 是宿主机的 ip 地址,三个端口分别对应于三个 mongodb 节点, _id 对应的是副本集的名称
上述命令运行完成后
再继续输入命令:

rs.initiate(config)

若初始化成功,则返回以下 log:

{
    "ok" : 1
}

我们也可以输入rs.status() 命令查看副本集的状态及各个节点的主从状态。
以上步骤若是没有报错的话,则一个 mongodb 副本集便搭建成功了。我们可以在主节点上插入数据,然后看其他从节点是否同步了该数据。并可以尝试把主节点断开,然后输入 rs.status() 命令查看主从关系。

总结

以上,我们就搭建了一个 mongodb 的副本集。若是副本集要进行用户认证管理,可以参考 这篇文章

参考文章

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

無處可尋

暂无简介

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文