MongoDB 已经成为市面上最知名的 NoSQL 数据库。MongoDB 是面向文档的,它的无模式设计使得它在各类各样的WEB 应用当中广受欢迎。最让我喜欢的特性之一是它的副本集(Replica Set),副本集将同一数据的多份拷贝放在一组 mongod 节点上,从而实现数据的冗余以及高可用性。linux
这篇教程将向你介绍如何配置一个 MongoDB 副本集。mongodb
副本集的最多见配置须要一个主节点以及多个副节点。这以后启动的复制行为会从这个主节点到其余副节点。副本集不止能够针对意外的硬件故障和停机事件对数据库提供保护,同时也由于提供了更多的节点从而提升了数据库客户端数据读取的吞吐量。shell
配置环境数据库
这个教程里,咱们会配置一个包括一个主节点以及两个副节点的副本集。ubuntu
为了达到这个目的,咱们使用了3个运行在 VirtualBox 上的虚拟机。我会在这些虚拟机上安装 Ubuntu 14.04,而且安装 MongoDB 官方包。网络
我会在一个虚拟机实例上配置好所需的环境,而后将它克隆到其余的虚拟机实例上。所以,选择一个名为 master 的虚拟机,执行如下安装过程。app
首先,咱们须要给 apt 增长一个 MongoDB 密钥:dom
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10云计算
而后,将官方的 MongoDB 仓库添加到 source.list 中:spa
$ sudo su
# echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
接下来更新 apt 仓库而且安装 MongoDB。
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
如今对 /etc/mongodb.conf 作一些更改
auth = true
dbpath=/var/lib/mongodb
logpath=/var/log/mongodb/mongod.log
logappend=true
keyFile=/var/lib/mongodb/keyFile
replSet=myReplica
第一行的做用是代表咱们的数据库须要验证才可使用。keyfile 配置用于 MongoDB 节点间复制行为的密钥文件。replSet 为副本集设置一个名称。
接下来咱们建立一个用于全部实例的密钥文件。
$ echo -n "MyRandomStringForReplicaSet" | md5sum > keyFile
这将会建立一个含有 MD5 字符串的密钥文件,可是因为其中包含了一些噪音,咱们须要对他们清理后才能正式在 MongoDB 中使用。
$ echo -n "MyReplicaSetKey" | md5sum|grep -o "[0-9a-z]\+" > keyFile
grep 命令的做用的是把将空格等咱们不想要的内容过滤掉以后的 MD5 字符串打印出来。
如今咱们对密钥文件进行一些操做,让它真正可用。
$ sudo cp keyFile /var/lib/mongodb
$ sudo chown mongodb:nogroup keyFile
$ sudo chmod 400 keyFile
接下来,关闭此虚拟机。将其 Ubuntu 系统克隆到其余虚拟机上。
这是克隆后的副节点1和副节点2。确认你已经将它们的MAC地址从新初始化,而且克隆整个硬盘。
请注意,三个虚拟机示例须要在同一个网络中以便相互通信。所以,咱们须要它们弄到“互联网"上去。
这里推荐给每一个虚拟机设置一个静态 IP 地址,而不是使用 DHCP。这样它们就不至于在 DHCP 分配IP地址给他们的时候失去链接。
像下面这样编辑每一个虚拟机的 /etc/networks/interfaces 文件。
在主节点上:
auto eth1
iface eth1 inet static
address 192.168.50.2
netmask 255.255.255.0
在副节点1上:
auto eth1
iface eth1 inet static
address 192.168.50.3
netmask 255.255.255.0
在副节点2上:
auto eth1
iface eth1 inet static
address 192.168.50.4
netmask 255.255.255.0
因为咱们没有 DNS 服务,因此须要设置设置一下 /etc/hosts 这个文件,手工将主机名称放到此文件中。
在主节点上:
127.0.0.1 localhost primary
192.168.50.2 primary
192.168.50.3 secondary1
192.168.50.4 secondary2
在副节点1上:
127.0.0.1 localhost secondary1
192.168.50.2 primary
192.168.50.3 secondary1
192.168.50.4 secondary2
在副节点2上:
127.0.0.1 localhost secondary2
192.168.50.2 primary
192.168.50.3 secondary1
192.168.50.4 secondary2
使用 ping 命令检查各个节点之间的链接。
$ ping primary
$ ping secondary1
$ ping secondary2
配置副本集
验证各个节点能够正常连通后,咱们就能够新建一个管理员用户,用于以后的副本集操做。
在主节点上,打开 /etc/mongodb.conf 文件,将 auth 和 replSet 两项注释掉。
dbpath=/var/lib/mongodb
logpath=/var/log/mongodb/mongod.log
logappend=true
#auth = true
keyFile=/var/lib/mongodb/keyFile
#replSet=myReplica
在一个新安装的 MongoDB 上配置任何用户或副本集以前,你须要注释掉 auth 行。默认状况下,MongoDB 并无建立任何用户。而若是在你建立用户前启用了 auth,你就不可以作任何事情。你能够在建立一个用户后再次启用 auth。
修改 /etc/mongodb.conf 以后,重启 mongod 进程。
$ sudo service mongod restart
如今链接到 MongoDB master:
$ mongo <master-ip-address>:27017
链接 MongoDB 后,新建管理员用户。
> use admin
> db.createUser({
user:"admin",
pwd:"
})
重启 MongoDB:
$ sudo service mongod restart
再次链接到 MongoDB,用如下命令将 副节点1 和副节点2节点添加到咱们的副本集中。
> use admin
> db.auth("admin","myreallyhardpassword")
> rs.initiate()
> rs.add ("secondary1:27017")
> rs.add("secondary2:27017")
如今副本集到手了,能够开始咱们的项目了。参照 官方驱动文档 来了解如何链接到副本集。若是你想要用 Shell 来请求数据,那么你须要链接到主节点上来插入或者请求数据,副节点不行。若是你执意要尝试用副本集操做,那么如下错误信息就蹦出来招呼你了。
myReplica:SECONDARY>
myReplica:SECONDARY> show databases
2015-05-10T03:09:24.131+0000 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
at Error ()
at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
at shellHelper.show (src/mongo/shell/utils.js:630:33)
at shellHelper (src/mongo/shell/utils.js:524:36)
at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
若是你要从 shell 链接到整个副本集,你能够安装以下命令。在副本集中的失败切换是自动的。
$ mongo primary,secondary1,secondary2:27017/?replicaSet=myReplica
若是你使用其它驱动语言(例如,JavaScript、Ruby 等等),格式也许不一样。
但愿这篇教程能对你有所帮助。你可使用Vagrant来自动完成你的本地环境配置,而且加速你的代码。
免费领取兄弟连IT教育原创云计算培训视频/细说linux教程,详情咨询官网客服:http://www.lampbrother.net/linux/ 或者勾搭Q2430675018~
欢迎加入linux交流群 478068715