zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    快速排序(详解)
    14.linux-platform机制实现驱动层分离(详解)
    13.Linux键盘按键驱动 (详解)
    Linux-hexdump命令调试event驱动—详解(13)
    Android开发final的用法
    Android控件RecyclerView的基本用法
    搜索关键词分析——以个人博客网站为例
    java.net.SocketException: Software caused connection abort: socket write error
    Android layout属性大全
    java中 label 配合 break continue 使用方法
  • 原文地址:https://www.cnblogs.com/imlifelong/p/13679455.html
Copyright © 2011-2022 走看看