准备运行1个主节点,2个从节点,从节点中其中是一个是仲裁节点(Arb)。

sudo mongod --replSet application --dbpath /data/node1/ --port  --oplogSize
sudo mongod --replSet application --dbpath /data/node2/ --port --oplogSize
sudo mongod --replSet application --dbpath /data/arbiter/ --port --oplogSize

其中application是副本集的名称,节点必须相同,–dbpath指定数据库储存路径,–port指定侦听端口,–oplogSize指定数据同步之前的缓存的空间大小,暂时指定1G。选择9927端口的实例为主节点,进入9927的shell:

mongo localhost:

初始化副本集需要配置表,申明配置表如下:

config = {_id: "application", members: []}

注意_id和副本集启动的共享名称一致。下面来逐步添加节点的数据信息:

config.members.push({_id: , host: "localhost:9927"})
config.members.push({_id: , host: "localhost:9928"})
config.members.push({_id: , host: "localhost:9929", arbiterOnly: true})

也可以使用rs.add和rs.addArb函数来实现同样的操作。然后需要用这个表作为参数初始化副本集,在9927端口的shell执行:

> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" :
}

返回ok为1表示初始化成功,三个节点互相检测通信,需要1分钟左右(反应够慢的 ^-),可以查看三个终端窗口的信息确认,完成通信后,在9927端口的shell回车执行命令确认配置:

> rs.isMaster()
{
"setName" : "application",
"ismaster" : true,
"secondary" : false,
"hosts" : [
"localhost:9927",
"localhost:9928"
],
"arbiters" : [
"localhost:9929"
],
"primary" : "localhost:9927",
"me" : "localhost:9927",
"maxBsonObjectSize" : ,
"localTime" : ISODate("2013-01-26T13:34:03.378Z"),
"ok" :
}

注意到9927端口的实例ismaster是true,secondary为false,hosts有2个实例,arbiter有1个元素,primary关键key表示了主节点,通信完成几次回车后可以看到9927的端口的实例shell的提示符已经改变,更改为application:PRIMARY,查看更详细的信息:

application:PRIMARY> rs.status()
{
"set" : "application",
"date" : ISODate("2013-01-26T13:34:35Z"),
"myState" : ,
"members" : [
{
"_id" : ,
"name" : "localhost:9927",
"health" : ,
"state" : ,
"stateStr" : "PRIMARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2013-01-26T13:33:20Z"),
"self" : true
},
{
"_id" : ,
"name" : "localhost:9928",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : Timestamp(, ),
"optimeDate" : ISODate("2013-01-26T13:33:20Z"),
"lastHeartbeat" : ISODate("2013-01-26T13:34:34Z"),
"pingMs" :
},
{
"_id" : ,
"name" : "localhost:9929",
"health" : ,
"state" : ,
"stateStr" : "ARBITER",
"uptime" : ,
"lastHeartbeat" : ISODate("2013-01-26T13:34:34Z"),
"pingMs" :
}
],
"ok" :
}

显示了每个节点的健康状况,名称,启动的时间,节点的类型等。查看当前副本集的配置表:

application:PRIMARY> rs.conf()
{
"_id" : "application",
"version" : ,
"members" : [
{
"_id" : ,
"host" : "localhost:9927"
},
{
"_id" : ,
"host" : "localhost:9928"
},
{
"_id" : ,
"host" : "localhost:9929",
"arbiterOnly" : true
}
]
}

插入测试数据:

application:PRIMARY> db.users.insert({username: "visionwang", age: })

进入9928从节点,执行查看集合:

application:SECONDARY> show collections
application:SECONDARY> show collections
Sat Jan :: uncaught exception: error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

发现shell抛出了异常,显示slaveOK为false,当前副本集需要明确从节点参数,执行函数:

application:SECONDARY> rs.slaveOk()
application:SECONDARY> show collections
system.indexes
users

查询测试数据:

application:SECONDARY> db.users.find()
{ "_id" : ObjectId("5103dbc8f556a05a96a28e69"), "username" : "visionwang", "age" : }

插入数据没有抛出异常,但是显示not master,表示当前从节点是只读的:

application:SECONDARY> db.users.insert({username: "nl", age: })
not master

切换到9927主节点,使用系统空间库查询副本集信息:

application:PRIMARY> db.system.replset.findOne()
{
"_id" : "application",
"version" : ,
"members" : [
{
"_id" : ,
"host" : "localhost:9927"
},
{
"_id" : ,
"host" : "localhost:9928"
},
{
"_id" : ,
"host" : "localhost:9929",
"arbiterOnly" : true
}
]
}
application:PRIMARY> db.getReplicationInfo()
{
"logSizeMB" : ,
"usedMB" : 0.01,
"timeDiff" : ,
"timeDiffHours" : 0.05,
"tFirst" : "Sat Jan 26 2013 21:33:20 GMT+0800 (CDT)",
"tLast" : "Sat Jan 26 2013 21:36:09 GMT+0800 (CDT)",
"now" : "Sat Jan 26 2013 21:48:07 GMT+0800 (CDT)"
}

进入9929端口,可以看到仲裁节点的提示符号:

mongo localhost:
application:ARBITER>

执行故障转移测试,可以ctrl+c掉9927的主节点,观察终端信息提示,9927处于down状态,9928从节点自举为主节点,回车后发现shell提示符号已经更改为application:PRIMARY,再将9927上线,添加为从节点,再ctrl+c掉9928节点,经过少许时间,9927端口又恢复成主节点,再将9928上线,系统恢复到初始的副本集,仲裁节点的作用是协调leader选举,监测系统运行状态,提供节点互相通讯的数据信息。

mongodb也支持简单的主从复制,但是有了强大的副本集,几乎找不到什么理由使用简单的主从复制策略,甚至mongodb的分片(auto-sharding)也是使用副本集实现。

51CTO也有一个windows上面的版本http://database.51cto.com/art/201301/379033.htm。

mongodb中的副本集搭建实践的更多相关文章

  1. mongodb 4.0副本集搭建

    近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1.  准备工作 1.1 下载软件 选择版本并下 ...

  2. mongodb安装及副本集搭建

    mongodb下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tg ...

  3. mongodb副本集搭建过程中的问题和解决技巧

    在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天 ...

  4. MongoDB副本集搭建及备份恢复

    一.MongoDB副本集(repl set)介绍 早起版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主: 目前已经淘汰了ma ...

  5. windows版本 MongoDB副本集搭建及开启身份验证

    ------------恢复内容开始------------ ------------恢复内容开始------------ MongoDB副本集搭建 我搭建的是一个主节点,两个副节点 构建目录结构如下 ...

  6. mongo副本集搭建及服务器复用方案

    比较常见的mongodb副本集搭建是有:常规节点.数据副本.仲裁节点组成,也就是需要三台服务器组建.常规节点即数据的主存储节点,数据副本是主存储节点的从属节点,它定期去主节点获取更新日志来更新自己.仲 ...

  7. Mongodb3.0.5副本集搭建及spring和java连接副本集配置

    这是去年写的一篇文档,最近突然发现并没有发不出来,因此现在补上,希望能对某些朋友有所帮助.因为当时记录时没有截图,因此这里看起来可能就比较单调. 一.基本环境: mongdb3.0.5数据库 spri ...

  8. MongoDB主从复制和副本集

    MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选.对于简单的主从复制无法自动故障转移 ...

  9. 【六】MongoDB管理之副本集

    一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数 ...

随机推荐

  1. IOS第一天

    第一天(hello world) 1>UIView所有的控件都继承UIView,倒位置,宽度和高度..UIButton UILable 2>UIViewController .h 是声明属 ...

  2. Color Space: HSV

    HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮.色彩 ...

  3. C#编码标准

    一.命名约定 1.PascalCasting PascalCasing 每一个单词第一个字母大写,其余字母均小写.例如:FileAccess,ArraySegment等. 除了参数.变量.常量外,所有 ...

  4. 【iCore3 双核心板】例程三十:U_DISK_IAP_FPGA实验——更新升级FPGA

    实验指导书及代码包下载: http://pan.baidu.com/s/1jH1TiKY iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  5. most queries (more than 90 percent) never hit the database at all but only touch the cache layer

    https://gigaom.com/2011/12/06/facebook-shares-some-secrets-on-making-mysql-scale/ Facebook shares so ...

  6. 【转】arcgis server site 快速恢复与重建

    作者:suwenjiang 出处:http://www.cnblogs.com/myyouthlife/ 具体链接:http://www.cnblogs.com/myyouthlife/p/48985 ...

  7. 接口测试从未如此简单 - Postman (Chrome插件)

    接口测试从未如此简单 - Postman (Chrome插件) 一个非常有力的Http Client工具用来测试Web服务的, 我这里来介绍如何用它测试restful web service 注:转载 ...

  8. SevenZip.pas BUG修改版 - 20160613

    原始版本: Henri Gourvest <hgourvest@gmail.com> 1.2版本 BUG修改: 1.对于文件名中带有空格的文件, 无法压缩, 原因是1488行, 压缩调用的 ...

  9. 如何用按钮的click事件去触发a标签的click事件

    在jQquery中,可以用如下方式触发input.a标签的click事件: <input id="my_input" /> <a id="my_a&qu ...

  10. delphi之动态库调用和串口通讯

    串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...