1. 程式人生 > >mongodb複製集操作步驟

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以內