返回介绍

16.3 MongoDB 集群

发布于 2024-01-26 22:39:51 字数 3678 浏览 0 评论 0 收藏 0

本节简单讲解一下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 技术交流群。

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文