NoSQL-MongoDB

mongo的特点

⾼性能:
Mongodb提供⾼性能的数据持久性
尤其是⽀持嵌⼊式数据模型减少数据库系统上的I/O操作
索引⽀持能快的查询,并且可以包括来嵌⼊式⽂档和数组中的键
丰富的语⾔查询:
Mongodb⽀持丰富的查询语⾔来⽀持读写操作(CRUD)以及数据汇总,⽂本搜索和地理空间索引
⾼可⽤性:
Mongodb的复制⼯具,成为副本集,提供⾃动故障转移和数据冗余
⽀持多种存储引擎:
WiredTiger存储引擎和、MMAPv1存储引擎和InMemory存储引擎

mongo的应用场景

游戏场景,使⽤ MongoDB 存储游戏⽤户信息,⽤户的装备、积分等直接以内嵌⽂档的形式存储,⽅
便查询、更新
物流场景,使⽤ MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌
数组的形式来存储,⼀次查询就能将订单所有的变更读取出来。
社交场景,使⽤ MongoDB 存储存储⽤户信息,以及⽤户发表的朋友圈信息,通过地理位置索引实现
附近的⼈、地点等功能
物联⽹场景,使⽤ MongoDB 存储所有接⼊的智能设备信息,以及设备汇报的⽇志信息,并对这些信
息进⾏多维度的分析
视频直播,使⽤ MongoDB 存储⽤户信息、礼物信息等,⽤户评论
电商场景,使⽤ MongoDB
商城上⾐和裤⼦两种商品,除了有共同属性,如产地、价格、材质、颜⾊等外,还有各⾃有不同的属
性集,如上⾐的独有属性是肩宽、胸围、袖⻓等,裤⼦的独有属性是臀围、脚⼝和裤⻓等

配置文件

systemLog:
  destination: file #Mongodb ⽇志输出的⽬的地,指定⼀个file或者syslog,如果指定file,必须指定
  logAppend: true #当实例重启时,不创建新的⽇志⽂件, 在⽼的⽇志⽂件末尾继续添加
  path: /opt/mongo_27017/logs/mongodb.log #⽇志路径
storage:
  journal: #回滚⽇志
  enabled: true
  dbPath: /data/mongo_27017 #数据存储⽬录
  directoryPerDB: true #默认,false不适⽤inmemoryengine
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1 #占用内存大小
      directoryForIndexes: true #默认false索引集合storage.dbPath存储在数据单独⼦⽬录
 collectionConfig:
   blockCompressor: zlib
 indexConfig:
   prefixCompression: true
processManagement: #使⽤处理系统守护进程的控制处理
 fork: true #后台运⾏
 pidFilePath: /opt/mongo_27017/pid/mongod.pid #创建 pid ⽂件
net:
 port: 27017 #监听端⼝
 bindIp: 127.0.0.1,10.0.0.51 #绑定ip

启动

/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf

关闭

mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown

systemd管理

[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongo
Group=mongo
ExecStart=/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf
ExecStartPre=/usr/bin/chown -R mongo:mongo /opt/mongo_27017/
ExecStartPre=/usr/bin/chown -R mongo:mongo /data/mongo_27017/ #服务启动前执行的命令
PermissionsStartOnly=true
PIDFile=/opt/mongo_27017/pid/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target

关闭大内存页

echo “never” > /sys/kernel/mm/transparent_hugepage/enabled
echo “never” > /sys/kernel/mm/transparent_hugepage/defrag

关闭mongo自带的监控体验

db.disableFreeMonitoring()

mongo基本操作命令

默认库

test: 登陆的时默认的库,无数据时不显示
admin: 系统预留库,Mongodb的系统管理库
local: 本地预留库,存储关键⽇志
config: 配置信息库

查看数据库

db: 查看当前所在库
show dbs/show databases :查看所有的数据库
show collections/show tables:查看当前库下所有的集合
use admin :切换到不同的库,不存在的库也可以切换

shell窗口执行mongo命令

echo “show dbs”|mongo

插入单条数据

db.user_info.insertOne({name: “zhang”,age: 29,host: “北京”}) #对user_info集合操作

插入多条数据

db.user_info.insertMany([
{name: “zhang”,age: 29,host: “北京”},
{name: “yazhang”,age: 29,host: “上海”},
{name: “yaya”,age: 29,host: “深圳”},
])

查询一条

db.user_info.findOne()

查询所有

db.user_info.find() #默认显示前十行

按条件查询

db.user_info.find({name:“zhang”})

可选显示字段

db.user_info.find({name:“zhang”},{name:1,age:1,_id:0})
#显示name字段和age字段,id字段不显示

逻辑与查询

db.inventory.find( { status: “A”, size.uom:“cm” } )

逻辑或查询

db.inventory.find({$or:[{条件1},{条件2}]})

正则查询

db.inventory.find(
{
 status: "A",
 $or:
 [
 { qty: { $lt: 30 } },
 { item: /^p/ }
 ]
} )

更新单条数据

db.inventory.updateOne(
{ item: /^p/ },
{
$set: { status: “P” }
}
)

查看执行计划

db.user_info.find({age:29}).explain() #COLLSCAN 全表扫描 IXSCAN 索引扫描
FETCH – Retrieving documents
SHARD_MERGE – Merging results from shards
SORT – Explicit sort rather than using index orde

创建索引

db.user_info.createIndex(
{
age: 1
},
{
background: true
}
)

查看索引

db.user_info.getIndexes()

删除索引

db.user_info.dropIndex(“age_1”)

删除单条数据

db.inventory.deleteOne({删除条件})

删除集合

db.user_info.drop()

删库

use
db.dropDatabase()

基于角色访问控制

db.auth() 将⽤户验证到数据库。
db.changeUserPassword() 更改现有⽤户的密码。
db.dropAllUsers() 删除与数据库关联的所有⽤户。
db.getUser() 返回有关指定⽤户的信息。
db.getUsers() 返回有关与数据库关联的所有⽤户的信息。
db.grantRolesToUser() 授予⽤户⻆⾊及其特权。
db.removeUser() 已过时。从数据库中删除⽤户。
db.revokeRolesFromUser() 从⽤户中删除⻆⾊。
db.updateUser() 更新⽤户数据。

  1. 创建管理员用户use admindb.createUser( { user: "myUserAdmin", pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] } )
  2. 配置访问控制security: authorization: enabled
  3. 使用admin登录mongo --authenticationDatabase "admin" -u "myUserAdmin" -p在哪个库创建的用户,用哪个库做登录认证库
  4. 创建普通用户use test db.createUser( { user: "myTester", pwd: "123456", roles: [ { role: "readWrite", db: "db1" }, { role: "read", db: "db2" } ] } ) db.getUsers()

删除用户

mongo --authenticationDatabase “admin” -u “myUserAdmin” -p
use test
db.dropUser(“myTester”)

副本集replica set

主节点 负责读写
副本节点 同步主节点
仲裁节点 不是必需的,不存储数据,不参与竞主,只投票,不消耗什么资源

配置文件

replication:
oplogSizeMB: 1024 #相当于mysql的binlog
replSetName: dba #副本集名称

初始化集群

rs.initiate(
{
_id: “dba”,
version: 1,
members: [
{ _id: 0, host : “10.0.0.51:28017” },
{ _id: 1, host : “10.0.0.51:28018” },
{ _id: 2, host : “10.0.0.51:28019” }
]
}
)

副本节点可读

永久生效
echo “rs.slaveOk()” > ~/.mongorc.js

设置副本节点权重

myconfig=rs.conf()
myconfig.members[0].priority=100
rs.reconfig(myconfig)
#故障转移时设置,设置完自动切换,配置永久生效

主动降级

rs.stepDown()

增加节点

rs.add(“10.0.0.51:28010”)
rs.addArb(“10.0.0.51:28011”) #仲裁节点

删除节点

rs.remove(“10.0.0.51:28010”)

命令行监控mongo

mongostat #查看mongo运⾏状态
mongotop #查看mongo运⾏状态

mongostat --port 28018 -O vsize,res --humanReadable=false --noheaders -n 1
–humanReadable=false #将G转换为K
–noheaders #不输出⾸⾏标题
-n 1 #只输出⼀次

insert/s : 官⽅解释是每秒插⼊数据库的对象数量,如果是slave,则数值前有*,则表示复制集操作
query/s : 每秒的查询操作次数
update/s : 每秒的更新操作次数
delete/s : 每秒的删除操作次数
getmore/s: 每秒查询cursor(游标)时的getmore操作数
command: 每秒执⾏的命令数,在主从系统中会显示两个值(例如 3|0),分表代表 本地|复制 命令
注: ⼀秒内执⾏的命令数⽐如批量插⼊,只认为是⼀条命令(所以意义应该不⼤)
dirty: 仅仅针对WiredTiger引擎,官⽹解释是脏数据字节的缓存百分⽐
used:仅仅针对WiredTiger引擎,官⽹解释是正在使⽤中的缓存百分⽐
flushes:
For WiredTiger引擎:指checkpoint的触发次数在⼀个轮询间隔期间
For MMAPv1 引擎:每秒执⾏fsync将数据写⼊硬盘的次数
注:⼀般都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以⼤致了解多⻓时间flush⼀
次。flush开销是很⼤的,如果频繁的flush,可能就要找找原因了
vsize: 虚拟内存使⽤量,单位MB (这是 在mongostat 最后⼀次调⽤的总数据)
res: 物理内存使⽤量,单位MB (这是 在mongostat 最后⼀次调⽤的总数据)
注:这个和你⽤top看到的⼀样, vsize⼀般不会有⼤的变动, res会慢慢的上升,如果res经常突
然下降,去查查是否有别的程序狂吃内存。
qr: 客户端等待从MongoDB实例读数据的队列⻓度
qw:客户端等待从MongoDB实例写⼊数据的队列⻓度
ar: 执⾏读操作的活跃客户端数量
aw: 执⾏写操作的活客户端数量
注:如果这两个数值很⼤,那么就是DB被堵住了,DB的处理速度不及请求速度。看看是否有开销很⼤
的慢查询。如果查询⼀切正常,确实是负载很⼤,就需要加机器了
netIn:MongoDB实例的⽹络进流量
netOut:MongoDB实例的⽹络出流量
注:此两项字段表名⽹络带宽压⼒,⼀般情况下,不会成为瓶颈
conn: 打开连接的总数,是qr,qw,ar,aw的总和
注:MongoDB为每⼀个连接创建⼀个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接
数的启动参数,maxIncomingConnections,阿⾥⼯程师建议在5000以下,基本满⾜多数场景

备份

mongodump --host=“dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019” -d
oldboy -c user_info -o ./mongo_backup --gzip #默认bson格式
mongoexport --host=“dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019” -d
test -c user_info -o mongo_backup/test.user_info.json #json格式
mongoexport --host=“dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019” -d
test -c user_info --type=csv --fields=name,age,host -o mongo_backup/test.user_info.csv
#fields导出的字段,csv格式

恢复

mongorestore --host=“dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019”
mongo_backup --gzip --drop
#恢复gzip格式的文件,遇到相同的进行覆盖
#–dryRun
#–dir=./mongo_backup/oldboy/cook.bson -d oldboy -c cook恢复到指定集合必须时bson格式

异构数据迁移

select * from world.city into outfile ‘/var/lib/mysql/city.csv’ fields terminated by ‘,’;
#数据以逗号分隔
手动添加字段
mongoimport --host=“dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019” --type=csv --headerline -d world -c city /var/lib/mysql/city.csv --drop

故障恢复

  1. 备份oplog文件,复制到全备中oplog.bson
  2. 查找误删除的具体时间点db.oplog.rs.find({"ns" : "backup.$cmd"}).pretty()库名backup
  3. 恢复mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" - -oplogReplay --oplogLimit=1587375719 mongo_backup --drop查找的时间点

你可能感兴趣的:(NoSQL-MongoDB)