设为首页 收藏本站
查看: 2204|回复: 0

[经验分享] 如何配置 MongoDB 副本集

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-10 09:07:15 | 显示全部楼层 |阅读模式
MongoDB 已经成为市面上最知名的 NoSQL 数据库。MongoDB是面向文档的,它的无模式设计使得它在各种各样的WEB 应用当中广受欢迎。最让我喜欢的特性之一是它的副本集(Replica Set),副本集将同一数据的多份拷贝放在一组 mongod 节点上,从而实现数据的冗余以及高可用性。
这篇教程将向你介绍如何配置一个 MongoDB 副本集。
副本集的最常见配置需要一个主节点以及多个副节点。这之后启动的复制行为会从这个主节点到其他副节点。副本集不止可以针对意外的硬件故障和停机事件对数据库提供保护,同时也因为提供了更多的节点从而提高了数据库客户端数据读取的吞吐量。

配置环境
这个教程里,我们会配置一个包括一个主节点以及两个副节点的副本集。
为了达到这个目的,我们使用了3个运行在 VirtualBox 上的虚拟机。我会在这些虚拟机上安装 Ubuntu 14.04,并且安装 MongoDB 官方包。
我会在一个虚拟机实例上配置好所需的环境,然后将它克隆到其他的虚拟机实例上。因此,选择一个名为 master 的虚拟机,执行以下安装过程。

首先,我们需要给 apt 增加一个 MongoDB 密钥:
$ sudo apt-key adv--keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
然后,将官方的 MongoDB 仓库添加到 source.list 中:
$ sudo su
# echo "debhttp://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 -ymongodb-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:nogroupkeyFile
$ 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 localhostsecondary1
192.168.50.2 primary
192.168.50.3 secondary1
192.168.50.4 secondary2
在副节点2上:
127.0.0.1 localhostsecondary2
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> showdatabases
2015-05-10T03:09:24.131+0000E 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 连接到整个副本集,你可以安装如下命令。在副本集中的失败切换是自动的。
$ mongoprimary,secondary1,secondary2:27017/?replicaSet=myReplica
如果你使用其它驱动语言(例如,JavaScript、Ruby 等等),格式也许不同。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-111763-1-1.html 上篇帖子: MongoDB 索引简单使用技巧 下篇帖子: MongoDB启动脚本 如何
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表