MongoDB的複製是基於操做日誌oplog,至關於MySQL中的二進制日誌,只記錄發生改變的記錄。複製是將主節點的oplog日誌同步並應用到其餘從節點的過程。linux
MongoDB的節點分爲三種類型,分別爲標準節點(host)、被動節點(passive)和仲裁節點(arbiter)mongodb
MongoDB複製集節點間選舉所示
前文連接
Yum安裝MongoDB及數據庫管理
配置MongoDB複製集數據庫
mkdir -p /data/mongodb/logs // path目錄,由於在安裝完成以後就會有一個實例,因此這裏咱們只須要建立三個實例便可 mkdir -p /data/mongodb/mongo{2,3,4} //建立dbpath目錄 touch /data/mongodb/logs/mongod{2,3,4}.log //建立日誌文件 chmod 777 /data/mongodb/logs/*.log //爲日誌文件賦予權限
path: dbPath: port: bindIp: replication: replSetName: //修改配置文件中這五個項目的值
systemctl disable firewalld.service systemctl stop firewalld.service setenforce 0
mongod -f /etc/mongod.conf
本次複製集由四個節點組成,分別包括兩個標準節點,一個被動節點,一個仲裁節點。vim
mongo //=進入數據庫 chen={"_id":"chenrs","members":[{"_id":0,"host":"172.16.10.29:27017","priority":100},{"_id":1,"host":"172.16.10.29:27018","priority":100},{"_id":2,"host":"172.16.10.29:27019","priority":0},{"_id":3,"host":"172.16.10.29:27020","arbiterOnly":true}]}
rs.initiate(chen)
rs.isMaster()
此時對數據庫進行一些增刪改查的操做,注意在oplog日誌中不會記錄查詢的語句,只會記錄對數據庫進行更改的語句安全
use stady //使用stady庫 db.abc.insert({"id":1,"name":"zhangsan"}) //向表abc中寫入一條數據 db.abc.insert({"id":2,"name":"lisi"}) //再次插入一條數據 db.abc.find() //查看錶中內容 db.abc.update({"id":2},{$set:{"name":"jack"}}) //修改表數據 db.abc.remove({"id":1} //刪除表數據
use local show collections //能夠看到其中有一個oplog.rs文件 db.oplog.rs.find() //因爲內容過多,在這裏就不展現,查看以後就會發現,沒有記錄查詢的記錄,只有記錄對數據庫作更改的操做
kill -9 + 進程號 //關閉主節點 mongod -f /etc/mongod4.conf --shutdown //關閉主節點 mongo --port 27018 chenrs:PRIMARY> rs.status() //此時該節點已經成爲主節點 { "set" : "chenrs", "date" : ISODate("2018-07-16T05:30:04.152Z"), "myState" : 1, ···省略部份內容 "members" : [ "_id" : 0, "name" : "172.16.10.29:27017", "health" : 0, //健康值爲0,處於非活躍狀態 "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部份內容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", //此時1爲主節點 ···省略部份內容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ···省略部份內容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ···省略部份內容 ]
mongod -f /etc/mongod2.conf --shutdown mongo --port 27019 chenrs:SECONDARY> rs.status() //仍處於secondary狀態 { "set" : "chenrs", "date" : ISODate("2018-07-16T05:40:09.740Z"), "members" : [ { "_id" : 0, "name" : "172.16.10.29:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部份內容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部份內容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //即便兩個標準節點都處於宕機狀態,被動節點和仲裁節點也沒有成爲主節點 ···省略部份內容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ] ···省略部份內容
默認MongoDB複製集的從節點是不能讀取數據的,可是可使用密令來容許可以在從節點讀取數據app
rs.slaveOk() //容許從節點可以讀取數據
rs.help rs.printReplicationInfo() //查看oplog日誌文件的大小及時間範圍 rs.printSlaveReplicationInfo() //查詢節點及節點複製的時間
若是節點屬於複製集成員,此時你想要修改oplog的大小是不被容許的,因此要將節點移出複製集想要修改日誌文件的默認大小。此時要作的是首先要關閉節點的服務,而後退出複製集ide
use admin //在複製集的從節點上作 db.shutdownServer() //關閉服務,此時再想登錄該節點則會失敗
註銷掉replication的值和修改port值,將其做爲單實例啓動3d
vim /etc/mongod2.conf #replication: # replSetName: chenrs port: 27028 mongod -f /etc/mongod2.conf //啓動實例,此時該實例不屬於複製集
mongodump --port 27028 --db local --collection 'oplog.rs' //在linux界面操做
> use local > db.oplog.rs.drop()
db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
use admin db.shutdownServer()
回調參數,同時要加一個參數指定日誌文件大小日誌
vim /etc/mongod2.conf replication: replSetName: chenrs oplogSizeMB: 2048 //單位爲兆 mongod -f /etc/mongod2.conf //啓動實例 mongo -port 27018 //進入實例
rs.printReplicationInfo()
對於日誌文件大小的更改,只對該節點生效,其餘節點仍然是默認值code
use admin db.createUser({"user":"root","pwd":"123123","roles":["root"]})
爲了使其餘的節點還可以和主節點進行同步,建立密鑰文件使其餘節點可以同步
# cd /usr/bin/ # echo "chenrs key"> chenrskey1 # echo "chenrs key"> chenrskey2 # echo "chenrs key"> chenrskey3 # echo "chenrs key"> chenrskey4 //密鑰內容自定義,可是要保證內容的一致性 # chmod 600 chenrskey{1..4} //設置文件權限,不設置在接下來的啓動中會報錯
vim /etc/mongod.conf security: keyFile: /usr/bin/chenrskey1 //每一個節點的驗證文件不一樣,要根據不一樣的節點修改 clusterAuthMode: keyFile //認證類型,密鑰文件認證
mongod -f /etc/mongod.conf --shutdown mongod -f /etc/mongod.conf /其餘幾臺的重啓方式都相同,重複操做便可
當你直接使用登錄命令登錄系統時,使用show dbs 是不可以查看數據的,此時就須要使用身份驗證
mongo --port 27018 use admin db.auth("root","123123")