從零開始 MongoDB 集群(ReplSet)搭建 之二 群集搭建


從零開始 MongoDB 集群(ReplSet)搭建 之一 MongoDB的安裝
從零開始 MongoDB 集群(ReplSet)搭建 之二 群集搭建

前言

本文只是根據個人經驗介紹在搭建集群過程中遇到的坑和需要理解的內容,經過多次嘗試,總結的結論,可能這些結論也不一定是對的,但目前是好使的。如果有經驗的高手看到了,歡迎指正。

會安裝MongoDB服務之后,我們開始搭建群集。

MongoDB群集的概念

群集又叫復制集(Replication Set)。MongoDB用replSet表示,有時候也會ReplSet。一般是一個主節點Primary Node 和多個從節點 Secondary Node 組成,有時候還會有 Arbiter Node 也就是仲裁節點。集群必須有個名字,這個名字就是配置節點中的replSet配置。

Type Desc
Primary 默認負責數據的讀寫。
Secondary 默認負責同步Primary 的日志。用來更新自己的數據,保證自身的數據跟 Primary一致。后期可以設置為可讀,用以分擔Primary的讀取壓力。讀寫分離一般會設置Secondary為可讀。
Arbiter 平時啥也不干,也不存儲數據,只在Primary 宕機后,投票選出誰做主節點。(做集群的時候可以沒有)

結構如下圖(圖中沒有包含仲裁節點):

image

搭建實例

依照圖上看我們至少要3個MongoDB的實例,根據第一篇文章,我們知道如何創建MongoDB服務。依照這樣的方式創建3個:

type ip port servicename service display Name
primary 127.0.0.1 30000 mongodb_primary mongodb priamry
secondary 127.0.0.1 30001 mongodb_secondary mongodb secondary
arbiter 127.0.0.1 30002 mongodb_arbiter mongodb arbiter

我的目錄結構是這樣的:
image

Primary

配置:

#primary.conf    
dbpath=D:\MongoDBCluster\Test\shard0_primary\data
logpath=D:\MongoDBCluster\Test\shard0_primary\log\shard0_primary.log    
pidfilepath=D:\MongoDBCluster\Test\shard0_primary\shard0_primary.pid    
directoryperdb=true    
logappend=true   
replSet=replSet_demo
port=30000
bind_ip=127.0.0.1

安裝代碼:

   mongod --config D:\MongoDBCluster\Test\shard0_primary\primary.cfg --serviceName "mongodb_primary" --serviceDisplayName "mongodb priamry" --install

請注意上述配置文件中比之前多了一個 replSet=replSet_demo replSet_demo就是集群的名稱,也叫復制集的名稱。
配置文件中的目錄是創建好了的

Secondary

#secondary.conf    
dbpath=D:\MongoDBCluster\Test\shard0_secondary\data
logpath=D:\MongoDBCluster\Test\shard0_secondary\log\shard0_secondary.log    
pidfilepath=D:\MongoDBCluster\Test\shard0_secondary\shard0_secondary.pid    
directoryperdb=true    
logappend=true   
replSet=replSet_demo
port=30001
bind_ip=127.0.0.1

安裝代碼:

   mongod.exe --config D:\MongoDBCluster\Test\shard0_secondary\secondary.cfg --serviceName "mongodb_secondary" --serviceDisplayName "mongodb secondary" --install

Arbiter

#arbiter.conf    
dbpath=D:\MongoDBCluster\Test\shard0_arbiter\data
logpath=D:\MongoDBCluster\Test\shard0_arbiter\log\shard0_arbiter.log    
pidfilepath=D:\MongoDBCluster\Test\shard0_arbiter\shard0_arbiter.pid    
directoryperdb=true    
logappend=true   
replSet=replSet_demo
port=30002
bind_ip=127.0.0.1

安裝代碼:

   mongod.exe --config D:\MongoDBCluster\Test\shard0_arbiter\arbiter.cfg --serviceName "mongodb_arbiter" --serviceDisplayName "mongodb arbiter" --install

以上代碼執行下來,結果如圖:
image

image

關聯實例,設置集群

啟動所有服務,然后隨意進到一個Mongodb shell管理控制台實例中 mongo 127.0.0.1:30000 如圖:
image

關聯三台mongodb實例,配置如下:

config = {
    _id: 'replSet_demo', 
    members: [
            {_id: 0, host: '127.0.0.1:30000',priority:1},
            {_id: 1, host: '127.0.0.1:30001',priority:2},
            {_id: 2, host: '127.0.0.1:30002',"arbiterOnly":true}]
          }  

rs.initiate(config)

config._id 為 集群的名稱,也就是我們之前配置的 replSet=replSet_demo。"arbiterOnly":true 代表這個節點是仲裁節點。
在 mongodb shell管理控制台中執行上述代碼。

結果是這樣的:

image

代表創建成功,但這個有個問題,我們准備做主節點的 127.0.0.1:30000變成了secondary,只需要調整一下就可以了,原因是我們在配置的時候,把優先級些錯了。priority 是優先級,級別越高越優先。

此時,主節點為:127.0.0.1:30001,我們登錄主節點才能修改,mongo 127.0.0.1:30001執行如下代碼:

config = {
    _id: 'replSet_demo', 
    members: [
            {_id: 0, host: '127.0.0.1:30000',priority:2},
            {_id: 1, host: '127.0.0.1:30001',priority:1},
            {_id: 2, host: '127.0.0.1:30002',"arbiterOnly":true}]
          }  
    rs.reconfig(config,{force:true})

image

在查看狀態:rs.status()

image

后記

MongoDB的復制集就搭建完畢了。但為什么要搭建集群,什么樣的情況搭建適合搭建集群。這個問題留給讀者自己吧。
在搭建完畢之后如何修改,我們可以查看 rs.help() 去查看幫助命令。相對比較簡單,我就不贅述了。最后附上比較常用的方法:

方法 作用
rs.help() 查看幫助
rs.status() 查詢復制集狀態
rs.conf() 獲取復制集配置
rs.initiate() 使用null初始化復制集
rs.initiate(config) 使用配置文件初始化復制集
rs.add(hostportstr) 增加新的節點
rs.remove(hostportstr) 刪除節點
rs.addArb(hostportstr) 添加仲裁節點,一個復制集建議只需要一個仲裁節點。
rs.secondaryOk() 讓從節點可以支持查詢操作。Allows read operations on secondary members for the MongoDB connection.
db.isMaster() check who is primary
db.hello() check who is primary

至此,文章結束,希望對你有幫助,如果有不足的地方,希望能指出,共同進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM