⾼性能:
Mongodb提供⾼性能的数据持久性
尤其是⽀持嵌⼊式数据模型减少数据库系统上的I/O操作
索引⽀持能快的查询,并且可以包括来嵌⼊式⽂档和数组中的键
丰富的语⾔查询:
Mongodb⽀持丰富的查询语⾔来⽀持读写操作(CRUD)以及数据汇总,⽂本搜索和地理空间索引
⾼可⽤性:
Mongodb的复制⼯具,成为副本集,提供⾃动故障转移和数据冗余
⽀持多种存储引擎:
WiredTiger存储引擎和、MMAPv1存储引擎和InMemory存储引擎
游戏场景,使⽤ 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
[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
db.disableFreeMonitoring()
test: 登陆的时默认的库,无数据时不显示
admin: 系统预留库,Mongodb的系统管理库
local: 本地预留库,存储关键⽇志
config: 配置信息库
db: 查看当前所在库
show dbs/show databases :查看所有的数据库
show collections/show tables:查看当前库下所有的集合
use admin :切换到不同的库,不存在的库也可以切换
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() 更新⽤户数据。
db.createUser( { user: "myUserAdmin", pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] } )
security: authorization: enabled
mongo --authenticationDatabase "admin" -u "myUserAdmin" -p
在哪个库创建的用户,用哪个库做登录认证库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”)
主节点 负责读写
副本节点 同步主节点
仲裁节点 不是必需的,不存储数据,不参与竞主,只投票,不消耗什么资源
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”)
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
db.oplog.rs.find({"ns" : "backup.$cmd"}).pretty()
库名backupmongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" - -oplogReplay --oplogLimit=1587375719 mongo_backup --drop
查找的时间点