1、技术交流 廖诚,2022/10/22,1,议题,什么是NoSQL?为什么要用NoSQL?MongoDB是什么?谁在用MongoDB?MongoDB部署架构MongoDB内部数据结构MongoDB简单应用,2,什么是NoSQL?,NoSQL是Not Only SQL的缩写,而不是Not SQL,它不一定遵循传统数据库的一些基本要求,如SQL标准、ACID属性、表结构等。相比传统数据库,叫它分布式数据管理系统更贴切,数据存储被简化更灵活,重点被放在了分布式数据管理上。,3,什么是NoSQL?,关系数据库的表结构(学生、地址、成绩、科目):,4,什么是NoSQL?,NoSQL的表结构(学生、地址、成
2、绩、科目):,5,什么是NoSQL?,相对应表中一条文档视图:,6,什么是NoSQL?,相对应表中一条文本视图:,7,为什么要用NoSQL?,大数据的特征Volume-数据量巨大,对TB、PB数据级的处理,已经成为基本要求。Variety-数据多样性,能处理结构化、非结构化数据,能处理Web数据,甚至语音、图像、视频数据。Velocity-数据实时性,在客户每次浏览页面,下订单的过程中,都会对用户进行实时的产品推荐,购买决策已经变得非常实时。,8,为什么要用NoSQL?,大数据的性能要求High performance-高并发读写,高并发、实时动态数据查询和修改。Huge Storage-海量
3、数据的高效存储和访问,类似SNS网站,海量用户信息的高效、实时存储和查询。High Scalability&High Availability-高可扩展性和高可用性,需要拥有快速横向扩展能力、提供7*24小时不间断服务。,9,为什么要用NoSQL?,关系数据库处理大数据的弱势面对高并发读写的需求,数据库读写压力巨大,硬盘IO无法承受。面对海量数据,数据库能存储的记录数量有限,SQL查询效率极低。横向扩展艰难,无法通过快速增加服务器节点实现,系统升级和维护造成服务不可用。,10,为什么要用NoSQL?,NoSQL处理大数据的优势数据库结构简单,数据间无关系性,这自然就带来了很高的读写性能,且易扩
4、展。灵活的数据模型,可以随时存储自定义的数据格式。而在关系数据库里,增删字段是件麻烦的事。尤其大数据量的表,增加字段简直就是一个噩梦。通过复制模型可实现高可用性,可以分布部署在低廉的PC集群上。支持动态增加、删除服务器节点,随时控制硬件投入成本。,11,MongoDB是什么?,MongoDB简介一个分布式文件存储数据库,由C+语言编写的开源项目。一个NoSQL中,功能最丰富、最像关系数据库的产品。它支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据模型。它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,而且还支持索引、MapReduce等功能。,12,
5、MongoDB是什么?,MongoDB主要特点高性能、易部署、易使用,存储数据方便。模式自由,支持动态查询、完全索引、文档内嵌查询。面向文档,以K/V形式存储数据,Key用于唯一标识,而Value则可以是各种复杂的数据类型。支持主/从服务器间的数据复制和故障恢复。自动分片,以支持云级别的服务伸缩性,可动态添加、删除额外的服务器。,13,MongoDB是什么?,MongoDB支持的数据类型布尔 ture|false整数 123浮点 12.3字符串 hello world对象ID 用new ObjectId()来声明日期 用new Date()来声明时间戳数组 apple,banana,pear内
6、嵌文档 name:Joe,age:13,phone:home:123,moblie:456RegExp 正则表达式/a-f/,14,MongoDB是什么?,MongoDB适用场景网站动态数据,需要实时的插入,更新与查询。可以做高性能的持久化缓存层。存储大尺寸,低价值的数据。高伸缩性的集群场景。文档化结构的数据存储及查询。,15,谁在用MongoDB?,16,谁在用MongoDB?,17,MongoDB部署架构,Replica Sets架构图,Primary,Secondary-1,Secondary-2,.,18,MongoDB部署架构,Replica Sets角色介绍Primary主服务器,
7、写操作只能在其身上发生,通过保存操作日志(oplog),然后将数据同步到多个 Secondary 上。Secondary从服务器,热机备份主服务器上的数据,分担主机读压力,当主机发生故障不能工作,随时待命接管主机工作。,19,MongoDB部署架构,主/从服务器间数据同步图,20,MongoDB部署架构,主/从服务器间数据同步介绍红色箭头表示数据只能写到主机上,然后再同步到多个从机上。蓝色箭头表示数据可以从主机或从机任意一个上读。各个主机与从机之间,通过心跳包检测机制,同步彼此之间的状态。,21,MongoDB部署架构,Sharding集群架构图,22,MongoDB部署架构,Sharding
8、集群架构角色介绍Shard Server-mongod实例,存储实际数据的模块。Config Server-mongod实例,存储集群的元数据,如分片信息、数据块映射等。Route Server-mongos实例,客户端访问路由(统一接入点),查询优化,数据合并、排序、裁剪,请求推送等。,23,MongoDB部署架构,Sharding机制图,24,MongoDB部署架构,Sharding是什么?分片是指将数据拆分,将其分散到不同服务器上的过程。通过分片能够增加更多的服务器,来应对不断增加的负载和数据。MongoDB何时需要分片?机器的磁盘不够用。单个mongod服务已经不能满足写数据的性能需求
9、。想将大量的数据放在内存中提高性能。,25,MongoDB部署架构,MongoDB怎么分片?指定一个key来进行分片,按key的范围将数据存放到多个chunk上,每个chunk的大小有限制。这些chunk分散保存在多个分片节点上。每个分片节点可以是单个mongod服务,也可以是一个Replica Sets,后者可以实现数据的热备份。当一个chunk超过其限制的最大体积时,会自动分裂成两个小的chunk。当chunk在分片节点中分布不均衡时,会自动引发chunk迁移操作。,26,MongoDB部署架构,一个分片例子如上文students集合,如果选择“_id”作为片键,则第一片存放学号从1100
10、的文档,第二片存放学号从101200的文档,第三片存放学号从201300的文档。,“1”,“100”Shard1,“101”,“200”Shard2,“201”,“300”Shard3,27,MongoDB部署架构,Sharding服务角色图,28,MongoDB部署架构,Sharding服务角色介绍config服务器保存了两个映射关系,一个是key区间的数据都存放在那些chunk上的映射关系,另一个是chunk都存放在哪些分片节点上的映射关系。客户端统一访问路由节点mongos,来进行数据操作。路由节点先访问config服务器获取信息,找到数据真正存放位置,然后再对其进行操作。,29,Mon
11、goDB部署架构,Sharding服务角色介绍路由节在写数据时,还会判断当前chunk是否超出限定大小,如果是就将其分裂成两个chunk。对于按分片key进行的数据查询,路由节点会查到具体数据存储位置,然后再进行相关的工作。对于不按分片key进行的数据查询,路由节点会把操作发给所有分片,然后再对返回结果进行合并、排序等。,30,MongoDB内部数据结构,在文件系统中的存储形式MongoDB会给每个数据库预分配大小逐渐增长的文件集。文件集序号依次为0,1,2.,大小依次是64M,128M,256M,512M,1G,2G,然后就一直是2G的创建下去(32位系统最大到512M)。文件集在内部会被切
12、分成多个数据域,数据域之间使用双向链表连接。不同数据域的存储类别用名字空间区分,如每个集合有自己独立的名字空间,每个索引也有自己独立的名字空间。,31,MongoDB内部数据结构,名字空间与数据域的关系,32,MongoDB内部数据结构,名字空间与数据域的关系每个名字空间可以有不同的数据域,且在磁盘上不必连续。图中还有一个特殊的名字空间freelist,存放着不再使用的数据域,如删除集合或索引产生的数据域。当名字空间分配新的数据域时,会先查找空闲列表,看看是否有适合大小的数据域可用。索引数据也保存在数据域中,其结构被组织成B-Tree形式。在每一个数据域中,保存了具体一行行BSON格式的数据。
13、,33,MongoDB内部数据结构,对每一个域来说,其头部包含了一些元数据,比如自己的位置,上一个域和下一个域的位置,,34,MongoDB内部数据结构,域中第一条和最后一条数据记录的位置,剩下的部分用于存储具体的数据。,35,MongoDB内部数据结构,名字空间与数据域的关系对于每个数据库,都有一个名字空间文件“dbname.ns”。在名字空间文件中,保存的是一个哈希表,存储了每个名字空间的元数据,包括其大小,域数,第一个域位置,最后一个域位置,被删除的域的链表、索引信息等,如下图:,36,MongoDB内部数据结构,37,MongoDB简单应用,MongoDB读操作WHERE#select
14、*from students where name=Joe db.students.find(name:Joe)FIELDS#select name,age from students where age=33 db.students.find(age:33,name:1,age:1)#select name,age from students db.students.find(,name:1,age:1),38,MongoDB简单应用,MongoDB读操作SORT#select*from students order by age db.students.find().sort(age:1)
15、#select*from students order by sex asce,age desc db.students.find().sort(sex:1,age:-1)SLICE#select*from students skip 2 limit 3 db.students.find().skip(2).limit(3)#select*from students where sex=male and age 18 and age db.students.find(sex:“male”,age:$gt:18,$lt:30)比较操作对比:$gt()、$lt(=)、$lte(=)、$ne(!=)
16、,39,MongoDB简单应用,MongoDB读操作IN#select*from students where age in(18,28)db.students.find(age:$in:18,28)#select*from students where age not in(18,28)db.students.find(age:$nin:18,28)COUNT#select count(*)from students where age 18 db.students.find(age:$gt:18).count()OR#select*from students where age=18 or age=28 db.students.find($or:age:18,age:28),40,MongoDB简单应用,MongoDB写操作INSERT#insert into students value()db.students.insert(name:Jeremy,sex:male,age:88)UPDATE#update students set age=100,sex=0 where na
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1