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}}) #字段类型式浮点的
  1. double
  2. string
  3. object
  4. array
  5. binary
  6. undefined
  7. objectid
  8. bool
  9. date
  10. null
  11. regex
  12. dbPointer
  13. javascript
  14. symbol
  15. javascriptWithScope
  16. int
  17. timestamp
  18. long int
  19. 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

 

posted @ 2020-09-21 17:15  ImLiFeLong  阅读(384)  评论(0编辑  收藏  举报