身边一直都有小伙伴在问:MongoDB究竟是什么?它有到底什么特性?有什么不同凡响?在什么状况下使用MongoDB最合适?以什么样的姿式是最好的?难道就必定要用吗?....说实话,这些问题都问到精髓了,也看得出来大家的急切和真切。有时候你们都比较忙,很难抽出一天的时间,坐而论道,把这些问题掰扯清楚,而后忽如睡醒,豁然开悟。固然,我的也不是专业的”布道者“,因此,经过电话、微信、QQ、钉钉或者其它的办公聊天软件,让我几句话给你们说明白,有些困难,也不切实际。因此,不免有时候,大家是曼联藏不住的哀怨,我也是意犹未尽。如今,我把我前两年分享的一个PPT,分享给你们,但愿经过这个分享,能让你们对MongoDB有一个相对完整的全面认识。数据库
名副其实的 名列前茅、青年才俊性能优化
广受好评 迷弟迷妹 众多服务器
将来可期,潜力股微信
两年已过,热度不减,你的地位依然无可替代网络
复制集的做用:多线程
(1)高可用,防止设备(服务器、网络)故障。提供自动FailOver功能;框架
(2)灾难恢复,当发生故障时,能够从其它节点快速恢复;性能
(3)功能隔离,用于分析、报表,数据挖掘,系统任务等;用于备份。
复制集成员最多50个。参与Primary选举投票的成员最多7个,其余成员的votes属性必须设置为0,即不参与投票。优化
写关注机制WriteConcert;用来指定MongoDB对写操做的回执行为。
可在connection level 或者写操做level指定。线程
A.对集群进行抽象,让集群“不可见”,分片对应用系统是透明的
MongoDB自带了一个叫作mongos的专有路由进程。mongos就是掌握统一路口的路由器,其会将客户端发来的请求准确无误的路由到集群中的一个或者一组服务器上,同时会把接收到的响应拼装起来发回到客户端。
B.保证集群老是可读写
MongoDB经过多种途径来确保集群的可用性和可靠性。将MongoDB的分片和复制集功能结合使用,在确保数据分片到多台服务器的同时,也确保了每分数据都有相应的备份,能够确保有服务器坏掉时,其余的从库能够当即接替坏掉的部分继续工做。
C.使集群易于扩展
当系统须要更多的空间和资源的时候,MongoDB使咱们能够按需方便的扩充系统容量。
A. Mongos
Mongos做为Sharding Cluster的访问入口,全部的请求都由mongos来路由、分发、合并,这些动做对客户端driver透明,用户链接mongos就像链接mongod同样使用。Mongos会根据请求类型及shard key将请求路由到对应的Shard。
B.Config Server
Config Server 存储Sharding Cluster 的全部元数据,全部的元数据都存储在config数据库:
*保存每一个分片上的chunk的信息 * 保存chunk上的片键范围。
C.Shard
Shard 存储应用数据记录。Chunk size 默认是64M。
(1)分片键决定了文档在集群中的位置;(2)分片键必须有索引;(3)分片键大小限制在512bytes;(4)MongoDB不接受已进行collection 级分片的collection上插入无分片键的文档(也不支持空值插入);(5) 一旦集合已经分片,就不能够直接修改分片键。
分割和迁移 MongoDB底层依赖2个机制来保持集群的平衡:分割和迁移。分割是把一个大的数据块分割为2个更小的数据块的过程。迁移就是在分片之间移动数据块的过程。当某些分片服务器包含的数据块数据量大大超过其余分片服务器时就会触发迁移的过程,这个触发器叫作迁移回合(migration round)
Number of Chunks Migration | Threshold |
Less then 20 | 2 |
21-80 | 4 |
Greater than 80 | 8 |
迁移工做谁来作?
自动:3.2 版本里,Mongos有个后台的Balance任务,该任务不断来判断是否须要迁移,若是须要,则发送moveChunk命令到源shard上开始迁移。
手动:用户能主动触发数据迁移,还能够手动关停、指定运行时间窗口。
(1)MongoDB提供了两种内置分析数据的方法:Map Reduce和Aggregation框架。聚合框架,第一在MongoDB2.2 中引入,每一次新版本发布都会更新。MongoDB 2.6 加入了许多更新,框架也相对成熟了。
(2)其余聚合功能:.count() 和.distinct()。
(3)map-reduces是MongoDB提供灵活聚合功能的首次尝试。使用map-reduce,可使用JavaScript定义整个处理流程。这提供了很大的灵活性,可是比聚合框架性能要低得多。此外,编写map-reduce的过程相对复杂,比聚合框架更加难以理解。
(4)虽然map-reduce提供了JavaScript的灵活性,可是它限制了必须是单线程和解释性的模式。聚合框架是做为原生C++和多线程模式执行的。虽然map-reduce没有被淘汰,可是将来的改进都会在集合框架上进行的。
(1)业务驱动,而非数据驱动;
(2)不要按照关系型来设计表结构,建议更多使用内嵌方式;
(3)数据库集合(collection)的数量不宜太多;
(4)数据冗余是能够接受的。
(1)重复率越低越适合作索引;状态、性别等不适合创建索引;
(2)对于包含多个键的查询,建立包含这些键的复合索引是个不错的解决方案。复合索引的键值顺序很重要,理解索引最左前缀原则;
(3)有添加尽可能匹配覆盖索引;
(4)稀疏索引:不存储Null信息的索引,(3.2以上才有,不能当作分片的片键);局部索引(稀疏索引进化版);
(5)后台建立索引;
(6)文本索引一个重要的不一样是一个集合只有一个文本索引;
(7)文字搜索索引提供的功能快速单词搜素的索引、匹配精确字段、使用特定单词或者句子排序文档、支持多语言、基于匹配度对查询结果打分。
IT打工人,码字不易,转载分享请注明出处,谢谢配合!!!