准备运行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. Unity学习疑问记录之新GUI

    学习Unity 4.6新GUI系统 http://segmentfault.com/a/1190000000642686

  2. windows 快捷键

    Windows 系统 f6  在同一个应用的不同窗口进行切换 ctrl-shift 拖动,创建文件快捷方式 shift 右键点击文件 可以出现复制路径的菜单 WIN键组合键 Windows Key + ...

  3. UFS

    ● UFS vs eMMC 1. UFS有分离的读写通道,可以同时进行读写操作(双向),但是eMMC在同一时刻只能读或写. 2. UFS有一个命令队列,将命令进行排序.因此,多个命令可以同时处理,从而 ...

  4. 图解call、apply、bind的异同及各种实战应用演示

    一.图解call.apply.bind的异同 JavaScript中函数可以通过3种方法改变自己的this指向,它们是call.apply.bind.它们3个非常相似,但是也有区别.下面表格可以很直观 ...

  5. ThinkPHP3.2.3 的异常和错误屏蔽处理

    一.入口文件关闭调试,配置文件配置异常页面 在生产环境中系统的错误信息不能暴露给用户,入口文件的 APP_DEBUG 默认为开启状态 define('APP_DEBUG',true); 此时如果用户访 ...

  6. hadoop2.5重新编译问题

    这几天一直在搭建hadoop环境,由于2.5以及2.6的版本需要在64位环境下重新编译,所以中间走了不少弯路.现在总结一下,由于手头资源紧张,只能在pc上模拟环境,具体环境如下: 宿主机:联想的笔记本 ...

  7. PHP->利用GD库新建图像

    1.确认php中GD库是否开启 在PHP配置文件php.ini中查找extension=php_gd2.dll,去掉前边的(分号) ';' 即可,一般php是默认开启的 2.绘画步骤 创建一个画布(画 ...

  8. 关于js SDK的程序,java SDK的程序

    一:JS SDK 1.修改配置workspace 2.导入 3.Demo.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Trans ...

  9. Win8.1密钥

    Win8.1 在线永久激活密钥一枚!  78BHN-M3KRH-PCP9W-HQJYR-Q9KHD [剩余次数:7K多+] 继续增加 [Key]:HPCJW-VGYW4-CR7W2-JG6Q7-K4Q ...

  10. Advanced REST client

    好用的测试工具,老是忘记名字chrome插件 Advanced REST client