由于MongoDB是一个分布式数据库,因此我们在读取数据的过程中需要关注以下两个问题:
- 从哪里读?关注数据节点位置
- 什么样的数据可以读?关注数据的隔离性
接下来我们引入了两个参数:readPreference和readConcern来控制。
readPreference参数
readPreference决定使用哪一个节点来满足正在发起的读请求。可选值包括:
- primary:只选择主节点;
- primaryPreferred:优先选择主节点,如果不可用则选择从节点;
- secondary:只选择从节点;
- secondaryPreferred:优先选择从节点,如果从节点不可用则选择主节点;
- nearest:选择最近的节点;
我们默认的readPreference的值为primary,即从主节点上读取数据。
接下来看一下readPreference在不同场景下参数值的选择:
- 用户下订单后马上将用户转到订单详情页——primary/primaryPreferred。因为此时从节点可能还没有同步复制到新订单;
- 用户查询自己下过的订单——secondary/secondaryPreferred。查询历史订单对时效性通常没有太高要求;
- 生成报表——secondary。报表对时效性要求不高,但资源需求大,可以在从节点单独处理,避免对线上用户造成影响;
- 将用户上传的图片分发到全世界,让各地用户能够就近读取——nearest。每个地区的应用选择最近的节点读取数据。