准备运行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. Spinner的简单学习

    代码分析: package com.mecury.spinnertest; import java.util.ArrayList; import android.support.v7.app.Acti ...

  2. 【iCore3 双核心板_ uC/OS-III】例程七:信号量——任务同步

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

  3. Properties类使用

    package com.emolay.util; import java.io.IOException; import java.io.InputStream; import java.util.Pr ...

  4. symmetric multiprocessor

    https://en.wikipedia.org/wiki/Symmetric_multiprocessor_system A symmetric multiprocessor system (SMP ...

  5. css3翻牌效果

    原理:通过css3属性-webkit-transform: rotate(0deg)与-webkit-transform: rotate(180deg)对2个元素设置正反面 然后通过有过渡(trans ...

  6. 当html标签不被识别时(不解析)不妨试试htmlspecialchars_decode();试试

  7. Python开发【第三章】:Python的文件操作

    一.文件操作模式概述 1.打开文件的模式: r, 只读模式[默认] w,只写模式[不可读:不存在则创建:存在则删除内容:] a, 追加模式[不可读:不存在则创建:存在则只追加内容:] 2." ...

  8. 如何使用Sitemap和menu创建网站导航

    1.添加Sitemap文件 将Sitemap内容替换为如下示例代码: <?xml version="1.0" encoding="utf-8" ?> ...

  9. spring MVC配置详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过 ...

  10. 从零开始学Linux[一]:基本命令:系统信息、目录、文件、文件编辑

    摘要:linux基础学习:系统信息.目录.文件查找.文件操作.查看文件内容及大小.软链接.VIM使用. 现在Linux的使用非常普遍.对于一个小白来说,满屏幕的字母,看起来就是一头雾水~   目前由于 ...