MongoDB 搭建副本集
副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过Replication,将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移。
一,MongoDB版本和环境
在Windows上创建包含三个节点的副本集,使用的环境:
数据库:MongoDB 版本 3.2.9
Server 环境:Windows Server 2012 R2
可视化编程环境:Robomongo 版本 0.08.4
三台Windows Server:srv1,srv2,srv3
二,拓扑结构分析
创建一个Replica Set,包含三个成员:一个Primary 成员和两个Secondary 成员,Primary用于处理客户端请求,Secondary用于保存Primary的数据副本。客户端Application 在 Primary 节点上进行读写操作,通过Replication的异步同步机制,将数据操作同步到 Secondary 成员,在一定的延迟之后,三个成员拥有相同的数据集。
理论上,每个成员可以分布在不同的数据中心机房内,这些数据中心可能相距甚远,实现数据的异地备份;可以设置Primary 节点只负责写入操作,而使Secondary节点负责读取操作,实现数据集的读写分离;如果Primary 连接中断超过10s,其他节点会自动选举出一个Primary 节点,负责响应客户端Application的请求,实现数据的自动故障转移。
三,技术原理说明
1,以Replica Set模式启动MongoDB实例
MongoDB Instance有两种不同的启动方式:单机模式(Standalone)和副本集模式(Replica Set),在启动mongod时,如果设置 replSet 参数,那么MongoDB 实例以副本集模式启动;如果不设置replSet 参数,那么MongoDB以单机模式启动。
单机实例是指运行在服务器上的一个mongod 进程,该进程不是任何一个Replica Set的成员,因此,单机实例不能自动故障转移,在产品环境中,风险很高,如果服务器崩溃了,客户端App至少在一段时间内不可访问,如果硬件出现问题,可能会造成数据的永久丢失。建议,使用Replica Set,至少保留两份数据集副本。
2,选举Primary成员
在Replica Set中有两种成员:Primary成员和Secondary成员,一个Replica Set只能有一个Primary成员,但可以有多个Secondary成员。Primary用于处理客户端请求,Secondary用于保存Primary的数据副本。如果Primary崩溃了,Replica Set探测到Primary不可访问,将启动自动故障转移进程,从剩下的Secondary成员中,投票选举出一个成员作为Primary,接收和处理客户端的请求。
选举Primary成员时,使用“大多数”和“一票否决”原则。在Replica Set中,每个成员只能要求自己被选举为Primary节点。当一个Secondary成员无法与Primary成员连通时,该成员就会发起选举,请求其他成员将自己选举为Primary成员,只有得到“大多数”成员的支持,该成员才能被选举为Primary成员;只要有一个成员否决,选举就会取消。
不是每一个成员都有投票选举的权利,在一个Replica Set中,最多有7个成员用于投票选举的权利,Primary成员是由这7个成员选举出来的。有投票权利的成员,其属性:"votes" 是1;若为0,表示该成员没有投票权利。
3,操作日志
MongoDB使用操作日志(oplog)来实现复制(Replication)功能,oplog包含了Primary成员的每一个更新操作,通过将oplog传递到其他Secondary成员中,在其他成员中重做(redo)已经提交的操作,实现数据的异步同步。Replica Set中的每个成员都维护着自己的oplog,记录着每一个从Primary成员复制操作的数据。复制操作的过程是先复制数据,再将操作写入到oplog中。如果某一个成员在执行操作时失败,当该成员重启之后,自动从oplog中最后一个操作进行同步。由于复制操作的过程是先复制数据,再写入oplog,该成员可能会在已经同步的数据上再次执行复制操作,MongoDB在设计oplog时,就考虑到这种情况:将oplog中的同一个操作执行多次,与执行一次的结果是一样的。
oplog保存的是对每个doc的更新操作日志,如果一个命令只更新一个doc,那么Replication进程向oplog插入一条日志;如果一个命令更新多个doc,那么Replication进程向oplog插入多条日志,每一条日志只更新一个doc。
oplog的大小是固定的,只能保存特定数量的操作日志,如果Primary成员更新的数据量特别大,oplog很快就被填满,Secondary来不及同步数据,Primary成员就将oplog中的日志,这样,Secondary成员就会变成陈旧的(Stale)。建议,让Primary成员使用比较大的oplog,保存足够多的操作日志。
四,创建配置文档
1,创建mongod 启动的配置文件
在每台server上创建配置文件,将配置文件存放在目录C:\data\中。在同一个Replica Set中的所有成员必须有相同的Replica Set Name,这里设置为“rs0”。
--srv1 config_file_name:rs0_1.conf dbpath=C:\data\db\db_rs0 logpath=C:\data\db\db_rs0\rs0_1.log port=40001replSet=rs0--srv2 config_file_name:rs0_2.conf dbpath=C:\data\db\db_rs0 logpath=C:\data\db\db_rs0\rs0_2.log port=40002replSet=rs0--srv3 config_file_name:rs0_3.conf dbpath=C:\data\db\db_rs0 logpath=C:\data\db\db_rs0\rs0_3.log port=40003replSet=rs0
配置参数含义:
replSet:设置Replica Set的name,在各个配置文件中,其值必须相同。
dbpath:MongoDB用于存储数据的目录,默认值是C:\data\db
logpath:用于记录mongod的日志数据
port:指定MongoDB监听的端口,默认值是27017
2,以配置文件方式启动mongod
一般情况下,mongod的参数值是不变的,将这些参数写入到配置文件中,能够简化MongoDB的管理。
mongod 命令有参数:--config 或 -f,用于引用配置文件。
--srv1 mongod -f C:\data\rs0_1.conf--srv2 mongod -f C:\data\rs0_2.conf--srv3 mongod -f C:\data\rs0_3.conf
3,启动mongo shell
在任意一台Server上打开三个mongo shell,使用参数 --host 指定Server Name,使用 --port 指定端口号。由于mongod没有使用默认的监听端口 27017,因此,必须使用 在mongo shell中使用 --port参数显式指定监听的Port。
--connect srv1 mongo --host srv1 --port 40001--connect srv2 mongo --host srv2 --port 40002--connect srv3 mongo --host srv3 --port 40003
五,配置Replica Set
在不同的Server上运行不同的MongoDB Instance,但是,每个mongod 都不知道其他mongod的存在,为了让每个mongod能够感知彼此的存在,需要配置Replica set,增加成员。
1,使用配置文档为Replica Set 增加成员
在srv1的mongo shell中,创建配置文档,调用rs.initiate()函数,按照配置文档来初始化Replica Set。
conf=
在配置doc中,使用"_id" : "rs0" 指定Replica Set的name,members数组指定 Replica Set的成员的ID 和 host(“host:port”)。等到所有成员配置完成之后,Replica Set 会自动选举出一个Primary 节点,两个Secondary 节点。在Primary 节点上进行更新操作,就能同步到Secondary 节点了。
2,修改Replica Set
如果以rs.initiate()方式初始化Replica Set,那么MongoDB以默认配置文档初始化Replica Set,可以通过add()函数增加成员。
2.1 向Replica Set中增加一个成员
rs.add("host:port")
2.2 从Replica Set中删除一个成员
rs.remove("host")
2.3 查看Replica Set的配置
rs.conf()
2.4 重新配置Replica Set
var conf=
2.5 查看Replica Set的状态
rs.status()
六,维护Replica Set
1,查看Replica Set的配置信息
rs.conf()
配置文档主要分为三块:Replica Set 的ID和 Version,Members数组 和 Settings,下面是经过简化的配置信息。
{"_id" : "rs0","version" : 202997,"members" : [ {"_id" : 1,"host" : "srv1:40001","arbiterOnly" : false,"hidden" : false,"priority" : 5,"votes" : 1}, {...}],"settings" : { ..... } }
Replica Set的ID字段唯一标识一个Replica Set,每一个Replica Set都有一个自增的版本号,由Version字段标识,标识Replica Set的不同版本。version字段的初始值是1,每次修改Replica Set的配置时,version字段都会自增。
Settings 字段的值是应用到Replica Set中所有成员的配置信息。
最关键的是members数组的字段,标识每个成员的配置信息。
arbiterOnly:0或1,标识一个仲裁(arbiter),Arbiter的唯一作用是参与Primary的选举,Arbiter不保存数据,不会为client提供服务,它存在的意义就是为了选举Primary。
hidden:0或1,表示该成员是不是隐藏成员,Hidden成员的主要作用是备份数据,可以使用性能较差的服务器作为Hidden成员。Hidden成员不会接收Client的请求,也不会成为Primary。在设置Hidden成员时,必须设置members[n].priorty属性为0;
priority:数值类型,用于设置成员成为Primary的优先级。priority越高的成员,越有机会成为Primary。如果priority=0,那么该成员永远不会成为Primary。
votes:1或0,表示该成员的投票的数量,在每个Replica Set中,最多有7个成员,其votes属性值是1。votes 属性是1的成员(voting members)拥有选举Primary的权利。一个成员要想成为一个Primary,那么必须获得voting members的大多成员的支持。
在Replica Set中,如果voting members的数量是5,那么一个成员成为Primary的条件是:获得超过2个voting members的支持,并且没有任何voting members 反对。只要有任意一个voting member 反对该成员成为Primary,那么该成员就不能成为Primary。
2,强制一个成员成为Primary
如果将一个成员的priority属性在Replica Set的所有成员中是最高的,那么该成员最有可能成为Primary。
将成员0的priority设置5,其他成员的priority设置为1,这样,成员0成为Primary的优先级是最高的。
cfg = rs.conf() cfg.members[0].priority = 5cfg.members[1].priority = 1cfg.members[2].priority = 1rs.reconfig(cfg)
七,测试数据
1,在Primary上读写数据
db.users.insert({_id:1,name:"a",age:24})
2,在Secondary上读取数据
默认情况下,客户端不能从Secondary成员中读取数据。在Secondary成员上显式执行setSlaveOk之后,才能从Secondary节点读取数据。
rs.setSalveOk()db.users.find({_id:1})
八,查看mongod 服务器的命令行参数
db.serverCmdLineOpts()
/*
转载于:https://blog.51cto.com/hzz333/1919117
相关文章:

dfasdfasdfas
fasdfasfasdfafd转载于:https://www.cnblogs.com/lulei/archive/2006/10/17/531694.html
原型模式(Prototype)
克隆方法是我们经常使用的一种软件开发技巧,记得当年给经管系做沙盘ERP时,需要保存每年资产负债表的数据,当时对这种模式不熟悉,导致后期的数据变化使前期数据被动改变,现在想想,还是当时学艺不精ÿ…

Piccure Plus 3.1中文汉化版,Piccure Plus 3.1破解版,模糊照片变清晰神器,让你不再害怕手抖了
目前随着手机的普及化,大家随时随地都可以拍照,但是每个人拍照的水平各不相同,这种时候一款能把模糊的照片变清晰,把模糊的图片变清晰的软件就成了比不可少的东西了。 Piccure Plus 3.1中文汉化版。Piccure是一款非常强大的照片去…

java设置缓存机制
2019独角兽企业重金招聘Python工程师标准>>> java设置缓存机制 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。…
Analysis and Design Overview
前面图文我们介绍了“软件工程的六个最佳实践”以及“利用Use Case为系统行为建模”,本次我们介绍“系统分析与设计的初步”。

你是如何快捷、高效获取新知识的?
一次,同学问我“Redhat平台下的服务器叫什么?”,答案无疑是“Apach”。后来,我想他怎么不会在 Baidu 里搜索一下答案就出来籽?但这可以理解,他不是学计算机,对于这样获取知识的方式他不知道是可…

微软推出Windows XP/Server 2003紧急安全补丁:修复远程桌面CVE-2019-0708漏洞
根据CVE-2019-0708“攻击者可通过RDP向目标系统远程桌面服务发送特制请求”来远程执行系统上的代码。因为不需要用户干预,攻击可像野火一样从计算机传播到另一台计算机,从而导致整个系统受到攻击。 漏洞补丁:Windows XP补丁下载地址 漏洞补…

es5 编写类风格的代码
分享下《JavaScript忍者秘籍》中的一种编写类风格代码的方法 JavaScript可以让我们通过原型实现继承,许多开发人员,尤其是那些有传统面向对象背景的开发人员,都希望将JavaScript的继承系统简化并抽象成一个他们更熟悉的系统。所以,…
与15级新加入团队同学的约定
坚持!坚持!坚持!

【冷门实用小工具】轻量级流程图工具ClickCharts PRO绿色版,ClickCharts PRO下载【亲测有效】
下载地址:ClickCharts Pro注册版下载地址 轻量级流程图工具ClickCharts Pro注册版本,大小总共900多K,功能跟visio一样强大。 一、实用功能: 1.创建图表模板 2.可以选择各种符号和线连接风格 3.创建UML(统一建模语言)标准的可视化…

深入讨论.NET Socket的Accept方法
深入讨论.NET Socket的Accept方法 考虑一个问题,假如同时有50个连接请求进入一个服务器(这种情况对于普通负载的Web服务器都是很常见的)会怎么样?阻塞式I/O只能循环调用Accept,一个一个对50个连接进行Accept操作&…

php代码中使用换行及(\n或\r\n和br)的应用
浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;假设须要将结果输出到浏览器或打印到显示器,代码中使用br;假设仅仅是在源码中换行。则使用\n或\r\n,感兴趣的朋友能够了解下,也许对你学习php有所帮助 <?php e…
前后端分离的探索(一)
文桥,13级机械系学生。在LSGO软件技术团队负责前端部分,大家或许会惊讶,怎么一个Coding高手,非计算机或数学出身。让我告诉你一个秘密:如果你花时间去追踪技术圈内绝大多数的大牛、大神的背景,甚至跟他们聊…

【冷门实用小工具】JAVA和C#轻量级的UML图绘制工具NClass,UML类图编辑器免安装版【亲测有效】
下载地址:NClass下载地址 NClass是一款免费的UML图绘制工具,它很小巧轻量级,解压之后大小不到2M,便于携带和使用,是很实用UML绘制工具。 功能介绍: 1、支持完整的C#和Java支持多语言的特定元素…

C#读取XML点滴
今天遇到了一个xml属性值读取的问题,我先是从代码的思路、语法查找问题,都没有发现错误, 接着我又从客户端和服务器端应答的信息找问题,原来问题出在我取的xml属性值没有出现在这个xml字符串里(此处所说的xml字符串是根…

Bash之break、continue和return命令在循环中的作用
1 continue:直接跳过本次循环,进入下一次循环。#!/bin/basha10b15while [ $a -le $b ]do((a))if [ $a -eq 11 ] || [ $a -eq 13 ]thencontinuefiecho $adone[rootmaster ~]# ./a.sh121415162 break:此命令将会跳出循环#!/bin/basha8b15while …
分析与设计(AD)简介(1)
这一节主要介绍在RUP的分析与设计阶段所涉及的:Role、Activity、Workflow、Artifact。
混淆梯度(Obfuscated Gradients Give a False Sense of Security Circumventing Defense)
下载地址:https://u20150046.ctfile.com/fs/20150046-376633529 论文摘要 我们发现“混淆梯度”(obfuscated gradients)作为一种梯度掩码(gradient masking),会在防御对抗样本中导致一种错误的安全感。虽然…

在jsp中点击按钮,在bean中把已经查出的数据,生成csv文件,然后在ie中自动打开
Quote:这个问题可以分两部分讨论: 1、csv文件的格式 2、通过jsp向客户端输出csv文件 第一个问题我们就按简单的来讨论,可以认为是每个字段用""包含后再用,号分割 比如: "a","b","c" "d&q…
分析与设计(AD)简介(2)
这一节主要介绍OOAD分析与设计中涉及的几个重要概念,包括:分析、设计、体系结构、41视图、Use Case实现等。

1.3 Quick Start中 Step 7: Use Kafka Connect to import/export data官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 7: Use Kafka Connect to import/export data Step 7: 使用 Kafka Connect 来 导入/导出 数据 Writing data from the console and writing it back to the console is …

ELMo:最好用的词向量(Deep contextualized word representations)论文 pdf
下载地址:https://u20150046.ctfile.com/fs/20150046-376633397 作者:Matthew E. Peters, Mark Neumann, Mohit Iyyer, Matt Gardner, Christopher Clark, Kenton Lee, Luke Zettlemoyer 论文摘要 我们提出一种新的深层语境化的词表示形式,…

刚进园子,广州的冬天像夏天
来博客园已经有一段日子了,就好像认识朋友一样,从陌生到熟悉,虽然阅读过的博客文章还不多,但心里还是由然起敬。网络是个信息交流的工具,工具没有好坏之分,都得看用工具的人抱着什么态度。有益处的内容自然…

ava.lang.UnsatisfiedLinkError:
为什么80%的码农都做不了架构师?>>> dalvik.system.PathClassLoader[DexPathList[[zipfile"/data/app/ngdom.android.newphone-1/base.apk"], nativeLibraryDirectories[/data/app/gdom.android.newphone-1/lib/arm, /data/app/gdom.android.n…
分析与设计(AD)简介(3)
这一节主要介绍进行OOAD分析与设计所利用的工具:Visual Studio UML。

序列建模:时间卷积网络取代RNN(An Empirical Evaluation of Generic Convolutional and Recurrent)论文 pdf
下载地址:https://u20150046.ctfile.com/fs/20150046-376633283 作者:Shaojie Bai, J. Zico Kolter, Vladlen Koltun 论文摘要 对于大多数深度学习实践者来说,序列建模与循环网络是同义词。然而,最近的研究结果表明,…

Web service到底是什么?
Web service到底是什么;在什么情况下你应该使用Web service。 分布式应用程序和浏览器 研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的瘦客户应用程序。这当然不是因为瘦客户能够提供更好的用户界面࿰…
15级团队学习成果汇报 -- 利用C#语言实现计算器
前几天与15级新加入团队的同学聊天,周日时蓝贵才代表本级汇报了这段时间所学的成果——计算器实例。 我一直对他们说:“要尽快的掌握一些C#语言的基本概念,培养对Coding的感知,后面就可以‘用以致学’,通过‘用’来发…

houdini + maya的pulldownit
houdini maya的pulldownit 制作破碎、3Dtextures等http://www.linecg.com/video/play_27502_28121.html转载于:https://www.cnblogs.com/cainiao001/p/6768831.html

探索机器学习的公平性(Delayed Impact of Fair Machine Learning)论文 pdf
下载地址:https://u20150046.ctfile.com/fs/20150046-376633160 By Lydia T. Liu, Sarah Dean, Esther Rolf, Max Simchowitz, Moritz Hardt (2018) 论文摘要 机器学习中的公平性主要是在静态的分类设置进行研究,而不考虑决策如何随时间改变基础样本总…