mongodb入门到精通

本文介绍了MongoDB的三种集群模式:主从模式、副本集模式和分片模式,重点解析了副本集的自动故障转移和分片的Chunk概念。还提到了MongoDB的索引建立、查询模式以及内存映射技术,强调了数据量大时保持索引在内存中的重要性。最后讨论了Spark读取MongoDB的分区策略。
摘要由CSDN通过智能技术生成

1、mongo常用操作

  1)创建数据库:use mymongodb
  2)mongo创建集合:db.createCollection("mycollection")
  3)mongo插入数据:db.mycollection.insert({"name":"jayo"})
  4)db.col.find({"name":"ljy", "age":"20"}).pretty()等于MySQL的where name="ljy" and age="20"
  5)查询三条电话不为空的记录,注意null不需要加双引号,数字也不用,只有string类型采用
db.getCollection('spider_resume_test').find({"phone":{"$ne":null}}).limit(3)
  6)mongo查询非空数组:db.spider_resume_test.find({$where:"this.languages.length>0"})
  7)查询employments数组长度为1的数据:db.getCollection('spider_resume_test').find({employments:{"$size":1}}).count()    
  8)and联合查询
db.getCollection('spider_resume_test').find({"$and":[{"wechat":{$ne:null}},{"wechat":{$ne:"********"}}]})
  9)去重:db.collection.distinct("去重字段")
 

2、mongo的节点不是指一台机器,而是指一个mongo实例(服务,进程)
3、mongoDB集群模式主要有主从(master/slaves),副本集(replication),和分片(sharding)。

  • 主从(master/slaves)模式
    主从是所有集群模式中最简单的,由一主一从或一主多从组成。
    主从模式是早期系统设计中最常见的,实现数据备份的同时,将读写分离,降低数据库的压力。 该模式由两个角色组成:
    master: 提供读写功能
    slave: 提供数据备份和读功能
    主从模式下,master节点出现故障的时候,需要手动恢复,已不再推荐使用
  • 副本集(replication set)模式
    primary:
    主节点,对应的master/slave模式的master。主节点是唯一能够接收写请求的节点。一旦主节点不可用,会选出新的主节点。
    secondaries:
    从节点,对应的master/slave模式的slave。提供数据备份和读功能,并且能在主节点挂掉的时候被选举为新的主节点。
    arbiter:
    投票节点或者叫仲裁节点。该角色是可选的。仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点
    副本集中,主节点和所有从节点的数据都是一样的。所以副本集是不适合大数据量存储的。副本集是自带故障转移功能的主从复制
  • 分片(sharding)模式
    将数据分布式的存储在不同节点的分片里面。
    构建一个 MongoDB 的分片集群,需要三个重要的组件,分别是分片服务器(Shard Server)、配置服务器(Config Server)和路由服务器(Route Server)。 这里的服务器其实就是指mongo实例,或者说节点
    Shard Server
    每个 Shard Server 都是一个 mongo实例,用于存储实际的数据块。在实际生产中,会有多个分片服务器,每个分片服务器都会搭建成副本集模式,即主分片服务器,从分片服务器,仲裁分片服务器,防止因主节点单点故障导致整个系统崩溃。所以这里就结合到了副本集模式,副本集复制的单位是节点,而不是指分片服务器里面的分片。
    在一个shard server内部,MongoDB还是会把数据分为chunks(数据块),每个chunk代表这个shard server内部一部分数据。chunk的产生,会有以下两个用途:
      Splitting:当一个chunk的大小超过配置中的chunk size时,MongoDB的后台进程会把这个chunk分裂成更小的chunk,从而避免chunk过大的情况。
      Balancing:在MongoDB中,balancer是一个后台进程,负责chunk的迁移,从而均衡各个shard server的负载,系统初始1个chunk,chunk size默认值64M,生产库上选择适合业务的chunk size是最好的。MongoDB会自动拆分和迁移chunks。
      所以mongodb的分片模式,chunk叫做分块, 每个Shard Server存储这集合部分数据,其实每个Shard Serve就是一个分片,这就是mongodb分片集群中分片的概念,即这种集群模式的分片是指一个分片服务器,分片服务器里面会自动将数据进行分片存储,注意分片服务器里的分片没有主分片,从分片的概念。
    Config Server
    这是独立的一个 mongo 进程,保存集群和分片的元数据,在集群启动最开始时建立,保存各个分片包含数据的信息。
    Route Server
    这是独立的一个 mongo进程,Route Server在集群中可作为路由使用,客户端由此接入,让整个集群看起来像是一个单一的数据库,提供客户端应用程序和分片集群之间的接口。

在实际生产环境中,副本集和分片是结合起来使用的,可满足实际应用场景中高可用性和高可扩展性的需求。
4、mongo表里面存上千万数据时,必须对要查询的字段建索引,否则查询巨慢
5、mongo的查询几种模式,

  • Primary:默认,所有读操作从主节点查询,所以默认是从主节点读写数据的,副本节点上不允许读。这样读写在同一个节点

  • primarypreferred:大多数情况下从primary的replica set读,当其不可用时,从其secondary members读

  • secondary:所有的读操作均从secondary member读取

  • SecondaryPreferred:大部分情况下从secondary member读取,当secondary member不可用时,从primary读取

  • nearest:从最小网络延时的replica set读取
    写操作只能在主节点,如果设置查询模式为primary,那读写就是在同一个节点。设置为其他,可实现mongo读写分离

6、不只MongoDB,所有数据库都是这样的策略:如果所有数据都能放进内存中,肯定是性能最好的情况。但是实际情况是,并不是所有场景下都可以把全部数据都塞进内存里。那么退而求其次,就会要求所有索引在内存中,数据能缓存多少算多少,没有的就从磁盘读。所以如果某个集合的单条数据大小很大,那么整个集合的数据大小过大,就会导致内存存不下,就会存到磁盘,那么查这个集合的数据就会很慢!
8、Mongo使用了内存映射技术 -----写入数据时候只要在内存里完成就可以返回给应用程序,而保存到硬体的操作则在后台异步完成
9、按照Mongodb默认的配置,WiredTiger的写操作会先写入Cache,并持久化到WAL(Write ahead log),每60s或log文件达到2GB时会做一次Checkpoint,将当前的数据持久化,产生一个新的快照。Wiredtiger连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性。
12、spark读取mongodb分区策略
Mongodb作为spark数据源,分区数据的策略有很多种。目前,提供以下几种分区策略。在通过sparkconf配置的时候需要使用spark.mongodb.input.partitionerOptions.做前缀

  • MongoDefaultPartitioner 默认的分区策略。实际上是封装了MongoSamplePartitioner。

  • MongoSamplePartitioner
    要求mongodb版本是3.2+。用于所有部署的通用分区器。使用平均文档大小和集合的随机抽样来确定集合的合适分区

  • MongoShardedPartitioner
    针对分片集群的分区器。根据chunk数据集对collection进行分片。需要读取配置数据库。

  • MongoPaginateByCountPartitioner 用于所有部署模式的缓慢的通用分区器。创建特定数量的分区。需要查询每个分区。

  • MongoPaginateBySizePartitioner 用于所有部署模式的缓慢的通用分区器。根据数据大小创建分区。需要查询每个分区。

13、对于mongo嵌套json数据查询如{‘extraInfo’: {‘videosource’:1}}
查询条件为:{‘extraInfo.videosource’:1}
mongo and查询: {$and: [{查询条件1}, {查询条件2}]}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值