介绍
特点
- 将数据存储为一个文档,数据结构由键值(key=>value)对组成。文档类似于 JSON
对象。字段值可以包含其他文 档,数组及文档数组。 - 相比传统的关系型数据库,它非常容易被扩展,这也为写代码带来了极大的方便。
- 对数据之间事务关系支持比较弱,不适合此类型的应用。
- MongoDB 的提供了一个面向文档存储,操作起来比较简单和容易。
- 替换修改使用update()命令可以替换完成的文档(数据)或者一些指定的数据字段
- MongoDB中的 Map/reduce 主要是用来对数据进行批量处理和聚合操作。 Map函数调用 emit(key,value)
遍历集合中所有的记录,将 key 与 value 传给 Reduce 函数进行处理。 - GridFS 是分布式文件系统一个内置功能,可以用于存放大量小文件。
- MongoDB 以 BSON 结构(二进制)进行存储,对海量数据存储有着很明显的优势。
- 查询语句:是独特的MongoDB的查询方式。 查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组
- 适合场景:事件的记录,内容管理或者博客平台等等。
- 架构特点:可以通过副本集,以及分片来实现高可用。
- 数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存 中,从而达到高速读写。
- 成熟度与广泛度:新兴数据库,No SQL 数据库中最为接近关系型数据库
持久化方式
读
MongoDB 的所有数据实际上是存放在硬盘的,所有要操作的数据通过 mmap 的方式映射到内存某个区域内。
写
MongoDB 的所有数据实际上是存放在硬盘的,所有要操作的数据通过 mmap 的方式映射到内存某个区域内。
MongoDB 就在这块区域里面进行数据修改,避免了零碎的硬盘操作。
mmap上的内容flush到硬盘就是操作系统的事情了。
#内存中修改数据后,mmap 数据flush到硬盘之前,系统宕机,数据就会丢失。
监控
Munin插件是网络和系统监控工具
Gangila插件是系统监视的工具
Cacti基于图形界面,用于查看CPU负载, 网络带宽利用率
优点缺点
优点
- 弱一致性(最终一致),更能保证用户的访问速度
- MongoDB本身的 failover 机制,无需使用如 MHA 之类的方式实现。
缺点
- 主要是无事物机制!
- 不支持事务操作(最主要的缺点)
- 占用空间过大
适用场景
- 数据不是特别重要(例如通知,推送这些)
- 数据表结构变化较为频繁
- 数据量特别大
- 数据的并发性特别高
- 数据结构比较特别(例如地图的位置坐标)
不适用的场景
- 需要使用复杂sql的操作
- 事务性系统
部署
单机
-
解压包
tar -xvf mongodb-linux-x86_64-rhel70-3.6.3.tgz -C /data/ mv /data/mongodb-linux-x86_64-rhel70-3.6.3/ /data/mongodb-3.6.3
-
修改配置文件
vim /data/mongodb-3.6.3/mongodb.conf #端口号 port=27017 #db目录 dbpath=/usr/local/mongodb-3.6.3/data #为每一个数据库按照数据库名建立文件夹存放 directoryperdb=true #不预先分配存储 noprealloc=true #日志目录 logpath=/usr/local/mongodb-3.6.3/logs #以追加的方式记录日志 logappend=true #日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5% oplogSize=10000 #以后台方式运行进程 fork=true #mongodb所绑定的ip地址 bind_ip=节点IP #进程文件 pidfilepath=/mongodb/master.pid
-
创建相关文件
mkdir /data/mongodb-3.6.3/data mkdir /data/mongodb-3.6.3/logs touch /data/mongodb-3.6.3/logs/mongodb.log
-
启动
配置启动文件
vim mongod.service [Unit] Description=mongodb After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/local/mongodb3.6.2/bin/mongod --config /usr/local/mongodb3.6.2/bin/mongodb.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/usr/local/mongodb3.6.2/bin/mongod --shutdown --config /usr/local/mongodb3.6.2/bin/mongodb.conf PrivateTmp=true [Install] WantedBy=multi-user.target
cd /data/mongodb-3.6.3 ./bin/mongo -f /usr/local/mongodb-3.6.3/mongodb.cnf #关闭 ./bin/mongo -f /usr/local/mongodb-3.6.3/mongodb.cnf --shutdown
netstat -tunpl | grep 27017
集群
Replica Set副本集
集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主 节点一致。
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点 不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询 服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置 叫做Read Preference Modes
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升 为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来 提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了 备节点还是备节点,所以咱们还是需要它的。
-
解压包(每个节点)
tar -xvf mongodb-linux-x86_64-rhel70-3.6.3.tgz -C /data/ mv /data/mongodb-linux-x86_64-rhel70-3.6.3/ /data/mongodb-3.6.3
-
修改配置文件(每个节点)
vim /data/mongodb-3.6.3/mongodb.conf #端口号 port=27017 #db目录 dbpath=/usr/local/mongodb-3.6.3/data #为每一个数据库按照数据库名建立文件夹存放 directoryperdb=true #不预先分配存储 noprealloc=true #日志目录 logpath=/usr/local/mongodb-3.6.3/logs #以追加的方式记录日志 logappend=true #日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5% oplogSize=10000 #以后台方式运行进程 fork=true #mongodb所绑定的ip地址 bind_ip=节点IP #进程文件 pidfilepath=/mongodb/master.pid #replica set的名字 replSet=123qweasd
-
创建相关文件(每个节点)
mkdir /data/mongodb-3.6.3/data mkdir /data/mongodb-3.6.3/logs touch /data/mongodb-3.6.3/logs/mongodb.log
-
启动mongodb
-
配置主,备,仲裁节点
#可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。
./mongo 10.10.148.130:27017 #ip和port是某个节点的地址 use admin cxktest={ _id:"replica set的名字", members:[ {_id:0,host:'10.10.148.130:27017',priority:2}, {_id:1,host:'10.10.148.131:27017',priority:1}, {_id:2,host:'10.10.148.132:27017',arbiterOnly:true}] };
#使配置生效 rs.initiate(cxktest)
Sharding
一个仲裁节点,但是Sharding还需要配置节点和路由节点。就三种集群搭建方式来说,这种是最复杂的
-
启动数据节点
#192.168.4.43 ./mongod --fork --dbpath ../data/set1/ --logpath ../log/set1.log --replSet test #192.168.4.44 ./mongod --fork --dbpath ../data/set2/ --logpath ../log/set2.log --replSet test #192.168.4.45 决策 不存储数据 ./mongod --fork --dbpath ../data/set3/ --logpath ../log/set3.log --replSet test
-
启动配置节点
#192.168.4.30 ./mongod --configsvr --dbpath ../config/set1/ --port 20001 --fork --logpath ../log/conf1.log #192.168.4.31 ./mongod --configsvr --dbpath ../config/set2/ --port 20002 --fork --logpath ../log/conf2.log
-
启动路由节点
#192.168.4.29 ./mongos --configdb 192.168.4.30:20001,192.168.4.31:20002 --port 27017 --fork --logpath ../log/root.log
-
配置Replica Set
#ip和port是某个节点的地址 ./mongo 192.168.4.43:27017 use admin cfg={ _id:"testrs", members:[ {_id:0,host:'192.168.4.43:27017',priority:2}, {_id:1,host:'192.168.4.44:27017',priority:1}, {_id:2,host:'192.168.4.45:27017',arbiterOnly:true}] }; #使配置生效 rs.initiate(cfg)
-
配置Sharding
#这里必须连接路由节点 ./mongo 192.168.4.29:27017 #test表示replica set的名字当把主节点添加到shard以后,会自动找到set里的主,备,决策节点 sh.addShard("test/192.168.4.43:27017") #diameter_test is database name db.runCommand({enableSharding:"diameter_test"}) db.runCommand( { shardCollection: "diameter_test.dcca_dccr_test", key:{"__avpSessionId":1}}) #dcca_dccr_test即为Collection的名字。另外还有个key,这个是比较关键的东西,对于查询效率会有很大的影响
Master-Slaver(不推荐)
#主节点
./mongod --master --dbpath /data/masterdb/
#备节点
./mongod --slave --source <masterip:masterport> --dbpath /data/slavedb/
使用
连接
/usr/local/mongodb/bin/mongo
切换库
use local
增
-
创建表
db.表名.save({"",""}) 例如:db.user.save({‘name’:’bob’,’age’:’21’})
-
添加insert
db.表名.insert({‘name’:’bob’})
删
-
删除当前所在的库
db.dropDatabase()
-
删除表
db.表名.drop() db.表名.remove({}) db.表名.remove({条件})
查
-
显示已有库
show dbs
-
显示当前库
db
-
显示库中的表
show tables
-
查看表中字段
db.表名.find() db.表名.find({条件}) #返回一条文档 db.表名.findOne()
-
统计表中数
db.表名.count()
数据导出
mongoexport --host IP --port 端口 -d 库名 -c 表名 -f 字段1,字段2 --type=csv > XXX.cxv
mongoexport --host IP --port 端口 -d 库名 -c 表名 -q ‘{条件}’ -f 字段1,字段2 --type=json > XXX.json
数据导入
mongoexport --host IP --port 端口 -d 库名 -c 表名 --type=json XXX.json
mongoexport --host IP --port 端口 -d 库名 -c 表名 --type=csv --headerline --drop XXX.json
#--headerline --drop;导入时如果库和表不存在,先创建在导入,如果存在以追加的方式导入,先删除原数据在导入 新数据
备份于恢复
-
备份
#备份所有库 mongodump --host IP --port 端口 -o 目录 #备份指定数据库 mongodump --host IP --port 端口 -d 库名 -c 表名 -o 目录
-
恢复
Mongorestore --host IP --port 端口 -d 库名 -c 表名 XXX.bson
-
查看
Bsondump XXX.bson
喜欢的亲可以关注点赞评论哦!以后每天都会更新的哦!本文为小编原创文章; 文章中用到的文件、安装包等可以加小编联系方式获得;
欢迎来交流小编联系方式VX:CXKLittleBrother 进入运维交流群