mongodb中的副本集搭建实践
准备运行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中的副本集搭建实践的更多相关文章
- mongodb 4.0副本集搭建
		
近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1. 准备工作 1.1 下载软件 选择版本并下 ...
 - mongodb安装及副本集搭建
		
mongodb下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tg ...
 - mongodb副本集搭建过程中的问题和解决技巧
		
在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天 ...
 - MongoDB副本集搭建及备份恢复
		
一.MongoDB副本集(repl set)介绍 早起版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主: 目前已经淘汰了ma ...
 - windows版本 MongoDB副本集搭建及开启身份验证
		
------------恢复内容开始------------ ------------恢复内容开始------------ MongoDB副本集搭建 我搭建的是一个主节点,两个副节点 构建目录结构如下 ...
 - mongo副本集搭建及服务器复用方案
		
比较常见的mongodb副本集搭建是有:常规节点.数据副本.仲裁节点组成,也就是需要三台服务器组建.常规节点即数据的主存储节点,数据副本是主存储节点的从属节点,它定期去主节点获取更新日志来更新自己.仲 ...
 - Mongodb3.0.5副本集搭建及spring和java连接副本集配置
		
这是去年写的一篇文档,最近突然发现并没有发不出来,因此现在补上,希望能对某些朋友有所帮助.因为当时记录时没有截图,因此这里看起来可能就比较单调. 一.基本环境: mongdb3.0.5数据库 spri ...
 - MongoDB主从复制和副本集
		
MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选.对于简单的主从复制无法自动故障转移 ...
 - 【六】MongoDB管理之副本集
		
一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数 ...
 
随机推荐
- Trie树
			
一.什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串( ...
 - Mysql5.5命令行修改密码
			
今天下载了mysql5.5.45免安装版,配置好之后发现mysql默认是没有设置密码的,也就是密码为空. 如果是本机作开发测试用,有无密码倒也无所谓,不过发布在服务器上没有密码肯定是不行的,那就需要设 ...
 - php SPL学习
			
数据结构 SplDoublyLinkedList - 该SplDoublyLinkedList类提供了一个双向链表的主要功能 SplStack - 该SplStack类提供了一种使用双向链表实现栈的主 ...
 - centos7 挂载数据盘
			
centos 挂载数据盘1.运行 fdisk -l 命令查看数据盘.注意:在没有分区和格式化数据盘之前,使用 df -h 命令是无法看到数据盘的. 如果执行了 fdisk -l 命令后,没有发现 /d ...
 - Example Microprocessor Register Organizations
			
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION
 - Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
			
一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...
 - 深入理解Spark RDD
			
RDD是什么? RDD,全称是Reslilient Distributed Datasets,是一个容错的,并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区.同时,RDD还 ...
 - 如何用ajax提交多组同样的数据(数组)到后台?
			
我在AJAX中这样写 $("#subbutton").click(function(){ var machineCode_1=$("#machineCo ...
 - JS中isPrototypeOf 和hasOwnProperty 的区别
			
1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object ...
 - SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
			
SQLServer2005+ 附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 我们在用Sql SQLServer2005+附加数据库文件时弹出错误信息如下图的处理办法: 方案一: ...