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