【MongoDB实战】读书笔记

【MongoDB实战】读书笔记_第1张图片

书名

MongoDB实战 第二版

作者

徐磊

书摘

第一部分 入门

第一章:全新web数据库

  1. MongoDB间特性

    1. 文档数据模型:json格式,无schema,开发快,不需要代码定义。动态扩展、

    2. ad hoc 查询:主动查询模式:不需要事先定义系统接收何种查询,关系型数据库的执行就是ad hoc。

    3. 索引:B-树(平衡树)

      1. 每个文档一个主键,

      2. 通过辅助索引,允许用户优化不同的查询

      3. 每个集合可以建立64 个索引

    4. 复制: 提供数据库复制特效,可复制集合。

      1. 可复制集合在多个机器上分布式存储。实现数据冗余,自动灾备、伸缩数据库读操作。

      2. 主可读写,从只读。

      3. 自动化灾备:主节点失败,则集群中会选择一个从节点升级。主节点回归时会降级。

    5. 加速与持久化:

      1. 写入速度与持久性之间存在的矛盾的关系。

      2. mysql使用事务日志,来做妥协。

      3. mongo,通过选择写入语义来维持速度与持久性的平衡,通过日志和主从保证。

    6. 伸缩:

      1. 增加配置,垂直拓展,成本高。水平扩展加机器,水平伸缩很好。

  2. 核心服务与工具:C++开发

    1. 命令行工具:

      1. mongodump和mongorestore---备份和恢复数据库的工具。mongodump:把数据库数据保存为原生的bson格式,适合热备份。用mongorestore恢复。

      2. mongoexport、mongoimport:导入或导出json、CSV、tsv。

      3. mongosniff:用于查看发送给数据库命令的嗅探工具。

      4. mongotop:与top类似,轮询mongodb,并显示他在每个即合理花费的读取和写入数据的时间总数。

      5. mongoperf:了解mongodb实例磁盘操作情况。

      6. mongoplog:展示mongodb操作日志信息

      7. bsondump:把bson文件转化为可读格式,如json。

  3. 为什么选择MongoDB:

    1. 为什么要设计他:结合键值对数据库和关系数据库,的特点。

    2. 目标是什么:易于伸缩,存储丰富数据类型,提供复杂查询的语言。

    3. 与其他数据库对比:

      1. 简单的kv存储:memcached:【MongoDB实战】读书笔记_第2张图片

         

      2. 复杂kv存储:【MongoDB实战】读书笔记_第3张图片

         

      3. 关系数据库:【MongoDB实战】读书笔记_第4张图片

         

      4. 总结:拥有关系型数据库的强数据类型。对于大量数据的复杂kv数据库来说,提供了强一致性,sql语法复杂,属于文档数据库

    4. 使用场景:

      1. web应用:用户、会话、

      2. 敏捷开发:不用定义schema,

      3. 分析和日志:

      4. 缓存:直接存储页面数据

      5. 可变的Schema:

  4. 提示和限制:

    1. 64位系统,32位只能寻址4GB。

    2. 使用虚拟内存映射,自动分配内存,需要在单独的机器上。

    3. 处理内存小于文件大小的数据时,会卡

    4. 集群需要3个配置节点单独处理分片集群复制的问题。

  5. 总结:

    1. 开源、面向文档数据库关系系统

    2. 应用于互联网应用的数据模型和伸缩性

    3. 动态查询,辅助索引,快速原子更新,复杂聚合,支持自动化灾备的复制,水平伸缩的分片集群。

第二章:通过JavaScript shell操作MongoDB

第三章:编写代码操作MongoDB

  1. 驱动工作原理:

    1. mongodb对象ID【MongoDB实战】读书笔记_第5张图片

       

第二部分 MongoDB应用系统开发

第四章:面向文档的数据

  1.  schema设计原则:

    1. 理解应用的访问模式是什么?读写比?查询方式数据量等。

    2. 数据的基本单位是什么?bson文档 。

    3. 数据库的功能是什么?mongodb不支持join,不支持事务,支持复杂更新、是原子操作

    4. 如何记录生成好的唯一id:他决定数据文档存储在什么地方。

  2. 设计电商网站数据模型:

    1. schema基础知识:

       

      1. 唯一的url slug:有意义的url结构有利于SEO。

  3. 核心概念:数据库、集合、文档

    1. 数据库:不显是创建数据库,第一次写入数据创建。

    2. 集合:

      1. 盖子集合:有上限的集合,高性能日志场景,达到上限后会覆盖最先插入的数据、

      2. TTL集合:特定时间后废弃文档数据,生存时间集合【MongoDB实战】读书笔记_第6张图片

         

      3. 系统集合:

        1. system.namespaces:命名空间集合

        2. system.indexs:索引集合

    3. 文档和插入:

      1. 所有发送给mongodb的时候都序列号bson了。列名存在文档,太长影响内存。

      2. 序列号:key必须有效,小于255B长度。

      3. 字符串:必须utf-8,

      4. 数字:double、int、long、 存货币类型,缺少小数位支持。

         

      5. 虚拟类型:

      6. 文档限制:bson文档16M,嵌套深度最大100.

      7. 大量插入:只要验证回答有效就十分简单。上限16M

第五部分 构建查询

  1. 电子商务查询:

    1. 产品、类别和评论

  2. MongoDB的查询语言:

    1. 查询条件和选择器:

      1. 【MongoDB实战】读书笔记_第7张图片

         

      2. 【MongoDB实战】读书笔记_第8张图片

         

      3. 【MongoDB实战】读书笔记_第9张图片

         

      4.  

      5. 正则:

      6. bson类型 【MongoDB实战】读书笔记_第10张图片

         

    2. 查询选择:

      1. 映射:返回的结果集

        1. find({},{“xxx”: 1})

           

      2. 排序:sort({‘xxx’: -1})

      3. 跳过和限制:skip和limit

第六章:聚合

  1. 聚合框架概览:【MongoDB实战】读书笔记_第11张图片

     

第三部分 精通MongoDB

第八章:索引与查询优化:

  1. 索引理论:

    1. 核心索引概念:

      1. 单键索引:_ID

      2. 复合索引:类似聚合索引

      3. 索引交集:2个索引的交集:一个查询可以走2个索引,如产品名称 - 价格,

      4. 索引效率:

    2. B-树:

      1. 每个节点包含文件指针,子节点指针, 节点通常保持60%的饱和度。

      2. MMAPv1默认引擎,使用B-树,

  2. 索引实战

    1. 索引类型:

      1. 唯一索引:unnique

      2. 稀疏索引:默认是密集型的,唯一稀疏,sparse, 可能不存在的数据。

      3. 多键索引:

      4. 哈希索引:

        1. 等值查询相似,不支持范围查询

        2. 不支持多键你哈希

        3. 浮点数在哈希之前转换整数,4.2和4.3有相同的哈希索引。

        4. 哈希索引很均匀,改变了索引入口的位置,有益于分片。

      5. 地理空间索引:查询离我最近等数据。

    2. 索引管理:

      1. 创建以及删除索引

        1. 创建:创建一个带有新索引的文档并把它存储到专门的system.indexes集合里。

        2. 删除:dropIndex

      2. 构建索引:

        1. 无数据构建

        2. 有数据构建:

        3. 第一步:对索引值进行排序:排序过的插入-树效率高。

      3. 后台索引:占用写锁,但是允许读写数据库,占有资源小。

      4. 离线索引:复制一个新服务器节点,在此服务器创建索引,并且同步主上的数据,更新完后做主。

      5. 备份:

      6. 碎片整理:重建索引。reIndex,会占用写入锁,脱机执行。

    3. 查询优化:

      1. 找出慢查询:

第九章:文本搜索:

  1. 和es的区别: es功能丰富,mongo支提供基本的搜索需求。但是对于在mongo里面存储了数据,文本索引会增加部署开销,但是比部署es简单多。

  2. 文本搜索 - 不仅仅是模式匹配

    1. 文本搜索与模式匹配:

第十章:复制集群

  1. 概况:

    1. 老的是主从复制:

    2. 新的复制集群:增加了自动化灾备机制,

  2. 可复制集群工作原理:

    1. oplog:允许复制数据

      1. oplig是个盖子集合,它存在于每个负直接点的local数据库中,记录了所有数据变化

    2. heartheat:监控状态并促发灾备

    3. 写一个数据的流程:

      1. 主写一个数据,会将操作记录并添加到主oplog中,

      2. 其他从会复制主的oplog

      3. 某个从准备更新自己的数据时:

        1. 首先,会查看自己的oplog里最新的时间戳

        2. 然后,查询主节点的oplog,查询所有时间戳大于自己的oplog日志

        3. 最后写入数据并添加每个操作日志到oplog、

      4. 多半的从复制了数据后,主会提交事务。

      5. 好处,主挂了任何一个从都能当主。

    4. 复制方式:从节点会和主节点建立长连接,进行长轮询, 主一改他就复制。几乎可以实时更新,

  3. 主从复制:out!!!

    1. 特点。灾备靠人工,主挂了,需要关闭一个从,然后作为主启动。所有程序必须重新连接新的主节点。

  4. 停止复制:

    1. 从节点无法早点主的oplog时间戳。就会永久停止复制。

    2. oplog是个盖子集合,只存储固定量的数据,从节点离线一段时间就丢数据了。需要完整的备份主的数据。 oplog必须有足够大的空间。

  5. 复制集oplog的大小。

    1. 每个小时日志的数据,* 8。

  6. 心跳和故障转移:

    1. 选举和灾备,2秒ping一次其他成员,系统可判断自己的健康状态。

    2. 确保一直有一个主存在,大多数从节点在就没问题。

    3. 主节点看不到其他成员的时候必须退位降级。裁判和从都没了。从和裁判只要能看见就会选一个主。

  7. 提交和回滚

    1. 提交时机:一直向主写数据,当多数从复制了就会提交。

      1. 解决,当主挂的时候,刚写的数据还没有从复制,从升主后就会丢数据

      2. 假设当从节点回归的时候,从 从主复制的时候发现有些数据没有就会回滚。所有没有复制给大多数从节点的写入数据会被回滚。

    2. 单个文档的操作是原子的。多文档不是原子的

第十一章:分片集群

  1. 概述:

    1. 解决单个服务器存储了全部的数据带来的,性能,存储,灾备等。问题

    2. 什么时候分片?

      1. 存储分布式:

      2. 负载分布式:

  2. 分片集群的组件:

    1. 【MongoDB实战】读书笔记_第12张图片

       

    2. 分片:多个存储节点:

      1. 每个节点都是一个复制集群。

    3. mongos路由器(中心):缓存了集群源数据并使用他来路由操作到正确的分片服务器。

      1. 进程是轻量级,不持久化,应用连接本地的mongos,mongos连接分片。

    4. 配置服务器:存储集群的源数据,哪个分片包含哪些数据。

  3. 分片集群内中分散数据:

    1. 文档:

    2. 块:分片键进行分割,一个value就是一块。

    3. 集合:

    4. 数据库:

第三部分 精通MongoDB

随想

你可能感兴趣的:(分布式技术,mongodb,数据库,nosql)