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是要删除的列

d、改

# 更新数据 允许修改多条
db.mycol.update({"name":"lifeilong"}, {"$set":{"age":18}}, {multi: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'}}) # 正则匹配

f、聚合

*、查看人名重复次数大于1的数据 # 查询数据过大,使用磁盘缓存(allowDiskUse: true)
db.getCollection('person').aggregate(
  [
    { $group: { _id : '$name', count: { $sum : 1 } } },
  { $match: { count: { $gt : 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}
)

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

原文地址:https://www.cnblogs.com/imlifelong/p/13679455.html