前言
官方形容:MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
下方是MongoDB的api链接,可以查询相关知识
摘要
什么时候适合用非关系型数据库(例如:mongoDB),小编认为就是对事务性要求不高的情况下可以选择。MangoDB可以支持windows也可以支持linux,不建议搭建windows(自学可以,但是非常吃内存,基本有多少内存吃多少内存),建议搭建在linux上。mangoDB有很多的命令行,大致了解就可以,除非需要远程到linux终端上进行操作,正常我们下载robo可视化工具即可操作。https://robomongo.org/
操作命令
mongoDB的基本命令是基于javaScript语言的,不管是删除还是添加都是JavaScript函数,要插入的内容作为函数的参数来实现。插入数据格式基于json,具有存储优势,存储表结构比较灵活。
- 插入
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
数据库存储的不能是json格式,但是展示是json格式。
- 批量插入
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
- 更新
更新用$set
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如
,
,
,inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
更新中删除某个字段用$unset
- 删除
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- 查询(key、value的格式)
db.collection.find(query, projection)
模糊查询用 // {“name”: “/li/”} 模糊查询姓名包含li的员工
mongoDB集群
- 正常集群模式
- 最小集群模式
最好的一种设计,每一个方块代表一个物理机,蓝色的是mongoDB的主服务器,不搭建集群的话就有这一台机器,黑色的代表mongoDB的客户端与primary进行读写操作。如果要搭建集群就要为primary配置下方绿色secondary的集群叫复制集,它可以有N个,但是他加上primary最好是奇数个,保证mongoDB的高可用性。当一台机器出现故障方便其他机器进行选举投票。一般实际应用7台就差不多了。secondary从primary上复制数据,我们在decondary上读取数据,可以提高效率,从primary上读就会给她照成压力。所以主节点(primary)一般都是负责写操作,从节点负责备份、水平扩展、和分担主节点的查询压力。
最小的mongoDB集群,只有两台机器,想做个同步和备份,保证primary出现故障另一台机器能马上顶上工作。橙色的仲裁者节点arbiter他不保存数据,他只负责投票。它和从节点有个心跳heartbeat保持连接。他不同步数据,只是投票的时候用到它所以对机器配置要求不高(一核两G即可)。只有主节点、从节点对CPU、内存要求高。
- 总结
主节点primary他是可读可写的,和用户进行交互。从节点secondary复制集的方式把主节点的数据实时的同步到自己的节点上。从节点为了分担主节点压力也可以让客户端连接到从节点,指定一台从节点进行读取操作,但不能写入。
从节点怎么从主节点复制数据
mongoDB不像正常关系型数据库时刻保持原子的一致性,非关系型数据库可以允许他主子结点之间存在一段时间的数据同步过程。
primary主节点不但保存了数据,他还保存了日志。日志里记录的是一条条的命令。secondary同步不是保存二进制数据进行拆分 然后复制过来,他只是从primary上同步日志,因为日志是严格按照顺序执行的。secondary把primary上的日志复制过来,全部执行一遍,若没发生BUG那就证明secondary的数据跟primary是完全一致的。secondary就是同步服务器的日志。但是他同步数据如果primary故障了怎么办呢? 有以下几种情形
- 第一种就是,客户端发起请求,primary自己还没写入自己的DB上,然后出故障了·,这时写入失败了,其中一个secondary变成主服务器,重新执行操作。
- 第二种是primary已经写入成功了,secondary同步日志的时候由于网络等等故障原因同步失败,这是primary和secondary上的数据不一致了,这种就不适用于要求数据一致性强的情景,比如银行。以为mongoDB的写入成功他只确保primary写入成功,不确定secondary是否成功,要是想接受所有的数据一致性那就要接受它有一定的延迟。
这个时候就用上了 writeConcern这个参数,{“writeConcern”: {“w”:0}}
w等于0就是网络那边接收到请求就返回成功,这样是响应相率最快的,默认一般w都是1,一般就是一台机器成功就返回成功,那肯定是主节点写入就是成功,这个时候返回成功不要立刻去secondary上读因为此时是peimary的写入成功。除非是业务要求不高,比如插叙文章数量,差一两条,过一会就同步了,但是是对一致性要求不高的业务。w等于2那就是一台主,一台从。
总结
关于集群搭建挺复杂的,不建议自己练习搭建操作,它还有安装、配置连接数、内存等等一系列运维知识。主要记住常用命令,复制集概念即可。