mongoDB的相关问题

CAP定理,又称布鲁尔定理,它指出对于一个相互连接并共享数据的分布式计算系统来说,不可能同时满足以下三个要求:
1、一致性(C):系统在执行某个操作后仍然是一致的,在分布式系统中,更新操作执行成功后,所有用户应该读到最新的值,这样的系统被认为具有一致性。
2、可用性(A):每一次操作都会在合理的时间内返回适当的结果。
3、分区容错性(P):系统在存在网络分区的情况下,仍然可以接受请求并处理。
关系型数据库一般满足CA,分布式数据库一般满足CP,nosql数据库一般满足AP。
nosql数据库的优点:水平扩展方便,读写速度快,数据模型灵活。
缺点:不支持sql操作
mongoDB的优点
1、高性能、易使用、易扩展、功能丰富。
2、面向集合存储。
3、支持动态查询,支持javascript表达式。
4、支持索引。
5、支持副本集(默认不支持读操作,可以设置支持读操作,最多12个成员,只有7个成员有投票权,如果副本集成员超过7个,需要将其他成员的投票权设置为0)和自动故障恢复。
6、自动处理分片。
7、支持二进制和大数据对象数据。
8、文件存储格式BSON(JSON的一种扩展)。
mongoDB的启动

在bin目录下,./mongod --dbpath …/dbs --logpath …/logs --port 27017 --fork
–dbpath表示数据库路径,–logspath表示日志路径,–fork表示在mongoDB在后台运行,–port表示端口,默认端口27017

mongoDB中的集合类似关系型数据库中的表,文档是mongoDB基本的数据单元,类似行数据,是键值对的有序集合,文档要小于16M。

mongoDB中$where查询性能较差,安全性也存在问题,所以尽量不用。

mongoDB的文档保存的时候,是按照顺序依次在磁盘上相邻保存的,如果一个文档变大了,原来的位置放不下了,就要把它移动到其他地方,通常是最后能放下这个文档的地方。
如果查询要在内存中排序,结果集不能超过32M。
Capped集合的大小固定,性能好,如果空间用完了,新的对象会覆盖旧的对象。
创建时,可以指定size,单位KB,也可以指定max数量,淘汰机制在容量没有满时,按照数量来工作,容量满了,会依据容量来工作。
成员配置项

  • 选举仲裁者:所谓选举仲裁者,就是不保存数据,专门用来投票选举主节点的副本。设置:arbiterOnly:true,最多只能有一个选举仲裁者,应该尽量使用奇数个成员,而不是采用选举仲裁者。
  • 优先级:优先级表示一个成员渴望成为主节点的程度,取值0-100,默认1。
    如果优先级0,该节点永远不能成为主节点;拥有高优先级的成员会优先选举为主节点。
  • 隐藏成员:设置为隐藏的成员,客户端不能发送请求,也不能作为复制源,通常作为备份服务器,需要设置hidden:true,优先级0的成员才能被隐藏。
  • 延迟备份节点:可以通过设置slaveDelay成为延迟的备份节点,在主节点的数据被破坏后,能从备份中恢复,要求备份节点的优先级为0。
  • 创建索引:如果不需要备份节点和主节点保持一样的索引,可以设置buildIndexes:false,一旦指定了这个选项,就不能恢复为创建索引的正常节点了,要求该节点的优先级为0。

复制和分片的区别
数据分片,就是把数据拆分,将数据分散到不同的机器上。每个分片的数据集是整个数据集的一个子集,且相互是不同的数据,所有分片的数据合并起来才是整个数据集。
复制是让多台机器有相同的数据备份,每个机器都有整个数据集。
配置服务器用来执行客户端访问集群数据的路由,它维护着内容列表,记录了每个分片包含的数据。启动配置服务器方法:

./mongod --configsvr --dbpath …/dbs/confdb/confdb1–logpath …/logs/conflog/conflog1 --fork --port 30001

启动mongos进程:

./mongos --configdb localhost:30001,localhost:30002,localhost:30003 --logpath …/logs/conflog/mongoslog --fork

通常一个应用服务器使用一个mongos,他们运行在同一个服务器上。
需要对数据库启用分片才可以:enableSharding(“数据库名称”)。
如果对已经存在的集合进行分片,那么指定的这个分片键上必须有索引,如果索引不存在,mongoDB自动在分片键上创建索引。
mongoDB将文档分组成为块,每个块有分片键特定范围内的文档组成,一个块只能存在于一个分片上。块与块之间的数据不能重复,因此不能使用数组作为分片键,因为mongoDB会为数组创建多个索引条目,从而导致同一个数据在多个块中出现。如果单个分片键可能重复的话,可以创建复合分片键。
如果一个块的数据超出了块的大小,或者达到一个阀值,MongoDB会自动拆分这个块;拆分的时候,所有的配置服务器必须都可用,否则不能拆分,此时就会造成“拆分风暴”,即mongos不断发起拆分请求,却无法完成拆分。唯一解决办法就是保证配置服务器的健康和稳定。
分片键的规则
1、不能是数组。
2、一旦插入了文档,分片键不能再修改,如果要修改,必须先删除文档。
3、多数特殊类型的索引不能作为分片键。
4、分片键的取值应该是多样的,这样才有利于分片。
MongoDB使用建议

  1. MongoDB没有join语句,要合理设计数据结构。
  2. 范式化设计,用字段的值来关联数据,可以提高写入速度;反范式化设计把相关数据做成内嵌文档,可以提高查询速度。
  3. 索引非常消耗内存,大约100万条索引就需要50M以上的内存。所以除非特别必要,尽量少建索引。
  4. 查询的时候,只返回需要的数据和字段,避免无谓的流量消耗。
  5. 如果需要查询的数据超过数据的一半,就不适合使用索引了,可以用{$natural:1}禁用。
  6. 更新数据的时候,尽量精细化更新,使用准确条件,并使用修改器直接修改要改变的字段,不要整条替换。
  7. 不要使用大量的、或复杂的js计算,对cpu性能消耗较大。
  8. 尽量早分片,一般要在MongoDB占用服务器整体性能80%前分片。
  9. 不能对256G以上的集合进行分片。
    10.在MongoDB中使用js计算,性能影响较大;把大量数据取到客户端,在客户端计算,会有较大流量消耗;因此要合理设计文档对象,最好能直接从文档中 获取应用需要的数据。
  10. 不要使用GridFS处理小的二进制数据。因为GridFS需要二次查询,一次获取文件元数据,一次获取其内容,因此,更适合存放大数据,至少是一个文档存放不下的数据,通常客户端也不用一次性加载这些数据。
  11. And型查询,应该把最严格的条件放前面。
  12. OR型查询,应该把最有可能为true的条件放前面。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值