1. 程式人生 > 實用技巧 >MongoDB副本集搭建和oplog恢復資料

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 -p123456 --oplog --gzip --authenticationDatabase "admin" --out /opt/backup

  *、備份一個庫

    mongodump-u admin -p123456 -d userprofile -o /opt/backup

  *、恢復

    mongorestore -u admin -p123456 -d userprofile--dir /opt/backup/userprofile

  *、全量恢復

    mongorestore -u admin -p123456 --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