mongo3.0笔记:读负载均衡 与 写入操作一致性


1.读负载均衡

  Mongodb是通过客户端参数来设置读负载均衡的,主要通过ReadPreference这个参数来设置的,共有如下几种设置:

  (1).nearest:客户端与主节点和从属节点之间的距离,哪个近就从哪个读取。距离的单位是ping值。

  (2).primary:只从shard中的主节点进行读取。

  (3).primaryPreferred主节点优先,只有主节点不可用,才会从从属节点读取。

  (4).secondary:只从shard中的从属阶段读取。

  (5).secondaryPreferred从属节点优先,只有从节点不可用才会从主节点读。


2.写入操作一致性

  MongoDB作为典型的NoSql数据库,一个主要目标就是尽可能的提升系统吞吐量。
  他使用了BASE的基本原则来设计,即Basic available,提供基本的可用性,支持分区失败;Soft-state:软状态,允许短时间的状态不同步;Eventually Consistent:数据的最终一致性,而不是时时一致。对写入操作的可调节一致性设计就是这种设计思想的一种体现。通过WriteConcern这个类进行设置。
  (1).不安全的操作
   a)UNACKNOWLEDGED(NORMAL):将消息发送给socket即返回,不确保数据写入到数据库,因此发生网络错误时会有提示。默认值。
  (2).处于弱状态
   a)ACKNOWLEDGED(SAFE):确保已将数据写入到shard中的主节点中,这时如果有针对主节点的查询请求,已经可以查到该数据了。但不保证能从从属节点查询到。
   b)FSYNCED(FSYNC_SAFE):确保数据已写入到shard主节点的磁盘上,这样如果主节点磁盘不损坏,数据就不会因为掉电等原因丢失了。
   c)JOURNALED(JOURNAL_SAFE):确保数据写入到服务端的Journal file中,Journal file是POSIX算法中一种保障数据强一致性的一种实现。这种做法可以保证在一个shard中不是所有节点都损坏的前提下数据的安全性。但并不能保证从属节点的数据一致性。
   d)MAJORITY确保数据写入到shard中的多数节点的内存中
  (3).分布式可见
   a)REPLICA_ACKNOWLEDGED(REPLICAS_SAFE):保证数据被写入到shard中至少两个节点的内存中。如果shard中只有两个节点,客户端就可以通过nearest选项正确读取到数据了。
  (4).最终一致性
   MongoDB提供最终一致性的保证,即所有数据都写入到各节点的磁盘上,但实际操作中并没有保证最终一致性的操作设置,这种设置会影响系统的写入性能。
   
3.写入一致性与读负载均衡的配置选择
  (1).数据读取与写入一致性
    以一个shard有两个节点为例,要想实现数据读取性能最大化,那就应该使用ReadPreference.nearest()配置了,这样服务器会根据两个节点的繁忙程度决定由哪个节点对数据读取请求提供服务。但要注意MongoDB中两个节点的数据并不是时时都保持一致的。如果两个节点数据不一致,而同一个客户端发出的两次请求分别被两个节点所处理,那这个客户端就会得到不同的查询结果,这种不是由数据删除,而是由服务器状态不一致导致的低可用性在一般的应用中都是不可容忍的,因此要想使用ReadPreference.nearest()配置提高读取性能,就应该讲写入配置为WriteConcern.REPLICA_ACKNOWLEDGED。


MongoDB的操作锁是个需要改进的地方,目前锁级别已经由全局改为colletion,这大大提升了系统性能,但对一个collection既有读又有写的情况下,而且写入操作只能被shard中的主节点来处理,会大大影响系统的写入性能,实际上是一种以降低写入性能为代码,提升查询性能的做法。因此对一个实际在线的系统来说,最好的选择可能不是ReadPreference.nearest(),而是ReadPreference.SecondaryPreferred()或者ReadPreference.Secondary(),这样可以在允许数据有一定时间延迟的情况下,有效提升系统的吞吐量。
  (2).读写分离
    为了尽可能的提高MongoDB的吞吐量,有一种做法叫做读写分离,主要是数据查询与增删改操作的分离。
假设一个shard由两个节点组成,主机负责写入,使用性能较高的硬件,从机负责读取和查询,硬件性能可以差一些,使用自动主从互备的机制进行数据拷贝。这样实际上由主机拷贝过来的数据也是写入操作,只不过是单纯的顺序拷贝,性能消耗会少很多。而写入操作不会受查询锁的影响,从而达到最大吞吐量。


参考:

MongoDB应用

Mongo3.1文档

Mongo3.0 API - ReadPreference

Mongo3.0 API - WriteConcern


你可能感兴趣的:(mongo)