mongodb複製集操作步驟
複製集的好處:
<1> 資料備份。每一個從節點都是一個備份
<2> 資料恢復。當主節點機器死掉後,可以讓從節點成為主節點,保證程式正常執行
<3> 讀寫分離。即主節點寫、從節點讀。如果所有的讀寫操作全部放在主節點,那麼對於主節點的壓力太大,所有寫入往主節點寫,讀取時在從節點這裡讀(不要在從節點寫,在主節點讀,因為從節點會檢測主節點的更新,但是主節點不會檢測子節點更新,那麼子節點寫資料,主節點不會更新操作,那麼資料就不統一(自己猜的))
複製集操作,真是生產環境中,應該在不同機器上建立配置檔案,但是環境有限,目前在同一個機器操作
具體步驟如下:
1、在電腦的任何位置建立一個.config檔案,如27018.config
config檔案內容示例如下:
dbpath=D:\Program Files\MongoDB\data\db\27018 #資料庫路徑
logpath=D:\Program Files\MongoDB\data\db\27018\log\mongodb27018.log#日誌輸出檔案路徑
logappend=true #錯誤日誌採用追加模式,配置這個選項後mongodb的日誌會追加到現有的日誌檔案,而不是從新建立一個新檔案
journal=true #啟用日誌檔案,預設啟用
quiet=false #這個選項可以過濾掉一些無用的日誌資訊,若需要除錯使用請設定為false
port=27018 #埠號預設為27017
pidfilepath=D:\Program Files\MongoDB\data\db\27018\27018.pid
#fork=true 後臺啟動(dos中啟動例項時,不會卡在那裡,但是隻有linux系統才有效)
oplogSize=512 #
replSet=QHIT #複製集名稱,所有節點的複製集名稱必須要相同
(這裡還有一個bind_ip的屬性可以配置,目前還沒了解怎麼用)
2、在.config檔案同目錄(也可以不是同一目錄,可以隨便放在哪個磁碟都行,這裡為了方便,放在同一目錄),建立一個資料夾(如27018這個資料夾),資料夾裡建立一個.pid的檔案(如27018.pid,檔案裡面不用寫內容)和一個資料夾(資料夾名稱如:log),並在log資料夾裡建立一個.log檔案(如mongodb27018.log,檔案裡面不用寫內容)
3、把第二步操作執行幾次,比如重複操作3次,那麼相當於建立了3個複製集,但是需要注意,所有的名稱要換(比如把所有檔案、資料夾、配置檔案內容的27018換成27019)
4、使用cmd開啟dos視窗
1)cd進入mongodb安裝目錄的bin目錄
2)輸入mongod -f"D:\Program Files\MongoDB\data\db\27018.config"命令建立一個數據庫例項,(因為當前環境是在windows下操作,所以啟動例項後會卡在這裡,但是例項是正常啟動了)
3)重複執行上面1、2操作,開啟多個dos視窗開啟27019和27020的資料庫例項
4、上面啟動了三個例項,相當於啟動了三個不同的mongodb資料庫的服務,下面就要對配置的複製集進行初始化操作
1)那麼現在再重新開啟一個dos視窗,cd進入mongodb安裝目錄的bin目錄,使用mongolocalhost:27018(這裡的埠號就是剛才自己配置例項的埠號,隨便連線三個例項的哪個例項都可以)
2)在上面1步驟連線成功的dos視窗中輸入如下示例配置:
config={"_id":"QHIT","menbers":[{"_id":0,"host":"127.0.0.1:27018"},{"_id":1,"host":"127.0.0.1:27019"},{"_id":2,"host":"127.0.0.1:27020","arbiterOnly":true}]}
config相當於是一個變數
值是所有配置複製集的資訊
arbiterOnly代表當前例項是一個選舉節點,選舉節點作用是當主節點死掉後,選舉節點負責挑選一個從節點來充當主節點(選舉節點只需要配置這個屬性即可,無需其他配置,在進行配置複製集是,應該也可以不用指定選舉節點)
3)執行rs.initiate(config)進行初始化複製集
4)注意的幾個事項以及自己犯的錯誤:
l 上面config變數的值,外層的那個_id必須與config檔案中配置的replSet名稱一致,否則會出錯
l 不能去啟動mongodb之間建立的那個服務,使用dos視窗連線預設27017的這個服務例項來執行初始化複製集操作,因為以前的服務27017並沒有指定replSet名稱
5、驗證複製集同步
1)開啟三個dos視窗,分別連線三個mongodb資料庫例項
2)觀察每個連線成功後,前面的標識,不是僅僅一個”>”符號,如:
QHIT : SECONDARY>
QHIT : ARBITER>
QHIT : PRIMARY>
前面的QHIT是在config檔案中配置的replSet名稱,後面的SECONDARY代表當前連線的例項是一個從節點,ARBITER代表連線的例項是一個選舉節點,PRIMARY代表連線的例項是一個主節點
注:如果沒有找到PRIMARY的視窗,那麼exit先退出來,再重新連線試試
3)那麼我們在主節點的dos視窗上,使用use選擇一個數據庫中的表,進行insert插入操作
4)在其他從節點上也選擇剛才的那個資料庫中的那個表,查詢資料,會發現在主節點插入的資料,在從節點中也同樣存在(這就是複製集的作用,當在主節點上插入資料,會生成日誌檔案,那麼所有的從節點會不斷檢測主節點是否有資料改變,如果有就立即在從節點上進行更新同步操作)
注意,在從節點查詢時,會出錯,因為SECONDARY這種從節點是不允許讀寫的,如果非要解決,需要先在當前從節點中執行rs.slaveOk();讓從節點支援讀寫操作
5)也可以嘗試,把主節點的啟動例項視窗關閉掉,那麼再使用不同dos視窗連線不同例項,本來之前的從節點,因為主節點死掉,所以會提升成為主節點(這樣就可以放在有一個機器的硬碟問題或其他原因,導致主節點資料庫無法使用,那麼就可以讓從節點成為主節點,保證程式的正常執行)
5、連線複製集
URI 格式:
mongodb://[username:[email protected]]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
說明:
mongodb:// 字首,代表這是一個Connection String
username:[email protected] 如果啟用了鑑權,需要指定使用者密碼
hostX:portX 複製整合員的ip:port資訊,多個成員以逗號分割
/database 鑑權時,使用者帳號所屬的資料庫
?options 指定額外的連線選項
6、java程式連線複製集(沒有嘗試過)
MongoClientURI connectionString = new
MongoClientURI("mongodb://root:****@localhost:27018, localhost:27019,localhost:27020/admin?replicaSet=QHIT"); // ****替換為root密碼
MongoClient client = new MongoClient(connectionString);
MongoDatabase database = client.getDatabase("mydb");
MongoCollection collection =database.getCollection("mycoll");
7、讀寫分離(沒有嘗試過)
在options裡新增readPreference=secondaryPreferred即可實現,讀請求優先到Secondary節點,從而實現讀寫分離的功能
網上的其他說法:
第一種方法:在java程式碼中呼叫dbFactory.getDb().slaveOk();
第二種方法:在java程式碼中呼叫
dbFactory.getDb().setReadPreference(ReadPreference.secondaryPreferred());//在複製集中優先讀secondary,如果secondary訪問不了的時候就從master中讀
或
dbFactory.getDb().setReadPreference(ReadPreference.secondary());//只從secondary中讀,如果secondary訪問不了的時候就不能進行查詢
第三種方法:在配置mongo的時候增加slave-ok="true"也支援直接從secondary中讀
<mongo:mongo id="mongo"host="${mongodb.host}" port="${mongodb.port}">
<mongo:optionsslave-ok="true"/>
</mongo:mongo>
7、限制連線數(沒有嘗試過)
在options裡新增maxPoolSize=xx即可將客戶端連線池限制在xx以內