MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的。支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。本文介绍了如何使用Docker搭建MongoDB集群。

本文我会向大家介绍如何使用Docker部署一个MongoDB集群,具体如下:

2.6.5版本的MongoDB

有3个节点的副本集(Replica set)

身份验证

持久化数据到本地文件系统

首先要准备三个运行的Docker服务器,这意味着你要准备一个安装了Docker的本地Vagrant Box虚拟机(系统可以使用CoreOS)或者使用AWS或者其它的你喜欢的方式。

步骤

Step1:你要拿到3台Docker服务器的IP地址,并且将下面给出的IP地址配置到所有的服务器上面,每一台服务器都要执行如下命令(记得要替换掉IP地址哦):

root@node *:/# export node1=10.11.32.174

root@node *:/# export node2=10.11.33.37

root@node *:/# export node3=10.11.31.176

理想情况下你并不需要这么做,这些IP都是可以通过DNS自动配置好的。但是这样会更加简单,毕竟这只是一次安装测试。

Step2:为每个节点创建密钥文件。在其中某一台服务器上面执行如下的命令,然后把密钥文件复制到其余两个服务器的同样的位置。

在这个教程中,我将把所有的东西都放在“/home/core”文件夹中。

root@node *:/# mkdir -p /home/core

root@node *:/# cd /home/core

root@node *:/# openssl rand -base64 741 > mongodb-keyfile

root@node *:/# chmod 600 mongodb-keyfile

root@node *:/# sudo chown 999 mongodb-keyfile

这个密钥文件的所有者被设置成id为“999”的用户了,因为在MongoDB的Docker容器中,这个用户需要有操作密钥文件的权限。

Step3:启动node1(即第一台Docker服务器)的MongoDB容器。它会启动一个没有身份验证机制的容器,所以我们要设置一个用户。

root@node1:/# docker run --name mongo \

-v /home/core/mongo-files/data:/data/db \

-v /home/core/mongo-files:/opt/keyfile \

--hostname="node1.example.com" \

-p 27017:27017 \

-d mongo:2.6.5 --smallfiles

现在创建一个admin用户。我们可以连接到刚刚启动的mongoDB容器,并进入一个交互式的shell环境.

root@node1:/# docker exec -it mongo /bin/bash

这时候,我们就进到MongoDB的Docker容器里面了,然后我们要打开一个mongo shell环境:

root@node1:/# mongo

上面的命令可以打开mongo shell环境。执行后你会看到这样的输出:

MongoDB shell version: 2.6.5

connecting to: test

Welcome to the MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

http://docs.mongodb.org/

Questions? Try the support group

http://groups.google.com/group/mongodb-user

>

切换到admin用户:

> use admin

switched to db admin

创建一个新的site admin 用户

> db.createUser( {

user: "siteUserAdmin",

pwd: "password",

roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]

});

创建成功的话你会看到如下的成功信息:

Successfully added user: {

"user" : "siteUserAdmin",

"roles" : [

{

"role" : "userAdminAnyDatabase",

"db" : "admin"

}

]

}

创建一个root用户:

> db.createUser( {

user: "siteRootAdmin",

pwd: "password",

roles: [ { role: "root", db: "admin" } ]

});

你会看到如下的成功信息:

Successfully added user: {

"user" : "siteRootAdmin",

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

我们已经创建好了我们以后要使用的几个用户,现在我们不会退出交互式shell环境(mongo和Docker容器的环境)。

> exit

bye

root@node1:/# exit

Step4:停止第一个MongoDB实例:

root@node1:/# docker stop mongo

Step5:这次使用密钥文件启动第一台MongoDB实例(还是在node1上面操作的)。

root@node1:/# docker rm mongo

root@node1:/# docker run \

--name mongo \

-v /home/core/mongo-files/data:/data/db \

-v /home/core/mongo-files:/opt/keyfile \

--hostname="node1.example.com" \

--add-host node1.example.com:${node1} \

--add-host node2.example.com:${node2} \

--add-host node3.example.com:${node3} \

-p 27017:27017 -d mongo:2.6.5 \

--smallfiles \

--keyFile /opt/keyfile/mongodb-keyfile \

--replSet "rs0"

注意:

--keyFile的路径是/opt/keyfile/mongodb-keyfile,这是正确的。这是密钥文件在Docker内部的地址,我们用-v选项将密钥文件映射到容器内部的那个路径上(即:/opt/keyfile/mongodb-keyfile)。

--add-host把这些信息添加到Docker容器的/etc/hosts文件中,所以我们可以使用域名而不是IP地址了。在实际的生产环境中这些信息都是DNS,这些参数都可以忽略。

Step6:连接到副本集上并且安装配置好它。这还是在node1上面进行的。我们要开启另外一个新的交互式shell环境进入mongo容器,同时开启一个mongo shell环境:

root@node1:/# docker exec -it mongo /bin/bash

root@node1:/# mongo

MongoDB shell version: 2.6.5

>

切换到admin用户下:

> use admin

switched to db admin

因为我们已经设置了一个密码,所以这次我们不得不做身份验证。我们把密码设置为:password。

> db.auth("siteRootAdmin", "password");

1

现在我们可以开启副本集:

> rs.initiate()

{

"info2" : "no configuration explicitly specified -- making one",

"me" : "node1.example.com:27017",

"info" : "Config now saved locally.  Should come online in about a minute.",

"ok" : 1

}

>

Step7:验证已经初始化的副本集的配置:

>

rs0:PRIMARY> rs.conf()

{

"_id" : "rs0",

"version" : 1,r

"members" : [

{

"_id" : 0,

"host" : "node1.example.com:27017"

}

]

}

Step8:在其余的两个节点启动MongoDB。

在node2上面执行命令:

root@node2:/# docker run \

--name mongo \

-v /home/core/mongo-files/data:/data/db \

-v /home/core/mongo-files:/opt/keyfile \

--hostname="node2.example.com" \

--add-host node1.example.com:${node1} \

--add-host node2.example.com:${node2} \

--add-host node3.example.com:${node3} \

-p 27017:27017 -d mongo:2.6.5 \

--smallfiles \

--keyFile /opt/keyfile/mongodb-keyfile \

--replSet "rs0"

在node3上面执行命令:

root@node3:/# docker run \

--name mongo \

-v /home/core/mongo-files/data:/data/db \

-v /home/core/mongo-files:/opt/keyfile \

--hostname="node3.example.com" \

--add-host node1.example.com:${node1} \

--add-host node2.example.com:${node2} \

--add-host node3.example.com:${node3} \

-p 27017:27017 -d mongo:2.6.5 \

--smallfiles \

--keyFile /opt/keyfile/mongodb-keyfile \

--replSet "rs0"

Step 9:将那两个节点加到副本集上。

回到node1节点,如果你在这里按了几次回车键(enter)的话,你会看到下面的提示:“rs0:PRIMARY”。这是因为这个节点是副本集“rso”的主节点。

rs0:PRIMARY> rs.add("node2.example.com")

rs0:PRIMARY> rs.add("node3.example.com")

我们可以通过执行下面的命令来验证其它两个节点是否正确的加到这个副本集当中:

rs0:PRIMARY> rs.status()

可能会花几分钟的时间来将node1上面的数据同步到其余的两个节点上面。你可以通过查看日志来观察每一个MongoDB的Docker容器里面发生了什么。在任意一个服务器上面执行下面的命令就可以了:

root@node*:/# docker logs -ft mongo

结论

现在你拥有了一个MongoDB集群。你可以自由的在任何时刻添加节点到这个集群上。你甚至可以关闭其中的一个节点,包括主节点,然后观察一个另外一个节点重新变成了主节点。由于这些数据都被写在了你的本机文件系统当中了,所以重启任何一个节点都不是什么大问题。

手把手教你用Docker部署一个MongoDB集群的更多相关文章

  1. Docker 部署 RocketMQ Dledger 集群模式( 版本v4.7.0)

    文章转载自:http://www.mydlq.club/article/97/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ...

  2. Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群

    前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...

  3. kubeadm部署一个Kubernetes集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具.这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm in ...

  4. 用kubeadm+dashboard部署一个k8s集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 1. 安装要求 在开始之前,部署Kubernetes集群 ...

  5. 第3章:快速部署一个Kubernetes集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点$ kubeadm in ...

  6. 使用docker快速部署一个consul集群

    作为一个开发者,有时候需要一个集群环境,之前的做法要么就是使用多个虚拟机,要么就是采用不同的端口来模拟,但是虚拟机比较占内存,而且启动慢,采用不同的端口来模拟,管理起来比较麻烦一些,程序隔离性差一些. ...

  7. 使用 Docker, 7 个命令部署一个 Mesos 集群

    这个教程将给你展示怎样使用 Docker 容器提供一个单节点的 Mesos 集群(未来的一篇文章将展示怎样很容易的扩展这个到多个节点或者是见底部更新).这意味着你可以使用 7 个命令启动整个集群!不需 ...

  8. docker部署Ceph分布式存储集群

    1.环境准备 3台virtualbox虚拟机,用来安装ceph集群,已用docker-machine安装上了docker,每台虚拟机虚拟创建一个5G的硬盘,用于存储osd数据,例如:/dev/sdb ...

  9. Linux Centos7 环境搭建Docker部署Zookeeper分布式集群服务实战

    Zookeeper完全分布式集群服务 准备好3台服务器: [x]A-> centos-helios:192.168.19.1 [x]B-> centos-hestia:192.168.19 ...

随机推荐

  1. Java实例——基于jsoup的简单爬虫实现(从智联获取工作信息)

    这几天在学习Java解析xml,突然想到Dom能不能解析html,结果试了半天行不通,然后就去查了一些资料,发现很多人都在用Jsoup解析html文件,然后研究了一下,写了一个简单的实例,感觉还有很多 ...

  2. hdu2874(lca / tarjan离线 + RMQ在线)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 给出 n 个顶点 m 条边的一个森林, 有 k 个形如 x y 的询问, 输出 x, ...

  3. 在eclipse中打开文件所在的目录

    eclipse中默认是不能直接打开文件所在的目录的,需要在文件中右键-->properties-->location,复制到资源管理器中才能打开文件所在的目录.这种方法很麻烦.这里介绍一种 ...

  4. Unity---遇到的一些坑和解决方案

    目录 1.在UGUI中的物体顺时针旋转Z是负的.(和正常3D中是相反的) 2.MoveTowards()+Vector3.Distance()控制物体的移动 3.trtransform.SetPare ...

  5. 洛谷 P2024 [NOI2001]食物链 (并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2024 这道题和团伙这道题的思想比较类似,都是一个数组分成几个集合,但这道题的思路更加混乱,建议没做 ...

  6. MySQL服务器与MySQL57服务器区别与不同处在哪里,他们各自的领域范围,能不能同时启动服务?

    安装了MySQL-5.7.18.0版本数据库,版本中包含了MySQL Workbench可视化试图工具,在服务列表栏中会有MySQL的两个服务器:如果启动第一项MySQL服务器就只能操作数据库,外界不 ...

  7. Webpack+Vue构建项目

    第一步:单纯的搭建出来我们的项目,并且通过webpack打包一个bundle.js然后运行起来 步骤: 1.建立项目必要的文件和文件夹(见截图) 2.配置webpack.develop.config. ...

  8. hutool java工具架包功能介绍

    https://blog.csdn.net/lx1309244704/article/details/76459718

  9. GUI的最终选择 Tkinter(二):Label和Button组件

    Label组件 Lable组件是用于界面上输出描述的标签,例如提示用户“您下载的电影含有未成年人限制内容,请满18岁以后点击观看!”,先来上结果图: 在来看下它的代码: from tkinter im ...

  10. 【ACM】拦截导弹 - 0-1背包问题

    拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...