本文共 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大于students5000mongo如何定义服务器参数
这个配置里的参数就是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/