您的位置:首页 > 数据库 > Mongodb

MongoDB-Replica Set Read and Write

2015-10-14 17:48 405 查看
无论MongoDB是以单个节点或是复制集的形式存在,对于应用程序是透明的。默认情况下,MongoDB的读请求将在主节点上执行,并一直与最后一次的写操作保持数据的一致性。用户可以配置每一个连接的复制集读选项来让将其读请求发送到从节点上。这种情况的出现一般和数据的最终一致性有关,虽然从节点的数据集最终会和主节点保持一致,但从节点进行的读操作并不能保证严格数据一致性。为了保证从节点读操作的数据一致性,可以配置客户端来确保写操作应用到复制集的所有节点才算成功。

Write Concern  for Replica Set

Verify Write Operations to Replica Set

复制集在默认安全写级别下,仅确认数据是否写入主节点。然而,我们可以修改安全写级别来确保写操作在复制集中指定个数的节点完成写操作。





我们可以在每次写操作指定安全写级别来规避默认安全写级别。在安全写级别设置超时限制,可以避免在复制集节点达不到目标时造成阻塞。


Modify Default Write Concern

我们可以通过修改复制集配置中getLastErrorDefaults来设置复制集的默认安全级别。下面的配置命令效果是:写操作只有在复制集中多数节点回应后才会完成。


Custom Write Concerns

你可以给复制集中某个成员打标签,然后根据标签来设置安全级别。

Read Preference

复制集读选项决定了在复制集中读操作的路由方式。

默认情况下,应用程序将直接在复制集的主节点上进行读操作,确保数据返回的数据是最新的数据。但对数据没有严格一致性要求的情况下,也可以将部分或全部读操作发送到从节点上,提升读性能,降低应用程序的延迟。

Use Cases

Indications

下列是复制集读选项在非Primary节点上进行的用例:

执行系统名将不会影响前端的应用。
为地理分布式架构的应用提供了本地读操作。如果应用程序分布多个数据中心,可以考虑使用异地分布式架构的复制集,并使用非主节点读取时nearest模式的复制集读选项。让客户端从最近,延迟最低的节点读取数据。
故障切换过程保持可用性。

 

Read Preference Modes

MongoDB的驱动支持5中复制集选项:

Read Preference ModeDescription
primary默认操作,所有的读操作都在复制集的主节点上进行
primaryPreferred在大多数情况下,读操作在主节点上进行,如果主节点不可用了,读操作就会转移到从节点上执行
secondary所有的读操作在从节点上执行
secondaryPreferred大多数情况,读操作在从节点上进行,如果从节点不可用了,读操作将会转移到主节点上进行
nearest读操作会在复制集中网络延迟最小的节点上执行

Tag Sets

标签设置可以让我们将复制集读选项与安全写级别获取标签的方式是不同的。当需要选择从哪个从节点上进行读操作,复制集的读选项会操作标签值。安全写级别在选择标签时只考虑标签的值是否唯一,与标签具体数据无关。

标签一般而言只适用于在从节点上进行查询请求的复制集读选项,不适用primary模式。当nearest与标签结合使用时,就会匹配到最低网络延迟的节点,这个节点可能是主节点。

Read Preference Processes

MongoDB驱动通过下列流程来管理复制集和分片集群中的操作。为了决定如何路由它的操作,应用程序定期获取复制集的状态图,包括:节点是否活着,哪个节点是主节点,检查每个mongod实例的延迟情况。

Member Selection

客户端经由他们的驱动或是分片集群中得到mongos实例定期获取复制集的状态图。

当选择non-primary模式的复制集读选项时,驱动将通过下列流程决定操作的发送目标:

手机可用的节点名单,并按节点类型分类
如果定制的标签,则排除不符合标签的节点
判断出最近的可用节点
将这些节点与网络中其他节点的延迟列出。这个阶段,应用程序可以设置可接受的延迟门槛
在这些节点中随机选取一个,并进行读操作
接下来,驱动就会请求与其绑定。

Request Association

由于复制集中不同从节点的数据可能比主节点有不同程度的延迟,且读请求每次可能发往不同节点上。为了防止读操作先后从不同的节点上进行读取,我们可以通过驱动来在第一次读操作之后将该线程与该节点进行绑定,从而让此后的读请求都发送到该节点上。该线程将会一直在该节点上进行读操作一直到:

应用程序用不同的复制集读选项执行了一次操作
该线程终止了
客户端收到socket异常
当使用请求绑定的时候,如果客户端发现复制集选举出了新的主节点,那么驱动会解除所有线程之间的关联。

Auto-Retry

MongoDB驱动与复制集中的mongod实例之间连接需要考虑以下两个平衡点:

客户端应尽量获取最近的数据集,且如果可能,所有连接都应该在复制集中同一个节点进行读操作
客户端需要尽量减少因为连接,网络问题或是复制集中故障切换导致的无法连接数据库的时间
MongoDB驱动与mongos应:

在建立与实例的连接后,尽可能对指定了该mongod实例的连接进行再利用,将连接与该mongod实例进行绑定
如果mongod上的连接丢失了,应用程序会尝试重连到一个符合现有复制集读选项的新节点上
检测到发生故障切换后,驱动尽快刷新来获取最近的复制集状态
当发生了故障切换后,复制集中的所有节点都会关闭所有现有连接并返回报错。

Read Preference in Shard Clusters

在大多数分片集群中,每个分片是由一个复制集组成。因此,复制集读选项对其也适用。

与普通复制集不同的是,在分片集群中,所有分片的交互式通过客户端到mongos实例后再连接到各个复制集的。mongos实例负责处理应用程序传过来复制集读选项,且对应用程序是透明的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: