Nosql复习笔记
目录
五、BASE:基本可用(BA)、 软状态(S)、最终一致性(E)
十九、MongoDB案例实战(电商大数据)描述每一节模块是干什么的
现有的数据库可分为TRDB、Nosql、NewSQL三大类
一、NoSQL数据库的主要技术特点有以下几种。
- 使用弱存储模式技术。
- 没有采用SQL技术标准来定义和操作数据库。
- 采用弱事务保证数据可用性及安全性或根本没有事务处理机制。
- 主要采用多机分布式处理方式。
二、单机的局限性
1.单机读、写数据的速度瓶颈问题:
(1)数据读写速度受单机不同硬件配置组合的影响;
(2)机械硬盘是影响数据读写速度的一个重要短板
2.单机存储数据量的有限问题
3.单机指令之间速度的细微区别
4.安全性问题(在商业运行环境下,统一存储在一台计算机上的数据,显然不如多机备份那么安全。当仅有的一台计算机出了故障,至少存在硬盘里的数据是无法继续被使用了,甚至会发生数据永久被破坏那样糟糕的事情。这是在大数据环境下必须要解决的问题。)
三、服务器的纵横扩充
1.纵向扩充: 纵向扩展又叫垂直扩展,扩展一个点的能力支撑更大的请求。表示在需要处理更多负载时通过提高单个系统处理能力的方法来解决问题。
2.横向扩充:横向扩展也叫水平扩展,用更多的节点支撑更大量的请求。是将服务分割为众多的子服务并在负载平衡等技术的帮助下在应用中添加新的服务实例。
四、帽子定理CAP
当网络环境一旦出现故障,某一条网线松脱、某一台服务器宕机、某一条网络链路出现严重拥堵问题,就必须认真考虑以下三大问题。
(1) 一致性,指的是在同一时刻,任何一个终端客户在每个节点都能读到最新写入的数据:这里的核心要求至少两台服务器保存着一样的数据,一致性从客户角度是针对“读(选择)”可以简单理解为同步数据复制"功能。
(2)可用性,指的是一个运行的节点在合理的时间内总能响应更新请求,不会发生错误或超时,可用性从客户角度是针对“更新(插入、修改、删除)”,可以简单理解为满足随时更新操作功能。
(3)分区容错性,指的是当网络发生故障时,系统仍能继续保持响应客户读请求的能力。可以简单理解为满足随时读有效数据功能。
帽子定理被证明在分布式处理情况下,发生故障节点,三种期望属性最多只能满足两个。
五、BASE:基本可用(BA)、 软状态(S)、最终一致性(E)
(1)基本可用(BasicallyAvailable),NoSQL允许分布式系统中某些部分出现故障,那么系统的其余部分依然可以继续运作。
(2)软状态(Soft State), NoSQL在数据处理过程中,允许这个过程,存在数据状态暂时不一致的情况。但经过纠错处理,最终会一致的。
(3)最终一致性( Eventually Consistent),NoSQL的软状态允许数据处理过程状态的暂时不一致,但是最终处理结果将是一致的。
六、键值数据库实现基本原理
在设计思路上,键值数据库数据结构最早借鉴了一维数组(Array) 的设计方法。如图所示,一维数组左边一列是下标(Index),用有序整数来定位右边的数组值,方便对数组值的操作。因此,可以把左边的下标理解为操作用的地址(Address),这些地址是为读写数组值用的。
七、键值数据库存储结构基本要素
1)键:键起唯一索引值的作用,确保一个键值结构里数据记录的唯一性,同时也起信息记录的作用。
2)值:值是对应键相关的数据,通过键来获取,可以存放任何类型的数据
3)键值对:键和值的组合就形成了键值对,它们之间的关系是一对一影射”的关系。
4)命名空间:命名空间是由键值对所构成的集合。通常由一类键值对数据构成一个集合
八、键值存储特点(优缺点)
1.优点:简单,快速,高效计算,分布式处理
2.缺点:1)对值进行多值查找功能很弱 2)缺少约束,意味着更容易出错
3)不容易建立复杂关系
九、文档数据库实现基本原理
键值数据库设计也是这样,无须预先定义数据存储结构,但是它们也有基本的约定,就是存储数据必须按照“键值对”的形式存放。文档数据库也采纳了该数据存储约定,所有的数据必须由如下结构形式组成
十、文档数据库存储结构基本要素
1)键值对:文档数据库数据存储结构的基本形式为键值对形式,具体由数据和格式组成。
2)文档:文档是由键值对所构成的有序集。
3)集合:集合是由若干条文档构成的对象。一个集合对应的文档应该具有相关性。如所有的图书相关信息放在一个集合里,方便电子商务平台用户选择。
4)数据库:文档数据库中包含若干个集合,在进行数据操作之前,必须指定数据库名,
十一、文档存储特点
- 文档存储的优点:1) 简单 2)相对高效(相对于传统关系型数据库而言。)3)文档格式处理4)查询功能强大5)分布式处理
- 文档存储的缺点:1) 缺少约束2)数据出现冗余3)相对低效:至于相对低效是基于内存的键值数据库而言的。
十二、其他数据存储模式
1.多模式数据库:就是提供多种数据存储模型的数据库管理系统。目前,在数据库排行网上,排名最靠前的两种多模式数据库产品是MarkLogic和OrientDB。
2.对象数据库:是用来处理面向对象编程数据结构的数据库管理系统。目前,在数据库排行网上,排名最靠前的两种对象数据库产品是Db4o和VersantObject Database。
3.网络和云数据库:网格和云数据库方案是基于网格计算或云计算的数据库。但是这样分类似乎与其他NoSQL的分类有所重叠。如最新的文档数据库MongoDB、Amazon DynamoDB,都提供了基于云服务的能力,主要满足个人和企业基于云平台部署的业务发展需要。
4. XML数据库:XML数据库是一种支持对XML格式文档进行存储和查询等操作的数据管理系统。在系统中,开发人员可以对数据库中的XML文档进行查询、导出和指定格式的序列化。
5.多维数据库:多维数据库是一种对大量的数据进行交互分析,并以提供决策依据为目的的数据库系统。
6.多值数据库等
十三、MongoDB 的主要特征
1)高性能:提供SON,XML 等可嵌入数据快速处理功能;提供文挡的索引功能,以提高查询速度(相对传统数据库而言)
2)丰富的查询语言。为数据聚合、结构文档、地理空间提供丰富的查询功能。
3)高可用性。提供自动故障转移和数据冗余处理功能
4)水平扩展能力。提供基于多服务器集群的分布式数据处理能力,具体处理时分主从和权衡两种处理模式
5)多个存储引擎的支持。MongoDB 提供多个存储引擎,如 WiredTiger 引擎、MMAPvl引擎和In-Memo,前两个基于硬盘读写的存储引擎,后一个基于内存的存储引擎
十四、数据库的建立
创建数据库: use 数据库名
查看数据库:show dbs
统计某数据库信息db.stats()
删除数据库dropdatabas()
查看当前数据库下的集合名称db.getCollctionName()
查看数据库用户角色权限show roles
十五、MongoDB基本操作
1、MongoDB 基本操作:插入、查询、更新、删除、
插入文档语法:db.collection.insert
查询语法:db.collection_name.find
例:查询集合所有文档:db goodsbasei find()
更新语法:db.collection.update
修改某一值用$set操作符:$set{} 加法: $inc 乘法:$mul
错误字段修改:$rename 删除字段:$unset
删除语法:db.collection.remove
2、索引语法:db.collection_name.createIndex({<key:<n>})
十六、高级索引
- 子文档索引
db.collection_name.createlndex( {<key>: <n>, <key>: <n>, ... } )在集合里,对子文档建立索引。 key 为指向子文档的带”.”的字符串
十七、索引限制
1.索引额外开销:建立一个索引至少需要8KB的数据存储空间,也就是索引是需要消耗内存和磁盘的存储空间的。另外,对集合做插入、更新和删除时,若相关字段建立了索引,同步也会引起对索引内容的更新操作(锁独占排他性操作),这个过程是影响数据库的读写性能的,有时甚至会比较严重。所以如果业务系统所使用的集合很少对集合进行读取操作,则建议不使用索引。
2.内存使用限制:索引在具体使用时,是驻内存中持续运行的,所以索引大小不能超过内存的限制。MongoDB在索引大小超过内存限制范围后,将会删除一些索引,这将导致系统运行性能下降。索引占用空间大小,可以通过db.collectiontotalIndexSize方法来查找了解。有经验的数据库技术人员,应该学会提早预估索引所占用的内存总容量,避免问题的发生。这里的预估索引大小,不但要包括所有同时运行在内存中集合的索引,也包括运行集合大小本身,操作系统的内存使用等。
3.查询限制:索引不能被以下的查询使用:
(1)正则表达式及非操作符,如Snin、 $not等。
(2)算术运算符,如$mod等。
(3) $where 子句。
十八、Explain ()分析
- Explain ()命令格式、
queryPlanner 模式,默认运行模式,运行查询优化器对当前的查询进行评估,找最佳的查询计划返回信息
executionStats 模式,同上,但是该模式不会为被拒绝的计划提供查询执行统计信息。
allPlansExecution 模式,该模式结合了前两种模式的特点,返回统计数据,描述获胜计划的执行情况以及在计划选择期间捕获的其他候选计划的统计数据
- Explain ()执行返回结果及分析
Explain()在不同模式不同运行环境下,产生的结果会不同,相关参数也会变化。在分片的基础上对 log 集合数据做 find()运行分析的主要参数:
(1) winningPlan.stage ,最佳的计划阶段,其值为(含子阶段值〉
SINGLE_SHARD ,单一分片操作。
SHARD_MERGE,多分片合并操作。
IXSCAN ,带索引查询。
COLLSCAN ,集合扫描 在处理海量数据时,尽量避免出现这种执行方式。因为集合扫描过程比较低效,甚至影响系统的运行性能。
AND_HASH ,带哈希索引的操作。
AND_SORTED ,对查找结果做排序操作
OR,索引操作的条件里带“$or ”表达式。
SHARDING_FILTER ,分片索引
SORT ,在内存中进行了排序,在处理大规模数据时,需要慎重考虑是否需要这样做,因为它消耗内存,影响系统运行性能
LIMIT ,使用 limit()命令限制返回数。
SKIP ,使用 skip ()进行跳过 IDHACK:针对_id 进行查询。
COUNT,使用 count()进行了查询。
TEXT ,使用全文索引进行查询
COUNT_SCAN ,查询时使用了 Index 进行 count()
- shardName ,分片名,如”shard0003”
- connectionString ,分片所在的服务器地址,如”localhost:27023”
- serverInfo,服务器相关的详细信息,如host、port、version、gitVersion信息。
- namespace,find()数据库空间,包括了数据库名和集合名,如"testdb.log"。
(6) indexFilterSet,代表find()运行时,是否使用了带索引 key条件;其值为true代表使用了索引键,为false代表没有利用索引进行查询;
(7) parsedQuery,解析查询条件,如"$eq" : 1、"$and":[]等。
(8) inputStage,嵌套文档操作类型。
(9 )rejectedPlans,查询优化器考虑和拒绝的候选计划数组,如果没有侯选计划,数组为空。
在executionStats模式下新增统计内容:
(1) nReturned,返回符合查询条件的文档数。
(2)executionTimeMillis,查询计划选择和查询执行所需的总时间(单位:毫秒),如上述find()命令执行结果为1毫秒;该执行时间越小,系统响应越快,若超过2、3秒就应该引起重视。
(3)totalKeysExamined,扫描的索引条目数量;扫描索引条目的数量越少越好。
(4) totalDocsExamined,扫描文档的数量;扫描文档的数量越少越好。
(5)executionStages.works,查询工作单元数,一个查询执行可以将其工作分成若干个小单元,如检查单个索引字、从集合中获取单个文档,将投影应用于单个文档等。
executionStages.advanced,优先返回的结果数目。
- executionStages.needTime,在子阶段,执行未优化的操作过程所需要的时间。
- executionStages.needYield,数据库查询时,产生的锁的次数;次数越少越好,越多说明查询性能存在问题,并发查询冲突等问题严重。
(9) executionStages.isEOF,指定执行阶段是否结束,如果结束该值为true或1;如果没有结束该值为false或0。
(10) executionStages. invalidates,执行子阶段无效的数量。
十九、MongoDB案例实战(电商大数据)描述每一节模块是干什么的
1.日志存储:MongoDB提供不少自生成日志,这些日志记录MongoDB运行过程所产生的事件信息或数据记录信息。这些信息对Mongo数据库技术人员来说非常重要,他们可以通过日志信息发现并解决MongoDB运行中存在的各种问题。(日志使用需求;建立数据集;新增一个日志;查询日志信;查询结果显示)
2.商品评论:进入电子商务平台的客户,经常会对所购买的商品是否符合自己需要,进行留痕点评。通过商品点评信息,可以发现商品服务过程存在的问题,促进商家提高商品的服务质量。同时,通过点评信息的参考和星级评定分级,为客户选择好的商品,提供了参考依据。
因此,商品评论是客户和商家交易良性互动的过程。客户可以更好地选择需要的商品,而商家可以根据客户需求的变化及时调整商品内容。
3.用户扩展信息管理:利用现有电子商务平台用户相关信息,挖掘用户潜在的消费能力,是电子商务平台需要深入考虑的问题。从广告推广入手,提高用户的购买欲望,是一个好办法。用户的扩展信息就成为一个重要的因素,通过扩展信息(如学校、兴趣等)我们可以分析出用户的一些日常相对偏好的行为,如他是学什么专业的、喜欢唱歌等信息,就能更准确地推荐广告内容。那么根据上述精确的信息,当他登录电子商务平台时,平台可以自动为他推荐IT方面的书籍促销广告。
4.订单信息记录:订单是商业专业术语,用于记录用户向商品商家提交的采购信息。作为电子商务平台需要销售大量的商品,那么为用户提供方便的订单功能成为必然。作为登录电子商务平台的用户,把自己喜欢的商品加入“购物车”,然后形成订单、提交订单、最后结账,是一个购买记录过程。
5.商品信息管理:任何一个电子商务平台,要销售商品,必须在其商品展示界面上提供所销售商品对应的相关信息。该信息是电子商务平台最主要、最基本的信息之一,由于商品信息占据了电子商务平台界面的主要部分,并且考虑到商品数量众多(以亚马逊为例,其商品达到了32大类、上千万种产品,平均每种产品有3种款式,那么光商品记录信息就达到了几千万条甚至上亿条),采用可以存储大数据并具有快速响应的NoSQL数据库技术便成为必然。这里自然采用了MongoDB数据库。
6.历史订单:历史订单,顾名思义,就是用户曾经购买过的商品订单信息,一般3个月以上的订单信息就可以作为历史订单进行处理。例如,某用户每年都要在网上购物100次,而且已经在同一电子商务网站上购物了10 年之久,累计了1000 条订单记录。这些历史订单信息对用户来说,再次使用它们的意义不是很大,但是对电子商务平台来说,具有潜在的价值挖掘和利用价值,值得继续保留。
另外电子商务海量订单记录的累积也会影响MongoDB的运行效率,如一个用户10年累计1000条订单记录,那么1亿个用户10年将产生1000亿条订单记录。假设每条订单记录平均产生1KB的存储量,那么10000亿条记录将产生约100TB 的存储量。为了提高用户端对订单的查询响应速度,对于几乎不需要使用的历史订单,定期进行批量转移也是一个好办法、本案例实现用户订单的批量转移处理,以继续保留用户订单的历史记录。
7.点击量存储:用户浏览电子商务平台产生的鼠标点击行为的记录,可以分析用户操作习惯,进而分析栏目内容的安排是否合理,并为电子商务平台提供个性化推荐商品界面提供了依据。具有较高的数据记录及分析使用价值。
二十、Redis 存储模式
结构类型(共8种,考6种)
1.字符串( String):字符串是 Redis 数据库最简单的数据结构
2.列表 (List):列表是由若干插入顺序排序的字符串元素组成的集合
3.集合( Set):集合是指由不重复且无序的字符串元素构成的一个整体
4.散列表( Hash):散列表可以存储多个键值对的映射,是无序的一种数据集合
5.有序集合 Sorted Set):有序集合和散列一样都是由键值对构成数据集合,主要区别是有序集合根据值进行自动排序,而散列表值不排序:有序集合可以对值直接进行操作,而散列通过键查找来获取值。
6.位图( Bitmap):位图不是实际的数据类型,而是在 String 类型上定义的组面向比特( Bit )的操作
二十一、管道技术原理
Redis数据库从客户端到服务器传输命令,采用请求一响应的 TCP 信协议。如一个命令从客户端发出查询请求,并往往采用阻塞方式监听Socket接口,直到服务器端返回执行结果信号,一个命令的执行时间周期才告结束。这个时间周期叫做往返时间,实现原理如图:
客户端在t1时刻通过Socket连接服务器端 Socket 并发送命令给服务器端,服务器端Redis执行该命令,并把命令执行结果返回客户端,最后在t2时刻关闭 Socket 连接。t2-t1的时间差就是一条简单命令的RTT。若网络通道比较拥堵,或者命令在服务器端执行过程比较长,那么会拉长RTT的时间周期,加上该命令执行方式的阻塞效应,影响客户端软件的响应效率,从而影响用户的使用体验。
如一条命令的 RTT 延长到200毫秒,那么10条连续的命令将消耗200毫秒的时间,这将制约客户端与服务器端的快速处理命令的条数,也会影响到用户使用的感受,于是人们发明了管道技术,其基本原理是:先批量发送命令,而不是一条一条地返回执行命令,等服务器端接收所有命令后,在服务器端一起执行,最后把执行结果一次性发送回客户端。这样可以减少命令的返回次数,并减少阻塞时间,被证明是可以大幅提高命令的执行效率的。事实上该技术己经发明了几十年,并被广泛使用。Redis 数据库支持管道技术的使用。
二十二、Lua 脚本使用优势
1. 减少网络开销:在交互模式下,相关代码从客户端传到服务器端执行命令,是需要产生额外的通信带宽消耗,同时会产生通信时间延迟的问题,而把部分特殊代码直接放到服务器端执行,则可以解决因交互而产生的额外的网络开销问题。
2. 原子性操作:Lua 脚本在服务器端执行时,将采用排它性行为,也就是脚本代码执行时,其他命令或脚本无法在同一个服务器端执行(除了极个别命令外)同时命令实现要么都被执行,要么都被放弃,具有完整的执行原子性。
3. 服务器端快速代码替换:对于一些经常需要变化业务规则或算法的代码,可以考虑放到服务器端交给Lua 脚本来统一执行。
因为 Lua 脚本第一次被执行后,将一直保存在服务器端的脚本缓存中,可以供其他客户端持续调用,效率高,占用内存量少。当需要改变Lua脚本代码时,只需要更新内存中的执行脚本内容即可,无需修改业务系统的原始代码,这样做的好处是在代码更新过程中对客户端几乎不产生操作影响,同时方便了技术人员对业务规则或算法的灵活更新。用过关系型数据库存储过程的技术人员,应该能明显体会到这样做的好处。
二十三、MongoDB 操作速度优化常用优化方法
1.开启 MongoDB 慢命令检测功能
2.使用 explain 命令分析问题语句
3.Mtools 工具分析日志
4.Mongoreplay 监控工具
二十四、MongDB常见的一些数据设计优化方法
- 数据量评估及解决:在实际生产环境下,对业务数据增长量的评估是非常重要,它可以决定是否采用分布式部署、读写分离设计,甚至可以决定一个集合的索引是否设置合理。
- 数据结构优化设计:在大规模数据应用情况下,不同数据的结构,将影响到 MongoDB 的读写操作性能。好的快速的响应性能,能给用户带来良好的印象,增加用户使用网站的欲望,差的的延迟严重的响应性能,会直接导致用户数的丢失,这是件非常糟糕的事情
- 使用封顶集合快速读写:对于特定数据的读写操作,可以通过采用封顶集合来快速实现。
- 把尽可能多的数据操作放在业务系统代码端进行:对于代码端能处理的数据,就不要放到MongoDB数据库服务器端去处理,这也是基本设计原则之一。
二十五、MongoDB读写数据方式
二十六、读写分离应用场景
- 一致性不敏感的数据:具体如大型电子商务平台,存在大量的商品点评信息,在业务上来说,如果从从节点读取某商品的点评信息,一年发生少数读取数据不一致问题,对于访问信息的顾客是可以容忍的。
- 后台统计分析数据:如大型电子商务平台需要定期分析商品浏览排行信息,而该信息作为电子商务平台运行商或平台上的商家所关心的数据。
- 写入不频繁,读高负荷的场景: 如在典型电子商务平台,一些常用商品基本信息,一旦写入完成,后续修改等操作很少,处于相对固定不变的状态。
二十七、Redis 操作速度优化有哪几种
1.Redis 读写分离:当一台Redis服务器承受读写访问达到极限时,就应该考虑建立Redis分布式集群,让不同Redis服务器承担读、写操作,以分流大访问量带来的负荷压力问题。
2.内存配置优化:Redis数据库主要基于服务器的内存运行,所以通过对内存使用优化可以进-步提高数据库的运行效率。
二十八、配套硬件优化方法
- 采用 SSD 硬盘:
最新的采用3D NAND技术的 SSD 其最大存储量可以达到4TB ,读取速度可以达到3.28Gb/s,而写入速度可以达到 2.1Gb/s, 这对处理高访问量的大数据,提升数据库系统响应性能具有极大的诱惑。
- 服务器性能一致
在大多数电子商务平台模式下,一定要保证一个集群内的服务器硬件性能指标都一致,避免有些服务器速度快有些服务器速度慢等不一致问题的发生。
- 采用光纤局域网
在大数据运行环境下,数据的读写速度,受网络环境的影响是明显的。在必要的情况下,应该考虑光纤局域网来连接数据库集群。目前普通局域网主要采用超五类双绞线,标准传输率在100MB/s,最高支持1000MB/s。光纤传输率目前主流的达到了l0Gb/s
- 采用时钟同步
在NoSQL数据库采用分布式部署的情况下,必须考虑多服务器之间的时钟同步问题。分布式运行采用心跳方式传递消息,执行数据一致过程,如果服务器之间的时间不一致,会导致分布式系统无法正常运行,进而出现故障。在大规模服务器集群的情况下,会专门设置时间同步服务器。
二十九、快照( Snapshot )复制
文件系统快照是任何一个操作系统容量管理的特性并不仅仅针对于 MongoDB。快照的机制依赖于基础的存储系统。例如,如果您使用的是亚马逊的EBS存储, EC2 的系统将会支持快照。此外,Linu VM 管理器也可以创建快照。
三十、块迁移过程
在分片集群情况下,Balancer 实现数据块迁移再平衡过程如图。Balanc进程部署于Config Server 主节点上,对分片集群进行动态监控。当发现分片1、分片2存储的数据块不平衡时,依据迁移阈值, 把分片1多出来的数据块3迁移到分片2中,使分片1和分片2数据块数量实现再平衡,井把平衡结果在 Config Server 里做记录。
三十一、持久性问题
- RDO 持久化
RDB 持久化又叫快照持久化,通过 fork 命令建立一个子进程,以一定时间间隔对内存数据进行快照操作,临时保存在磁盘 dump.rdb 的二进制文件中,最后通过原子性 rename 命令将临时文件重命名为 RDB 正式文件。
RDB 持久化可以通过配置文件参数设置实现,也可以通过命令控制实现。
- AOF持久化
与RDB 相比,AOF更接近于实时备份,它通过fsync策略每秒往AOF文件写入内存操作数据。这意味着在停电等问题发生情况下,最多丢失1秒钟内的在内存中新变化的数据。另外它属于追加方式进行持久化操作,发送一条命令,就同步写入新的数据到AOF记录文件末尾。因此在写入过程中即使出现岩机现象,也不会破坏日志文件中己经存在的内容
AOF持久化通过配置系统配置文件来实现
持续更新.....
♥♥♥每天提醒自己,自己就是个菜鸡!
♥♥♥已经看到最后啦,如果对您有帮助留下的每一个点赞、收藏、关注是对菜鸡创作的最大鼓励❀
♥♥♥有相关问题可以写在评论区,一起学习,一起进步。