MongoDB作为典型的NoSql数据库,一个主要目标就是尽可能的提升系统吞吐量。
存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。
集群相关
- Basic available
- Soft-state 允许短期内数据不同步
- Eventually Consistent 数据的最终一致性
在一个MongoDB的shard集群中,会有三种角色:shard,config和routing。
- shard:每一个shard节点都会包含数据集的一部分,是存储真正数据的节点;每一个shard都应该是一个复制集,主要为了健壮性,因为切片集群一个挂一个切片,那么整个切片的数据都会丢失。这也是mongodb的一个缺点,那就是占用的服务器会比较多。
- config:主要存储元数据或者配置信息,比如每一个切片的片键的范围,mongos(即routing)会根据这个服务器的配置信息来决定到哪一个分片服务器上存取数据。配置集群时,config应该有多个,避免单点故障。
- routing:也就是mongos客户端,用来操作shard集群的接口。
mongodb是默认不分片的,此时单一集合会存储在唯一的mongo shard节点中。如果指定分片键并开启分片,同一个集合回被存储在不同shard节点中。
集群读写
- 读负载均衡。通过ReadPreference这个参数进行配置。
- 写入操作。WriteConcern参数有如下选择。UNACKNOWLEDGED表示。将消息发送给socket即返回,不确保数据写入到数据库。ACKNOWLEDGED(SAFE)确保已将数据写入到shard中的主节点中,这时如果有针对主节点的查询请求,已经可以查到该数据了。但不保证能从从属节点查询到。FSYNCED(FSYNC_SAFE)确保数据已写入到shard主节点的磁盘上,这样如果主节点磁盘不损坏,数据就不会因为掉电等原因丢失了。JOURNALED(JOURNAL_SAFE):确保数据写入到服务端的Journal file中,Journal file是POSIX算法中一种保障数据强一致性的一种实现。这种做法可以保证在一个shard中不是所有节点都损坏的前提下数据的安全性。但并不能保证从属节点的数据一致性。MAJORITY:确保数据写入到shard中的多数节点的内存中。
和竞品的区别
主要是HDFS。但是HDFS是面向列的数据库,shard是基于列族的。而且HDFS只提供主索引,所以除了主索引(单个/范围)访问,遍历没有其他的访问方式。但是mongodb提供二级索引。