16.3 MongoDB 集群
本节简单讲解一下MongoDB集群,集群的存在能很大程度上提高系统的稳定性。比如在分布式爬虫爬取过程中,MongoDB存储服务器宕机了,那整个爬虫系统将立刻陷入瘫痪。为了避免这种情况,可以使用多个MongoDB存储节点,当主节点挂掉,从节点可以立刻补充进来,保持系统的稳定运行。下面讲解通过MongoDB副本集的形式来搭建主从集群。副本集的工作模式如图16-10所示。
图16-10 副本集工作模式
从图可以看到应用服务器与主节点之间进行读写操作,主节点将数据实时地同步到从节点中,主节点和从节点之间通过心跳检测的方式进行沟通,判断是否存活。
假如主节点突然出现故障,这个时候两个从节点会通过仲裁的方式,判断谁作为新的主节点,如图16-11所示。
图16-11 节点自动切换
下面我们正式采用副本集的方式搭建MongoDB集群。首先准备三台机器,由于暂时没有这么多可用的主机,采取在一台主机上开启不同的端口,来实现三台机器的效果,搭建的方式都是一样的。选择127.0.0.1:27017作为主节点,127.0.0.1:27018和127.0.0.1:27019作为从节点,并且在主机上建立三个不同的文件夹,作为数据库存储。注意每个文件夹里面都要创建一个空的data文件夹。下面开启三个命令行窗口,来启动三个不同的mongodb服务,不同窗口的输入命令如下:
·主节点master:mongod--dbpath D:\mongodb\data--replSet repset
·从节点slave1:mongod--dbpath D:\mongodb_slave1\data--port 27018--replSet repset
·从节点slave2:mongod--dbpath D:\mongodb_slave2\data--port 27019--replSet repset
三个服务启动成功后,需要初始化副本集。随意登录其中一个服务,比如登录主节点,另启一个命令行窗口依次输入如下内容:
1.mongo 2.use admin 3.config = { _id:"repset", members:[ {_id:0,host:" 127.0.0.1:27017"}, {_id:1,host:" 127.0.0.1:27018"}, {_id:2,host:" 127.0.0.1:27019"}] }
注意这里的_id:“repset”和上面的命令参数--replSet repset要保持一样。最后输入:
rs.initiate(config);
用来初始化配置,效果如图16-12所示。
图16-12 初始化配置
这个时候接着输入:rs.status(),用来查看节点信息。图16-13表示已经成功搭建起主从节点。
图16-13 主从状态
搭建完成后,我们需要测试一下是否主从节点会自动同步。继续在命令行中输入如下命令:
use test; > db.testdb.insert({"test":"testslave"})
这个时候终止对主节点的连接,使用mongo 127.0.0.1:27018登录从节点,查看数据是否同步。依次输入:
connecting to: 127.0.0.1:27018/test repset:SECONDARY> use test switched to db test repset:SECONDARY> show tables 2016-12-04T05:49:46.273+0800 E QUERY [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1 DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19 DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16 shellHelper.show@src/mongo/shell/utils.js:754:9 shellHelper@src/mongo/shell/utils.js:651:15 @(shellhelp2):1:1
发生了错误,这是因为mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。继续输入:
repset:SECONDARY> db.getMongo().setSlaveOk(); repset:SECONDARY> db.testdb.find(); { "_id" : ObjectId("58433d64c360caed9f4a2b26"), "test" : "testslave" }
可以看到数据已经同步到从节点了,整体流程如图16-14所示。
图16-14 主从同步
最后一步测试故障发生时,主从节点是否能完成角色切换,现在强制关闭主节点master。经过一系列的投票选择操作,slave1当选主节点,如图16-15所示。
以上就是搭建MongoDB集群的过程,大家可能会问如何使用程序来访问副本集呢?方法很简单,使用Pymongo,代码如下:
from pymongo import MongoClient client = MongoClient("mongodb:// 127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019", replicaset='repset') print client.test.testdb.find_one()
图16-15 主动切换
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论