频道栏目
首页 > 资讯 > DB2 > 正文

MongoDB实战-驱动与复制

17-09-04        来源:[db:作者]  
收藏   我要投稿

如果正在构建应用程序,并且使用了MongoDB的复制功能,那么你需要了解三个特定于应用的话题。第一个主题与连接和故障转移有关;随后是写关注允许你决定在应用程序继续下一步之前写操作的复制程度;最后是读扩展,允许应用程序将读请求分布在多个副本之间。

1. 连接与故障转移

Mongo驱动提供了一套相对统一的界面来连接副本集,在Ruby2.4驱动版本中,连接单个节点和连接副本集,都使用Mongo::Client.new()连接。

(1) 单节点连接

可以连接到副本集的单个节点上。连接到副本集的主节点和连接到普通的单机节点没有什么区别。这两种情况,驱动都会初始化一个TCP套接字连接,运行db.isMaster命令,该条命令返回如下文档:

对于驱动而言,最终要的是该节点的isMaster字段设置为true,这表明指定节点可以是单机、主从复制里的主节点或者副本集中的主节点。在上述的这些状况中,节点都能写入,驱动的用户能执行各种CRUD操作。

(2)副本集连接

如果是连接到副本集中的一个节点,无论是主节点还是从节点,驱动都会自动发现未给出的副本集中的成员信息,不用指定你连接是副本集哪个节点。

con=Mongo::Client.new("127.0.0.1:27111")

连接结果如下,连接创建后会自动根据副本集中节点的角色改变连接的拓扑结构信息。

但是牢记一个问题,虽然副本集的故障转移时自动的,但驱动不会隐藏发生故障这一事实。处理过的过程大概是这样的:首先,主节点发生故障或者发生了新的选举。后续的请求会显示套接字连接已断开。随后由应用程序开发者来决定该怎么办,这一决定依赖于要执行的操作和应用程序的特定需求。如下图所示:

请记住,在处理后续请求时,驱动会自动尝试重新连接,然我们分析下以下的场景:假设,我们只想数据库发送读请求,在这种清苦啊个下,重试失败的读操作不会产生危害,因为它不会改变数据库的状态。但是,在假设我们向数据库发送写请求。如果不开启安全模式,就无法确定执行了多少写操作,有多少丢失在套接字的缓存里。开启安全模式后,只有最后一次的写操作会存在问题:可能它已经写到数据库中,也可能没有。有时可能会重试,也可能会抛出一个应用程序错误。驱动始终会抛出一个异常,应用程序开发者可以决定如何处理这些异常。

2. 写关注

默认运行安全模式对于大多数应用程序都是合理的,因为能够知道斜擦做正确无误地到达主节点时很重要的。但人们通常会希望更高级别的保证,写关注就能做到这一点。它允许开发者指定应用程序执行后续操作前后操作应该被复制的范围。严格来说,通过getlasterror命令的两个参数来控制写关注:w和wtimeout。

第一个参数w,接受的值通常都是最近的写操作应该被复制到的服务器总数;第二个参数是超时,如果写操作在指定的毫秒内无法完成,就会返回一个错误。例如,如果你下网写操作至少复制到一台服务器上,就可以将w设置为2.如果希望在500ms内无法完成该复制操作就超时,可以将wtimeout指定为500。请注意,如果不指定wtimeout的值,而复制又处于某些原因一直没有发生,那么操作会一直阻塞下去。

在使用驱动时,不是通过显示调用getLastError开启写关注的,而是创建一个写关注对象,或者设置合适的安全模式选项;这依赖于特定的驱动API。Ruby里可以像下面一样设置一个操作的写关注:

con.insert(doc,:safe=>{:w=>2,:wtimeout=>200})
有时,我们只是想确保写操作被复制到大部分可用节点上,这是可以简单的将w值设置为majority:
con.insert(doc,:safe=>{:w=>"majority"})
还有更高级的选项,如果我们开启了Journaling日志,还可以通过j选项前置让Journaling日志同步到磁盘上:
con.insert(doc,:safe=>{:w=>2,:集》true})
相关TAG标签
上一篇:Win10安装ST-Link驱动
下一篇:Android自定义View之画笔与画布
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站