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-sync:同步远程和本地MongoDB数据库
mongo-action是一个Github Action,它使用官方创建mongo Docker容器。 MongoDB实例的端口将暴露给其他容器以及运行Github Workflow的主机。 输入项 image-version 可选:要使用的mongo Docker映像版本。 默认值: ...
mongo笔记大全,小白入门必备
该项目使用 Hadoop 2.6.0 和 Mongo Hadoop 连接器 1.3.1。 在 Mac 上运行此应用程序的步骤: 安装 MongoDB 安装自制软件使用自制软件安装 Hadoop。 使用此命令行:$ brew install hadoop。 此链接: : 有在 Mac 上...
arm64内核的mongo镜像 安装脚本 version: '2.1' services: mongodb: container_name: mongodb image: mongo:5.0.10 ports: - "27017:27017" restart: always #command: #- "--auth" environment: #MONGO_...
php_mongo-1.6.0-5.3-ts-vc9-x86 适用于PHP5.3 ts-vc9-x86
近期学习MongoDb 需要查看API,可是官方只能从浏览器查询,没有办法下载,并且程序安装包中也没有docs。让我很是纠结,该文件是我自己爬虫、打包并制作成CHM贡献给大家。
MONGO-PERF: Mongo-perf(不要与mongoperf混淆)是用于MongoDB服务器的微型基准测试工具。 它根据线程数来衡量命令的吞吐量。概述: 此仓库包含用于运行MongoDB基准测试的脚本。依赖关系: 一般基准测试依存关系...
看不到源码pentaho-mongo-utils 用于简化 MongoDB 连接的创建和管理的库。 例子 通过下面的工厂方法创建新的 MongoClientWrappers,传入所需的属性。 MongoClientWrapper mongo = MongoClientWrapperFactory . ...
mongo-util 使用mongodb复制完整的数据库并不难。 使用mongodump其次mongorestore和你去。 但是如果你只想从某些集合中复制某些记录,事情就会变得有点麻烦。 为什么? 我不能只使用一些 javascript 和mongo -...
mongo-hacker:针对黑客的MongoDB Shell增强功能-源码
npm i -g mongo-es 用法 命令行 # normal mode mongo-es ./config.json # debug mode, with debug info printed NODE_ENV=dev mongo-es ./config.json 以编程方式 const fs = require ( 'fs' ) const Redis = ...
介绍Mongo Seeding是一组用于将数据导入MongoDB数据库的灵活工具。 非常适合: 自动或手动测试数据库查询为您的应用程序准备现成的开发环境为您的应用程序设置初始状态它是如何工作的? 在JSON,JavaScript或...
org.mongodb:mongo-java-driver:3.1.0 com.fasterxml.jackson.core:jackson-databind:2.6.2 org.reflections:reflections:0.9.10 org.apache.commons:commons-lang3:3.4 ...
蜜蜂通常会创建Apis,使其行为与mongo shell最相似。 显然,并非全部,并且不一定以相同的方式进行,但至少是执行某种操作的最佳可能方式。 命名约定也尽可能保持与外壳之一相同。 为了与以前的版本兼容,用于特定...
Mongo 索引解析器一组脚本,用于促进 mongo 索引的跟踪,或在本地重新创建生产级索引的能力。要求节点重击使用 mongos SSH 访问远程服务器用法下载索引要接收包含给定数据库索引的 JSON 文档,请使用适当的配置修改...
转储从 Node JS 创建 Mongo Dump安装用 npm 做: npm 安装 mongo-backup执照:copyright: 2014 Sundarrajan
mongo-thingy:将MongoDB与Python结合使用的最惯用且友好的功能
mongo-java-driver-3.0.rar
蒙哥·达什(Mongo Dash) 适用于MongoDB数据库的仪表板解决方案。 访问该以获取更多详细信息。要求Python 3.6或更高版本 :hammer_and_wrench: 安装要安装该软件包,您可以克隆存储库并运行以下命令: $ pip install...