博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019/08/14 mongodb索引及复制集(03)~1
阅读量:3923 次
发布时间:2019-05-23

本文共 5609 字,大约阅读时间需要 18 分钟。

mongodb是基于文档存储的,nosql,数据是json object,

在这里插入图片描述
**
对应nosql技术流派有几种,
列式数据库:HBASE、hypertable
列式的特性(存储是以列为单位,以字段为单位)、
文档数据库:mongodb,couchdb,
把数据存储为文档,文科可以嵌套,适用的场景是web应用
键值数据库,redis、memcachedb、riak
图式数据库:Neo4j**
在这里插入图片描述
mongod服务端,客户端mongo
基于json语言来实现,
db.stats()统计数据,show.dbs有几个数据库,show collections有几个集合,表,db.getcollectionnames()得到表名
crub:create read update delete
db.mycoll.insert({key1:value1,key3:{key11:value11}})json对象,键值对可以嵌套
db.mycoll.find()
比较操作:$ge大于,{field:{gt:value}},gte,lt,lte,ne,in,nin
逻辑操作符:or,and,not
存在性判定:exists,
值类型判断:type
db.mycoll.find().limit(),count().skip()跳过几个
db.mycoll.fineone()找到第一个
db,mycoll.update()更新
db.mycoll.remove()删除
db,mycoll.drop()、db.dropdatabase()
在这里插入图片描述
依赖索引来实现对特定数据事先定义好数据结构,根据这个结构来进行数据查找
collection里面有很多文档,要想实现文档的快速查找,还需要做排序,要想做索引需要针对特定字段来实现,查找条件中的字段,原始数据插入数据,索引中加了一个项目,索引项也需要随着原始数据的改变而改变,原始文件删除,索引也需要删除一项,索引加速了查询,但是也增加了写操作
索引是特殊结构,里面的数据是排序的数据,根据索引查找的不是直接结果,在索引指向的位置再执行一次IO才能找到数据
mongodb一样需要索引数据,如何去构建索引,
索引的类型:B+tree平衡树索引,hash索引(把对应字段的每个键构建成,hash的格式,根据hash值查找原始数据位置,hash值被有效地分散在hash桶bucket当中,先找到hash桶再找到hash桶里的hash值,与此前的键值对查找一样,不同的是hash值查到的值是指向原始数据的指针,比Btree索引查找,性能高很多)
空间索引,全文索引
在这里插入图片描述

https://docs.mongodb.com/manual/indexes/#index-types在这里插入图片描述在这里插入图片描述

**mongodb索引类型
单字段索引
compound index组合索引,多字段索引
(组合索引,多个字段的索引,把索引构建在多个字段上,查年龄和名字,加入年龄和名字都各有索引,这样查询,组合起来查询可能只会用一个,所以要组成一个)
Multikey Index多键索引 (索引创建再一个值内部,子文档的索引)
Geospatial Index 空间索引
Text Indexes文本索引 支持搜索整个文档中的文本串的,全文索引
Hashed Indexes索引,仅支持精确值查找,因为hash的键保存的是hash值
(树状索引把值做排列,在一个个分支上,通常范围查找是要用到树状索引
mysql可以用explain来查看索引是否有效被用到) **

https://docs.mongodb.com/manual/indexes/#index-creation

创建索引在这里插入图片描述在这里插入图片描述在这里插入图片描述

**索引创建可以在后台,因为有些数据量比较大
**在这里插入图片描述在这里插入图片描述
索引有约束,比如创建唯一键(对应字段值都是唯一的)
唯一,然后把以前重复的数据移除dropdups在这里插入图片描述
索引还可以指明稀疏格式的索引。不是为每一个值都是构建一个索引,会使得索引本身体积较小,但查找有可能需要二次实现
如果文件本身是顺序存放的才能使用稀疏索引,使用稀疏索引使用sparse=true即可
在这里插入图片描述
mongo客户端shell程序连接到本地的mongod,use创建数据库,
循环方式插入数据
在这里插入图片描述
开个终端查看有没有数据在这里插入图片描述
在name和age上索引该如何实现在这里插入图片描述
ensureindex,选项,unique唯一键索引,dropdups重复删掉在这里插入图片描述
获取索引在这里插入图片描述
ensureindex指定字段name:1,升序索引
getindexes可以显示索引的个数
在这里插入图片描述
如果想再创建索引,需要把原来的索引删除,drop删除,+字段name_1,需要用引号引起来,再次get就没有了在这里插入图片描述
再次构建索引,使用unique在这里插入图片描述
插入重复数据就生效了
在这里插入图片描述

mongodb与索引相关的方法

db.mycoll.ensureIndex(field[,options])
name,unique,dropdups,sparse稀疏格式的索引
db.mycoll.dropindex(index_name)删除指定索引
db.mycoll.dropindexes()删除所有索引
db.mycoll.getindexes()查看索引
db.mycoll.reindexes()重建索引
在这里插入图片描述
有了索引查找速度就会很快,explain可以找出整个详细执行过程在这里插入图片描述
比5000大的扫描了,扫描了5551条记录,是做字串比较的,5551个,比如students666大于students5000在这里插入图片描述

mongo如何定义服务器参数在这里插入图片描述

这个配置里的参数就是help的各种参数在这里插入图片描述
-f读取配置文件
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述**这些选项都可以写到配置文件里
**
通用选项
在这里插入图片描述
复制选项在这里插入图片描述
主从复制选项
在这里插入图片描述
复制集选项
mongodb支持两种操作,
主从复制,(基本废弃)
复制集复制(有很强大的自我管理功能,当主节点出现故障 ,自动选举一个节点成新的主节点)
在这里插入图片描述
切片如何实现
在这里插入图片描述

mongod的常用选项

fork-{true/flase}决定mongodb是否允许在后台
bind_ip=IP 指定启动后监听的地址
port=PORT: 指定监听端口 27017,28017
maxconns 支持的最大并发连接数
logpath 日志文件位置,mongodb自行管理的日志,自己管理 (log是历史事件日志,journal 与事务日志比较接近)
syslog 也可以把日志发送给syslog来管理
syslogfacility 用syslogfacility 来记录日志
logapend 实现日志滚动的,覆盖在指定文件后面,而不是覆盖
keyfile 私钥文件存放位置
setparameter 设定配置参数的
httpinterface 是否启动http 接口,用这个web页面来监控mongodb的信息
auth 是否mongoshell执行认证
–repair 启动mongodb时先修复各database
journal 启动类似事务日志功能(需要启用,保证mongodb数据持久的)单实例下,journal是一定要启动的
journalcomminterval
–cpu是 显示cpu和io的利用率信息
sysinfo 显示系统级别诊断相关信息
slowms 慢查询诊断,执行多长的查询才算慢查询,毫秒
profile 性能剖析,提供数据库启动以后,每个操作大概的时长来获取当前数据库性能所在,1仅剖析慢查询。2所有查询,在生产中没有必要就关闭
在这里插入图片描述
在这里插入图片描述

**为了防范数据库出现问题通常需要提供一定的冗余能力

提供了两种类型的复制
主从复制和mysql类似,master/slave
复制集副本集,自动实现故障转移,更容易故障恢复
(多个节点,都持有同样的数据,一定有一个主节点支持读写操作,而另外的节点是从节点,只能支持读
一个复制集只能有一个主节点
mongodb是通过将数据保存在操作日志中实现的)
主节点将数据修改操作保存至oplog中,各从节点通过此oplog来复制数据,并应有本地
这样的情况和mysql类似,只不过名称是另外一种,
oplog跟mysql的binlog还是有比较大差别的,但是oplog通常在副本集当中复制时有自己内在格式,而且是无法查看的,所以不会想讲mysql的对应日志一样,全部读出来,虽然mongodb是主从的,虽然也是异步复制,但其实是有诸多方案,能保证二者的,从节点跟主节点的数据集尽可能时刻保持一致,有所谓的心跳机制,所以从这个机构中,读写都从主节点,而从节点只能负责读,从节点复制的时候,一般来讲,主节点不可用的时候,当一个主节点出现故障的时候,两个从节点会通过心跳信息,不断地去检测主节点,每隔2S发一次心跳,在10s之内,如果收不到主节点心跳,这两个从节点会重新触发一次选举操作,并选举其中一个节点成为新的主节点
如何选举,看谁的优先级高,如果优先级一样,就看网络之类的情况,选举,这个从会自动设置为主,所以无需任何手动参与。
**在这里插入图片描述
除了主从,一个复制集应该有第三个节点,副本集至少有三个节点,因为只有三个节点,才能判定自己是正常还是不正常,找一个仲裁节点,第三个节点就是为了仲裁,另外两个是主从,当任何节点联系不到对方的时候,都去联系仲裁,仲裁决定谁才是胜出的
arbiter :仲裁者
一般来讲至少有三个节点,即便没有三个,也需要提供仲裁成员,以方便实现仲裁的。一旦主节点和其他节点的中断通信超过十秒,副本集触发选举,选举一个从节点成为新的主节点,各节点通常不停地通过心跳来判定健康状态,每隔两秒进行一次,
在这里插入图片描述
**工作特性,至少三个节点,且为奇数节点,可以使用arbiter来参与选举:
heartbeat(2s)来实现自动失效转移(通过选举方式实现)
**

在这里插入图片描述

复制集中的特殊节点分类:
客户端通过读偏好,来从副本集中的从节点读取数据,跟mysql一样,复制可能是级联式的,一个从节点既可以从主节点复制数据,也可以从其他从节点复制数据,必要时从节点可以通过选举跃升为主节点,也可以设定特殊的节点
第一种 0优先级的节点,不会被选举称为主节点,冷备节点(不会被选举成主节点,可以参与选举过程)是用在异地容灾方面的,(两个机房,1个机房主从都在,2机房,参与选举,有数据)真正使用也是这么来的
第二种 ,被隐藏的从节点,不想被别人访问数据的,这种称谓隐藏的从节点,同一个副本集中的不同工作流的节点,隐藏从节点必须是一个0优先级的节点,不会显示mongodb状态信息显示中,不会成为主节点,但依然有选举权,比0优先级的多了,不会被客户端访问到(对客户端不可见,0优先级的从节点)
第三种,延迟复制节点,会比主节点慢一点时间窗口,所以数据一定处于过期状态,也是个0优先级的节点,且复制时间落后于主节点一个固定时长,所以是过期数据,都可以参与选举
第四种,arbiter仲裁者,对数据没有的,更加不能成为主节点
这些就是复制集中的节点特殊类型在这里插入图片描述在这里插入图片描述

mongodb的复制架构:

oplog(实现复制过程的基础性工具),
每一个节点都持有oplog,默认都有,大小固定的文件,存储在local数据库中,默认有一些collection,oplpg主要记录本地指定数据库的每个修改操作的,虽然每个节点都有oplog,但是只有主节点会写oplog,并同步给其他从节点,因此当一个新的从节点提升为主节点以后,就有权写本地的oplog(不像mysql的binlog随着时间增长而增大,但oplog是大小固定的,刚启动数据库的时候,就会初始一个oplog,大小是对应oplog所在文件系统大小的5%,如果小于 1G,就为1G,最小就是1G
oplog是幂等性,同一个oplog在同一个mongodb运行多次都没事,运行结果是一样的,从节点后面加上会自动从主库复制数据而不是oplog、)
heartbeat(心跳信息传递,触发选举)
**
常用类型从节点对于主节点的操作
初始同步(intiial sync)
回滚后追赶(post-rollback catch-up)
切分块迁移(sharding chunk migrations)**在这里插入图片描述

oplog存放在local数据库中

local:存放了所有副本集的元数据和oplog,local数据库自己不会参与数据复制过程,其他的库都会被复制,local自己不会参与复制过程,用于存储oplog是一个名为oplog.rs的collection;
但这个文件默认情况下并不会被创建,当这个节点称为副本集中的从节点,加入副本集以后第一次启动时,会自动创建oplog.rs,大小是有默认的,依赖于OS及文件系统,64位系统启动,一开始可能默认是138M,32位是48M,但可以自定义大小,有个选项oplogsize,默认是磁盘空间的5%,默认单位是MB
在这里插入图片描述

mongodb的数据同步类型,(跟mysql一样,加入从节点的时候,可能主库已经跑一段时间了,这些数据需要很长一段时间来同步)

初始同步(两种方式):mongodb会查询每个数据库的collection,而后将这些数据插入本地的响应collection中,克隆所有数据库,2.读取oplog执行操作
3.所有collection构建相应索引
副本集没有数据或者丢失了数据会进行初始化同步
(节点没有任何数据时,节点丢失副本复制历史)
复制

初始同步的步骤:

1.克隆所有数据库
2.应用数据集的所有改变,复制oplog,并应用在本地
3.为所有collection构建索引

单实例必须把journal功能打开,否则持久性将无法保证

mongodb支持多线程复制,性能比mysql好

初始同步完成以后就进入复制阶段在这里插入图片描述

转载地址:http://fjkgn.baihongyu.com/

你可能感兴趣的文章
6-1 数组工具类的设计 (16分)
查看>>
7-1 程序填空题2 (12分)
查看>>
7-2 程序改错题3 (12分)
查看>>
7-3 计算年龄 (20分)
查看>>
7-3 利用集合类排序 (12分)
查看>>
6-1 创建一个直角三角形类实现IShape接口 (10分)
查看>>
6-2 从抽象类shape类扩展出一个圆形类Circle (10分)
查看>>
7-1 jmu-Java-04面向对象进阶--02-接口-Comparator (20分)
查看>>
7-2 图形继承与多态 (30分)
查看>>
7-3 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (30分)
查看>>
Abbreviation----Java实现
查看>>
7-6 停车场管理(Java实现)
查看>>
7-1 过河 (15分) Java实现
查看>>
7-2 跳一跳 (15分)Java实现
查看>>
6-1 xcu-sjjg-java-List-1 判断顺序表是否有序 (10分) Java实现
查看>>
7-1 数组循环左移 (20分) Java实现
查看>>
7-10 冲锋衣选货及折扣 (15分)Java实现
查看>>
7-3 矩阵转置 (20分)
查看>>
7-5 打dotaⅡ (20分)Java实现
查看>>
7-2 大笨钟 Java实现
查看>>