mongodb日常运维

mongodb日常运维

mongodb导数
 mongodump --host $IP:$PORT -u xxx -p xxx --numParallelCollections=8 --authenticationDatabase=admin --gzip --oplog -o $MONGO_DATA

 
1. directory
如果指定参数directoryperdb =yes,则会每个db一个目录。其中包含该db的所有数据文件
directoryPerDB: true

> show databases;
admin     0.000GB
local     0.009GB
test    0.000GB
> exit
bye
$ls
admin    test     local      mongod.lock sizeStorer.wt  WiredTiger.basecfg WiredTiger.lock  

mongodb 
文档 document/
集合 collection/
数据库 database

2.mongdb自带监控工具
>> mongostat --host 主机名:端口号 --username=xxx --password=xxxx --authenticationDatabase=admin
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn   set repl        time
  *0   3   *0   *0    0   3|0 0.0% 80.0%    0 262G 201G 0|0 0|0 3.12k  51.2k 125 test222 PRI Dec 26 19:50:53.200
  *0  34   *0   *0    0   3|0 0.0% 80.0%    0 262G 201G 0|0 1|0 28.5k  58.1k 125 test222 PRI Dec 26 19:50:54.200
  *0   8   *0   *0    0   1|0 0.0% 80.0%    0 262G 201G 0|0 0|0 7.30k  54.1k 125 test222 PRI Dec 26 19:50:55.202
  *0  16   *0   *0    2   7|0 0.0% 80.0%    0 262G 201G 0|0 0|0 15.1k  57.9k 125 test222 PRI Dec 26 19:50:56.199
  *0  26   *0   *0    0   1|0 0.0% 80.0%    0 262G 201G 0|0 0|0 19.8k  54.6k 125 test222 PRI Dec 26 19:50:57.199
  *0  30   *0   *0    0   2|0 0.0% 80.0%    1 262G 201G 0|0 0|0 24.4k  57.4k 125 test222 PRI Dec 26 19:50:58.199


$ mongotop --host 主机名:端口号 -u=xxx -p=xxx --authenticationDatabase=admin
2017-12-26T19:53:12.912+0800  connected to: 主机名:端口号

                  ns  total  read  write  2017-12-26T19:53:13+08:00            
            local.oplog.rs   1ms   1ms   0ms               
         admin.system.profile   0ms   0ms   0ms               
          admin.system.roles   0ms   0ms   0ms               
          admin.system.users   0ms   0ms   0ms               
         admin.system.version   0ms   0ms   0ms               

 


3.mongdb投票
Hidden:不会被选举为primary,对于client application是不可见的,具有投票权
Priority:成为primary的优先值,priority越高,成为primary的可能性越高。数值范围:0—100,=0表示不可能成为primary,也不会触发election
Voting:投票的权值,=0表示该节点没有投票的权利
Arbiter:仲裁节点,具有投票权,没有复制数据

4.读写模式
primary:主节点,默认读操作只在主节点,如果主节点不可用,报错或者抛出异常。
primaryPreferred:首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点
secondary:从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常
secondaryPreferred:首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点
nearest:最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。
     --邻近的判断标准为client对各台匹配要求的主机进行ping,最快响应的则最近

5.复制 oplog 
>  show dbs
admin    0.000GB
gcrm   1445.183GB
local   25.243GB
test   0.000GB
> use local
switched to db local
> show collections;
me
oplog.rs
replset.election
replset.minvalid
startup_log
system.profile
system.replset

> db.oplog.rs.find()
{ "ts" : Timestamp(1513290869, 119), "t" : NumberLong(0), "h" : NumberLong("-164732681870941527"), "v" : 2, "op" : "d", "ns" : "xxxx", "fromMigrate" : true, "o" : { "_id" : ObjectId("xxxx") } }
ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。这个值很重要,在选举(如老primary宕机时)新primary时,会选择ts最大的那个secondary作为新primary。
op:1字节的操作类型,例如i表示insert,d表示delete。
ns:操作所在的namespace。
o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
o2: 在执行更新操作时的条件,仅限于update时才有该属性。
其中op,可以是如下几种情形之一:
“i”: insert
“u”: update
“d”: delete
“c”: db cmd



6.查看oplog状态
> db.printReplicationInfo()
configured oplog size:  200000MB
log length start to end: 1001366secs (278.16hrs)
oplog first event time: Fri Dec 15 2017 06:34:29 GMT+0800 (CST)
oplog last event time:  Tue Dec 26 2017 20:43:55 GMT+0800 (CST)
now:           Tue Dec 26 2017 20:44:03 GMT+0800 (CST)

说明:oplog 使用size约为200000MB。第一个操作发生时间为Fri Dec 15 2017 06:34:29 ;最后一个操作发生时间为Tue Dec 26 2017 20:43:55 。存储了1001366秒的数据(1077.06hrs)


> db.oplog.rs.stats()

7.查看主从延迟
>  db.printSlaveReplicationInfo()
source: 10.33.57.174:24000
    syncedTo: Tue Dec 26 2017 20:53:05 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary 

8.查看分片状态
mongos> db.mongos.find()db.mongos.find()

mongos> db.stats()db.stats()

--mongodb分区
mongos> db.databases.find()db.databases.find()


9.分片
--mongodbs缩减集群容量
1) 确认是否为database的primary shard,是,则需移除
use admin;
db.runCommand({movePrimary:"xx",to:"xxx"})
2) 设置balancer为true
use admin;
sh.setBalancerState(true)
3) 移除分片
use admin;
db.runCommand({removeShard:"s3"})

--DATABASE设置分片
设置:
use admin;
sh.enableSharding(“zydb”);
检查:
use config;
db.databases.find( { "partitioned": true } )
或
use zydb;
db.stats()

10. mongoDB数据块均衡
检查balancer设置:sh.getBalancerState()
激活balancer:sh.setBalancerState(true)
禁止balancer:sh.setBalancerState(false)

检查当前balancer是否正在均衡:
use config;
db.locks.find( { _id : "balancer" } ).pretty()
    State:2—正在进行均衡;

11.WT内存
db.serverStatus():serverStatus 命令,或外壳程序中的 db.serverStatus() 返回数据库状态的总览,具体包括磁盘使用状况、 内存使用状况、 连接、 日志和可用的索引。此命令迅速返回,并不会影响 MongoDB 性能
db.Stats():Stats 命令,或外壳程序中的 db.stats() 返回一份针对存储使用情况和数据卷的文档。 dbStats 显示了存储的使用量、包含在数据库中的数据的总量以及对象、集合和索引计数器。
db.getLastError():getLastError 命令,查看最近的错误。

mongoDB内存使用情况
db.serverStatus().men

mongostat --port <xxx> -u<xxx> <password>
若操作不在内存中进行,fault不是0

12.mongodb日常操作
db.addUser('test','test',true) 添加用户,readonly--false/true
db.addUser('test','test222') 改密码
db.system.remove({user:"test"})或者db.removeUser("test") 删除用户
use admin 超级用户
db.auth('test','test') 用户授权
db.system.user.find()  查看用户列表
show users       查看所有用户
db.prntCollectionStats() 查看各集合状态
db.printReplicationInfo() 查看主从状态
show dbs
db   查看当前database
show collections 查看当前db下的collections

13.日常命令
table/collection
column/fields


db.dropDatabase() 删除数据库
db.user.insert({user_id: "abc123", age: 55, status: "A"}) 隐士创建collection

alter table users add join_date datetime;
db.users.update({ }, {$set: {join_date: new Date()}, {multi: true}})

alter table users drop column join_date;
db.user.update({ }, {$unset: {join_date: ""}}, {multi: true})

create index id_user_id_asc on users(user_id);
db.user.ensureIndex({user_id: 1})

create index id_user_id_asc_age_desc on user(user_id,age DESC);
db.user.ensureIndex({user_id: 1, age: -1})

drop table users;
db.users.drop()

insert into users(user_id, age, status) values ("bcd001", 45,"A")
db.user.insert({user_id: "bcd001", age: 45, status: "A"})

select * from users;
db.user.find()

select id, user_id, status from users;
db.users.find({ }, {user_id: 1, status: 1})

select user_id,status from users 
db.user.find({ }, {user_id: 1, status: 1, _id: 0})

select * from users where status = "A";
db.user.find({status: "A"})

select user_id,status from users where status = "A";
db.users.find({status: "A"}, {user_id: 1,status: 1, _id: 0})

select * from users where status != "A";
db.users.find({status: {$ne: "A"}})

select * from users where status = "A" and age = 50;
db.users.find({status: "A", age: 50})

select * from users where status = "A" or age = 50;
db.users.find({$or: [{status: "A"}, {age: 50}]})

select * from users where age > 25; 
db.users.find({age: {$gt: 25}})

select * from users where age < 25;
db.users.find({age: {$lt: 25}})

select * from users where age > 25 and age <=50;
db.users.find({age: {$gt: 25, $lte: 50}})

select * from users where user_id like "%bc%";
db.users.find({user_id: /bc/})

select * from user where user_id like "bc%";
db.users.find({user_id: /^bc/}) 

select * from users where status = "A" order by user_id asc;
db.users.find({status: "A"}).sort({user_id: 1})

select * from users where status="A" order by user_id desc;
db.users.find({status:"A"}).sort({user_id: -1})

select count(*) from users;
db.users.count() 或者db.users.find.count()

select count(user_id) from users;
db.users.count({user_id: {$exist: true}})或者db.users.find({user_id: {$exists: true}}).count()

select count(*) from users where age > 30;
db.users.count({age: {$gt:30}})或者db.user.find({age: {$gt: 30}}).count()

select distinct(status) from users;
db.users.distinct("status")

select * from users limit 1;
db.users.findOne()或者 db.users.find().limit(1)

select * from users limit 5 skip 10;
db.users.find().limit(5).skip(10)

explain select * from users where status = "A";
db.users.find({status: "A"}).explain()

update users set status = "C" where age > 25;
db.users.update({age: {$gt: 25}}, {$set: {status:"C"}}, {multi: true})

update users set age = age + 3 where status = "A";
db.users.update({status: "A"}, {$inc: {age: 3}}, {multi:true})

delete from users where status = "D";
db.users.remove({status: "D"})

delete from users;
db.users.remove()

truncate table users;
db.users.remove()

13.当前操作
db. currentOp():查看当前数据库上的操作语句信息,包括insert/query/update/remove/getmore/command等多种操作。
重要参数说明:
opid:操作进程号
op:操作类型(query,update...)
ns:命名空间(namespace),即操作对象
query:显示操作的具体内容
lockType:锁类型,表明是写锁or读锁

db. killOp(opid):kill当前数据上的操作,以opid为标识

14.慢查询
db.getProfilingStatus():查看当前profiling status

-----慢查询日志的常用属性说明
>db.system.profile.find()
 
重要参数说明:
op:操作类型,有insert、query、update、remove、getmore、command
ns : 操作的集合
ts :命令在何时执行
info :命令的详细信息
reslen: 返回结果集的大小
nscanned:本次查询扫描的记录数
nreturned: 本次查询实际返回的结果集
mills:该命令的执行耗时(单位:毫秒)
query : 查询语句 
ntoreturn : 返回的记录数
ntoskip :skip()方法指定的跳跃数 
nscanned : 扫描数量 
keyUpdates : 索引更新的数量,改变一个索引键带有一个小的性能开销,因为数据库必须删除旧的key,并插入一个新的key到B-树索引
lockStats :锁信息,R:全局读锁;W:全局写锁;r:特定数据库的读锁;w:特定数据库的写锁 
timeLockedMicros : 锁 
timeAcquiringMicros :锁等待 
responseLength: 结果字节长度 
millis: 消耗的时间(毫秒) 
ts : 语句执行的时间 
client :链接ip或则主机
allUsers ,user:用户
scanAndOrder:是一个布尔值,是True当一个查询不能使用的文件的顺序在索引中的排序返回结果:MongoDB中必须将其接收到的文件从一个游标后的文件进行排序。如果scanAndOrder是False,MongoDB的可使用这些文件的顺序索引返回排序的结果。
moved:更新操作在磁盘上移动一个或多个文件到新的位置。表明本次update是否移动了硬盘上的数据,如果新记录比原记录短,通常不会移动当前记录,如果新记录比原记录长,那么可能会移动记录到其它位置,这时候会导致相关索引的更新.磁盘操作更多,加上索引更新,会使得这样的操作比较慢.
nupdated:更新文档的数目
getmore:这是一个getmore 操作,getmore通常发生在结果集比较大的查询时,第一个query返回了部分结果,后续的结果是通过getmore来获取的。
如果nscanned(扫描的记录数)远大于nreturned(返回结果的记录数)的话,要考虑通过加索引来优化记录定位了。
responseLength 如果过大,说明返回的结果集太大了,这时要看是否只需要必要的字段。

----常用查询
---返回最近的10条记录 
db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()
---返回所有的操作,除command类型 
db.system.profile.find( { op: { $ne : 'command' } } ).pretty() 
--返回特定集合 
db.system.profile.find( { ns : 'mydb.test' } ).pretty() 
---返回大于500毫秒的慢操作 
db.system.profile.find( { millis : { $gt : 500 } } ).pretty() 
---返回特定的时间范围内的慢查询信息 
db.system.profile.find( { ts : { $gt : new ISODate("2015-06-09T03:00:00Z") , $lt : new ISODate("2015-06-09T03:40:00Z") } } ).pretty() 
--返回特定时间,特定用户,按照消耗时间排序 
db.system.profile.find( { ts : { $gt : new ISODate("2015-06-09T03:00:00Z") , $lt : new ISODate("2015-06-09T03:40:00Z") } }, { user : “ucms@ucms” } ).sort( { millis : -1 } )