MongoDB副本集搭建和oplog恢复数据
MongoDB副本集是将数据同步在多个服务器,
优点:提高了数据可用性,可以通过oplog恢复数据。
缺点:单节点存储所有数据,存储海量数据,对磁盘的容量依赖大。
0、配置
192.168.1.10 |
PRIMARY |
rs0 |
192.168.1.11 |
SECONDARY |
rs1 |
192.168.1.12 |
SECONDARY |
rs2 |
1、下载安装
cd /usr/local/src/
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz
tar zxf mongodb-linux-x86_64-rhel70-4.2.8.tgz -C /usr/local/
做软链接,保留版本号
ln -s /usr/local/mongodb-linux-x86_64-rhel70-4.2.8 /usr/local/mongodb
2、配置文件
192.168.1.10
vim /usr/local/mongodb/rs0/config/mongodb.conf # 任何IP都可以连 bind_ip=0.0.0.0 # 端口 port=27017 # 数据存放目录 dbpath=/usr/local/mongodb/rs0/data # 日志目录 logpath=/usr/local/mongodb/rs0/log/mongodb.log # 进程id目录 pidfilepath =/usr/local/mongodb/rs0/run/mongodb.pid # 日志输出方式 追加 logappend=true # 安静模式 将会尝试减少日志的输出量 quiet=true # 副本集名称 replSet=zbdata # 在后台启动 fork=true # 副本集的私钥的完整路径 keyFile=/usr/local/mongodb/keyfile # 开启用户认证 auth=true
192.168.10.11
bind_ip=0.0.0.0 port=27017 dbpath=/usr/local/mongodb/rs1/data logpath=/usr/local/mongodb/rs1/log/mongodb.log pidfilepath =/usr/local/mongodb/rs1/run/mongodb.pid logappend=true quiet=true replSet=zbdata fork=true keyFile=/usr/local/mongodb/keyfile
192.168.10.12
bind_ip=0.0.0.0 port=27017 dbpath=/usr/local/mongodb/rs1/data logpath=/usr/local/mongodb/rs1/log/mongodb.log pidfilepath =/usr/local/mongodb/rs1/run/mongodb.pid logappend=true quiet=true replSet=zbdata fork=true keyFile=/usr/local/mongodb/keyfile
3、生成认证文件keyFile
keyFile 集群之间安全认证(副本集默认没有认证)
openssl rand -base64 666 > /usr/local/mongodb/keyfile # 666文件大小
chmod 600 /usr/local/mongodb/keyfile #修改权限
将keyfile文件拷到副本集对应的目录
配置完成后启动服务
4、初始化
>config={ "_id" : "zbdata", "members" : [ { "_id" : 0, "host" : "192.168.1.10:27017" }, { "_id" : 1, "host" : "192.168.1.11:27017" }, { "_id" : 2, "host" : "192.168.1.12:27017" } ] } # 初始化配置 >rs.initiate(config) # 查看配置 >rs.conf() # 查看状态 >rs.status() #设置优先级 # 配置第三个成员优先级为3(优先级越高越优先成为主) >config=rs.conf() >config.members[3].priority = 3 >rs.reconfig(config)
5、配置权限
# 创建超级用户 *、userAdminAnyDatabase 任何数据库用户的管理权限 use admin db.createUser({ user:'admin', pwd:'123456', roles:[ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }) *、配置完登录 mongo -u admin -p 123456 --authenticationDatabase admin *、修改密码 use admin db.changeUserPassword("admin", "123456")
6、基本操作
a、查看
show dbs # 查看所有数据库
show tables # 查看所有table
show collections # 查看所有集合(表)
db # 查看当前操作的库
b、增
use test # 选择test库 db.createCollection('mycol') # 创建集合 db.mycol.insert({"name":"lifeilong", "age":18}) # 插入数据
c、删
use test db.dropDatabase() # 删除库 db.mycol.drop() # 删除表 db.mycol.remove({"name":"lifeilong", "age":18}) # 删除一条数据 db.mycol.update({},{$unset:{'crawled':''}},false, true) # 删除一列数据,crawled是要删除的列
# 删除名字和年龄重复的数据 doc.ids.shift()表示跳过第一个,从第二个开始删除重
db.mycol.aggregate([
{
$group: { _id: {name: '$name', age: '$age'},count: {$sum: 1},ids: {$addToSet: '$_id'}}
},
{
$match: {count: {$gt: 1}}
}
],{ allowDiskUse: true }).forEach(function(doc){
doc.ids.shift();
db.mycol.remove({_id: {$in: doc.ids}});
})
d、改
# 更新数据 允许修改多条 db.mycol.update({"name":"lifeilong"}, {"$set":{"age":18}}, {multi:true})
# 修改列名 将name改为alias_name
db.mycol.update({name:{$exists: true}}, {$rename : {"name" : "alias_name"}}, false, true)
e、查
db.mycol.find() # 查看所有数据 db.mycol.find().sort({update_time:-1}) # update_time逆序排序 db.mycol.find().skip(2).limit(10) # 跳过前2条,查询后面10个 db.mycol.find({'update_time':{'$regex': '2020-07-24 08'}}) # 正则匹配
db.mycol.find({'license':{'$exists':true, '$regex':/^.{0,17}$/}}) #查询字段长度小于18位
db.mycol.find({'license':{'$exists':true, '$regex':/^.{18,}$/}}) #查询字段长度大于等于18位
db.mycol.distinct('name') # 去重显示
根据字段类型查
db.mycol.find({license:{$type:1}}) #字段类型式浮点的
- double
- string
- object
- array
- binary
- undefined
- objectid
- bool
- date
- null
- regex
- dbPointer
- javascript
- symbol
- javascriptWithScope
- int
- timestamp
- long int
- decimal
f、聚合
*、查看人名重复次数大于1的数据,并按数量逆序排序 # 查询数据过大,使用磁盘缓存(allowDiskUse: true)
db.getCollection('person').aggregate( [ { $group: { _id : '$name', count: { $sum : 1 } } }, { $match: { count: { $gt : 1} } },
{ $sort: { count: -1}} ], { allowDiskUse: true } ) *、先匹配后分组,安卓多个字段分组,并且将所有certName 拼接成列表 db.getCollection('qualification').aggregate([ { "$match": {"migrated": None}, }, { "$group": { "_id": { "certId": "$certId", "name": "$name", "organDate": "$organDate", "endDate": "$endDate", "certType": "$certType", }, "certNames": {"$addToSet": "$certName"}, }, }, {'$skip': 100}, {'$limit': 100}, ], {allowDiskUse:true} )
*、联合查询
db.company.aggregate([
{
'$match': {'_id': '211'} # 过滤条件
},
{
'$lookup': { # 联合查询
'from': 'person', # 要联合的表,必须在同一个库里
'localField': 'person_id', # 本表字段,类似外键
'foreignField': 'id', # 要联合表的字段
'as': 'foreigns' # 查询结果别名
}
},
{'$unwind': '$foreigns'}, # 格式化结果
{
'$project': {
'_id': 1, # 本表字段
'name': 1,
'person_name': '$foreigns.name', # 外表字段
'age': '$foreigns.name',
}
}
])
g、分析
*、查看集合中所有字段 db.projectset_licence.mapReduce( function() { for (var key in this) { emit(key, 1); } }, function(key, values) { return Array.sum(values); }, {out: {inline: 1}} ) *、判断列表数据 db.cited_papers_new.find( {'name.0': {'$exists': true}, # name(列表) 第一个值:存在 'result.0': {'$exists': false}} # result的第一个值:不存在 ) *、分析正在执行的操作 db.currentOp() # 重点关注每个操作的执行时间 如果太长就要优化 secs_running/microsecs_running *、索引 # 查询时发现CPU超频,分析发现部分查询时间过大导致的,果断加索引(给对应的查询条件字段加) db.mycol.createIndex({name:1})
7、备份恢复
a、备份恢复
*、全量备份
mongodump -u admin -p 123456 --oplog --gzip --authenticationDatabase "admin" --out /opt/backup
*、备份一个库
mongodump -u admin -p 123456 -d userprofile -o /opt/backup
*、恢复
mongorestore -u admin -p 123456 -d userprofile --dir /opt/backup/userprofile
*、全量恢复
mongorestore -u admin -p 123456 --oplogReplay --authenticationDatabase --gzip /opt/backup/20200910
b、灾难恢复
副本集可以通过oplog恢复数据
*、导出oplog
# -d local 数据库
# -c oplog.rs 集合名
# -o backup 导出目录
./mongodump -u admin -p 123456 --authenticationDatabase admin -d local -c oplog.rs -o backup/
*、恢复数据
# --oplogLimit "1596009600:1" 同一时间的第一个
./mongorestore -u admin -p 123456 --authenticationDatabase admin --oplogReplay --oplogLimit "1596009600:1" --dir backup/local
c、导出数据
# 导出_id 大于5f48796238578e15ab9a7d07
./mongoexport -u admin -p 123456 -d database -c collection --query='{"_id" : {"$gt":{"$oid":"5f48796238578e15ab9a7d07"}}}' --sort='{"_id":-1}'
--type=csv --fields=name,age,company -o person.csv --authenticationDatabase admin