杀将 發表於 2019-6-3 19:15:00

mongodb写入策略(WriteConcern)

<h1>写入策略(WriteConcern)</h1>
<p>mongodb的写入策略有多种方式,写入策略是指当客户端发起写入请求后,数据库什么时候给应答,mongodb有三种处理策略:客户端发出去的时候,服务器收到请求的时候,服务器写入磁盘的时候</p>
<p>Unacknowledged</p>
<p>客户端发出请求丢到socket的时候就收到相应,这个时候客户端不需要等地服务器的应答,但是的本地的驱动还是尽可能的通知客户端网络的异常,这和客户端操作系统的配置有关。就像现实中邮寄信件一样,丢到信箱就结束了,但是如果信箱坏了,发信人还是能知道的。</p>
<p>Acknowledged</p>
<p>这种方式客户端发送接口会等待服务器给的确认,这种方式一定能确保服务器收到了客户端的请求,并且服务器能够异常时,响应客户端。</p>
<p>Journaled</p>
<p>Journaled方式相比Acknowledged的方式是要保证服务器端已经写入到硬盘文件了。对于Acknowledged的方式有可能服务收到请求数据相应客户端后的一瞬间当机了,这个数据就丢失了,但是对于Journaled方式,服务器保证写入到磁盘后再相应客户端,即使当机了,也不会导致数据丢失。</p>
<p>Replica Acknowledged</p>
<p>这个方式和Acknowledged是一样的意思,适用于Replica sets模式。Acknowledged模式下只有一台机器收到了请求就返回了,对于复制集模式有多台机器的情况,可以要求有多台机器收到写入请求后再相应客户端。这种更安全,但是导致了客户端耗时增加,所以要结合自己的场景设置合适的策略。</p>
<p>可以通过下面的方式设置默认的策略,majority表示多数节点写入成功后才相应客户端,也可以替换成具体的数子,比如w:2表示至少写入2个节点才返回。wtimeout表示超时时间,还有一个参加 j 可以设置true,false表示是否是写入日志才返回。</p>
<pre><code class="hljs python">cfg = rs.conf()
cfg.settings.getLastErrorDefaults = { w: <span class="hljs-string">"majority", wtimeout: <span class="hljs-number">5000 }
rs.reconfig(cfg)</span></span></code></pre>
<p>也可以通过客户端来指定具体的策略,如下: 至少要写入两个节点,超时时间是5s</p>
<pre><code class="hljs css"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.products<span class="hljs-selector-class">.insert(
   { <span class="hljs-attribute">item: <span class="hljs-string">"envelopes", qty : <span class="hljs-number">100, type: <span class="hljs-string">"Clasp" },
   { <span class="hljs-attribute">writeConcern: { w: <span class="hljs-number">2, wtimeout: <span class="hljs-number">5000 } }
)</span></span></span></span></span></span></span></span></span></span></code></pre>
<p>如果复制集是3台机器,写入两台机器,流程如下:</p>
<p><img title="请输入图片描述" src="https://cdn2.izhong.me/blog/mongodb/crud-write-concern-w2.bakedsvg.svg" alt="请输入图片描述"></p>
<h1>参考资料</h1>
<p>https://docs.mongodb.com/manual/reference/write-concern/<br>https://docs.mongodb.com/manual/core/replica-set-write-concern/</p><br><br>
来源:https://www.cnblogs.com/ExMan/p/10969496.html
頁: [1]
查看完整版本: mongodb写入策略(WriteConcern)