mongo入门到放弃

mongodb

索引

二级索引、唯一索引、复合索引、地理空间索引、全文索引

  • 如果一个文档没有对应的索引键,那么索引会将其作为null存储。唯一索引插入多个不存在的键文档时就会报错。
  • 使用稀疏索引(与mysql中的概念不同),只会对存在的键建立索引。搭配唯一索引使用,运行集合存在多个没有唯一索引键的文档。
  • ttl索引,对某个字段指定过期时间。到达时间后,文档会被删除。每分钟执行。可以修改ttl的过期时间

聚合

集合

  • 支持某一时刻过期

  • 支持固定大小。双端队列,覆盖插入。

  • 支持文件存储

  • 不支持连接和复杂的多行事务

子集合

推荐使用子集合作为关联集合的命名方式。比如:blog.posts和blog.authors

文档

每个文档有特殊的键_id。 唯一键

文档的键名是唯一的

数据库

相互独立

使用指南

  • 不要使用skip对结果分页。需要找到数据再抛弃。性能不高。使用上一次的结果作为下一页的基础。
  • 选择内嵌列表或者属性还是引用的准则是:内嵌列表或者属性的量级,如果是“少”,选择内嵌合适,如果是“多”,选择引用合适。
  • 当内嵌列表膨胀时(例如明星的关注列表),需要使用多个文档存储。
  • 强事务一致性的最好不使用,多表关联查询不支持

游标

使用游标进行遍历时,一边遍历一边保存,可能因为保存后的doc过大导致mongo把doc移到了集合的尾部,遍历两次。使用db.foo.find().snapshot()可以避免这个问题,但是会变慢

cursor = db.foo.find();

while(cursor.hasNext()){
	var doc = cursor.next();
	doc = process(doc);
	db.foo.save(doc);
}

生命周期

客户端的游标会在匹配迭代结果后销毁。或者超时(10分钟)

数据一致性问题

mongodb会为每个连接维护一个请求队列。一个连接拥有一个一致的数据库视图。

  • 默认的事务级别的是读已提交。多个连接下可能存在幻读
  • 可以选择读取数据的级别,从只读主,首选读主,到只读从

复制集

  • 复制功能通过操作日志oplog实现,oplog包含了主节点的每一次写操作。

  • oplog是主节点的一个固定集合,备份节点通过查询这个集合完成复制。

  • 每个备份节点都维护自己的oplog,允许树状复制拓扑。

  • 当同步源的数据损坏或者数据与主节点不一致才会停止同步

节点类型

  • 主节点:得到多数节点的投票

  • 备份节点:同步主节点数据

副本集的成功状态

  • STARTUP 成员刚启动时处于这个状态。在这个状态下,MongoDB会尝试加载成员的副本集配置。配置加载成功之后,就进入STARTUP2状态。
  • STARTUP2 整个初始化同步过程都处于这个状态,但是如果是在普通成员上,这个状态只会持续几秒钟。在这个状态下,MongoDB会创建几个线程,用于处理复制和选举,然后就会切换到RECOVERING状态。
  • RECOVERING 这个状态表明成员运转正常,但是暂时还不能处理读取请求。如果有成员处于这个状态,可能会造成轻微的系统过载,以后可能会经常见到。启动时,成员需要做一些检查以确保自己处于有效状态,之后才可以处理读取请求。在启动过程中,成为备份节点之前,每个成员都要经历RECOVERING状态。在处理非常耗时的操作时,成员也可能进入RECOVERING状态。,比如压缩或者是响应replSetMaintenance命令(详见12.3.3节)。当一个成员与其他成员脱节时,也会进入RECOVERING状态。通常来说,这时这个成员处于无效状态,需要重新同步。但是,成员这时并没有进入错误状态,因为它期望发现一个拥有足够详尽oplog的成员,然后继续同步oplog,最后回到正常状态。
  • ARBITER 在正常的操作中,仲裁者应该始终处于ARBITER状态。系统出现问题时会处于下面这些状态。
  • DOWN如果一个正常运行的成员变得不可达,它就处于DOWN状态。注意,如果有成员被报告为DOWN状态,它有可能仍然处于正常运行状态,不可达的原因可能是网络问题。
  • UNKNOWN如果一个成员无法到达其他任何成员,其他成员就无法知道它处于什么状态,会将其报告为UNKNOWN状态。通常,这表明这个未知状态的成员挂掉了,或者是两个成员之间存在网络访问问题。· REMOVED当成员被移出副本集时,它就处于这个状态。如果被移出的成员又被重新添加到副本集中,它就会回到“正常”状态。
  • ROLLBACK如果成员正在进行数据回滚(详见10.4节),它就处于ROLLBACK状态。回滚过程结束时,服务器会转换为RECOVERING状态,然后成为备份节点。
  • FATAL如果一个成员发生了不可挽回的错误,也不再尝试恢复正常的话,它就处于FATAL状态。应该查看详细日志来查明为何这个成员处于FATAL状态(使用"replSetFATAL"关键词在日志上执行grep,就可以找到成员进入FATAL状态的时间点)。这时,通常应该重启服务器,进行重新同步或者是从备份中恢复。

复制集主节点的选举

  • 一个成员无法到达主节点,就会发起主节点选举。会向他所知的其他成员发送通知。其他节点如果也判定主节点不可达,就会对他投票。否则会拒绝投票。
  • 当一个成员得到多数票时就会晋升为主节点。

使用指南

  • 当副本集发生主从切换时,应用程序无法知道最后一个操作是否被旧的主节点执行成功。

  • 提供w这个参数,指定被多少个副本写成功后才算成功

  • 当允许读取到的数据不一致,可以选择读备份节点。或者主节点压力很大,备份节点可以提升读性能

分片

mongos

  • mongos维护着一个“内容列表”,指明了每个分片包含什么数据内容。应用程序只需要连接到路由服务器,就可以像使用单机服务器一样进行正常的请求了。
  • chunk(块)是一段连续片键组成的逻辑数据结构。一个文档所属于一个块。mongos会均衡分片之间的块数量。chunk不是mongod在磁盘保存数据的连续区域。
  • mongos维护了片键的chunk(块)与分片的映射关系
  • mongos试图进行拆分时所有的配置服务器需要是可用的,需要更新块映射的元数据
  • mongos维护了对块大小的计数器,达到阈值后,进行拆分。内存存储

均衡器(balancer)

负责数据的迁移。周期性地检查分片间是否存在不一致,存在则会进行块的迁移。

mongos会尝试称为均衡器。

分片策略

  • 片键不可以是数组
  • 片键需要有高度的势,防止出现特大chunk(块)

hash分片

  • 数据会比较均衡存入分片
  • 范围查询需要查询所以片
  • 浮点数会被先取整再hash
  • 如果需要唯一,则还需要增加一个片键的唯一索引

前导列的复合分片

当单一分片键是升序的,那么分片集群中只有一台分片会插入数据。

可以在片键前加入一个粗略的列,使得热块分散到多台机器

管理mongod

  • 使用db.runCommand({"compact":"collName"})来压缩磁盘空间,减少磁盘碎片

  • mongodb会在写入时建立一条日志journal。当系统异常崩溃时,通过日志replay未保存的数据,这个日志文件大约保存最近60s的日志。数据文件越60s写入一次到磁盘

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值