MongoDb
,非关系型数据库(NoSQL数据库),是一种文档数据库。
一.特性及使用场景
1.特性:
- 1.高并发读写需求(2000-3000,可以扩展)
- 2.海量数据的高效存储和访问需求(TB或者PB级别的数据)
- 3.对数据库的高可扩展性和高可用性的需求(列不固定,可扩展)
2.使用场景:
- 1.数据量大,TB或者PB级别的数据存储
- 2.读写入频繁
- 3.价值较低的数据,对事务性要求不高(非金融类交易)
3.与关系型数据库相关术语对比
4.常用命令小节
二.索引
简单的说,索引
就是将文档按照某个(或某些)字段顺序组织起来,以便能根据该字段高效的查询。
1.默认索引
默认情况下,集合中_id字段就是索引。
2.创建索引
db.user.ensureIndex({"name":1, "age":-1})
数字1表示name键的索引按升序存储,-1表示age键的索引按照降序方式存储。
该索引被创建后,基于name和age的查询将会用到该索引,或者是基于name的查询也会用到该索引,但是只基于age的查询将不会用到该复合索引。因此可以说,如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列。
如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。
3.存储引擎
根据MongoDB官方文档,在MongDB3.2之后,默认使用wiredTiger
作为存储引擎,wiredTiger的索引存储使用的是B+Tree
。
与 Mysql innodb 不同的时,它的叶子节点之间没有通过链式结构形成一个链表,而是每个叶子节点以page 的方式存储了数据。leaf page
上存储的数据主要由 page header
,block header
,key/value
数据构成。
特性:
文档级并发:官方宣称在read、insert和复杂的update下wiredTiger
具有更高的性能。所有的write请求都基于“文档级别”的lock,因此多个客户端可以同时更新一个colleciton中的不同文档,这种更细颗粒度的lock,可以支撑更高的读写负载和并发量,修改同一文档时必须串行执行。
日记:journal就是一个预写事务日志,来确保数据的持久性,wiredTiger每隔60秒(默认)或者待写入的数据达到2G
时,mongodb将对journal文件提交一个checkpoint(检测点,将内存中的数据变更flush到磁盘中的数据文件中,并做一个标记点,表示此前的数据表示已经持久存储在了数据文件中,此后的数据变更存在于内存和journal日志)。
对于write
操作,首先被持久写入journal,journal日志默认每隔100毫秒
同步日志磁盘一次,每100M数据生成一个新的journal文件。然后在内存中保存变更数据,条件满足后提交一个新的检测点,清除此前的journal日志,即检测点之前的数据只是在journal中持久存储,但并没有在mongodb的数据文件中持久化,延迟持久化可以提升磁盘效率,如果在提交checkpoint之前,mongodb异常退出,此后再次启动可以根据journal日志恢复数据。
三.部署方式
1.副本集(Replica Set)
副本集
是一组维护相同数据集的mongDB服务,副本集可提供冗余和高可用性,是所有生产部署的基础。也可以说,副本集类似于有自动故障恢复功能的主从集群,就是用多台机器进行同一数据的异步备份,从而使多台机器拥有同一数据的多个副本,并且当主库挂掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。
副本集组成:
主节点:可读写
副本节点:不可写操作,备份数据,但可以读操作(需配置)
仲裁节点(可选):不保留任何数据的副本,只具有投票选举作用。也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也是仲裁者。
选举原则
主节点选举的触发条件:
- 1)主节点不可用(例如:主节点网络不可达,副本集之间每隔2s会发一次心跳,如果10s内没有收到该节点心跳回复就认为该节点宕机)
- 2)人工干预,下线主机点(rs.stepDown(600))
选举规则是根据票数来决定谁获胜:
- 票数最高,且获得了“大多数”成员的投票支持的节点获胜,N/2+1票。当复制集内存活成员数量不足大多数时(可用节点小于总节点的一半),整个复制集将无法选出主节点,复制集将无法提供写服务,服务降级,处于只读状态。
- 若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜(数据的新旧通过操作日志oplog来对比)
在获取票数的时候,优先级(prioroty)参数影响重大。每个节点都倾向于选举优先级最高的节点,优先级为0的节点不会被选为主节点。
2.分片(Sharded Cluster)
分片是一种跨多台机器分布数据的方法,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。换句话说,分片是指将数据拆分,将其分散存储在不同机器的过程,又是也用分区来表示这个概念(partitioning)。将数据分散在不同的机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更多的负载。
使用分片的代价是基础架构和部署维护的复杂性增加。
组成:
分片(存储):每个分片包含分片数据的子集,每个分片都可以部署为副本集
路由(mongos):充当查询路由器,在客户端应用程序和分片集群之间提供接口
配置服务器(config servers):存储集群的元数据和配置设置,从mongoDB3.4开始,必须将配置服务器部署为副本集。