mongodb 的集群方式主要分為三種Replica Set / Sharding / Master-Slaver ,這里只說明最簡單的集群搭建方式(生產環境),如果有多個節點可以此類推或者查看官方文檔。
Replica Set
中文翻譯叫做副本集。其實簡單來說就是集群當中包含了多份數據,保證主節點掛掉了,備節點能繼續提供數據服務,提供的前提就是數據需要和主節點一致。如下圖:
Mongodb(M)表示主節點,Mongodb(S)表示備節點,Mongodb(A)表示仲裁節點。主備節點存儲數據(M,S),仲裁節點不存儲數據。客戶端同時連接主節點與備節點,不連接仲裁節點。
默認設置下,主節點提供所有增刪查改服務,備節點不提供任何服務。但是可以通過設置使備節點提供查詢服務,這樣就可以減少主節點的壓力,當客戶端進行數據查詢時,請求自動轉到備節點上。這個設置叫做Read Preference Modes,同時Java客戶端提供了簡單的配置方式,可以不必直接對數據庫進行操作。
仲裁節點是一種特殊的節點,它本身並不存儲數據,主要的作用是決定哪一個備節點在主節點掛掉之后提升為主節點,所以客戶端不需要連接此節點。這里雖然只有一個備節點,但是仍然需要一個仲裁節點來提升備節點級別。
介紹完了集群方案,那么現在就開始搭建了。
1、將三台計算機同時下載,解壓安裝文件
下載命令:apt-get install mongo
2、同時創建mongodb數據文件夾

1 mkdir -p /mongodb/data/master 2 mkdir -p /mongodb/data/slaver 3 mkdir -p /mongodb/data/arbiter 4 #三個目錄分別對應主,備,仲裁節點
3、建立配置文件(M,S,A)
(一) 主節點配置文件

1 #master.conf 2 dbpath=/mongodb/data/master 3 logpath=/mongodb/log/master.log 4 pidfilepath=/mongodb/master.pid 5 directoryperdb=true 6 logappend=true 7 replSet=testrs 8 bind_ip=10.10.148.130 9 port=27017 10 oplogSize=10000 11 fork=true 12 noprealloc=true
(二) 從節點配置文件

1 #slaver.conf 2 dbpath=/mongodb/data/slaver 3 logpath=/mongodb/log/slaver.log 4 pidfilepath=/mongodb/slaver.pid 5 directoryperdb=true 6 logappend=true 7 replSet=testrs 8 bind_ip=10.10.148.131 9 port=27017 10 oplogSize=10000 11 fork=true 12 noprealloc=true
(三) 仲裁節點配置文件

1 #arbiter.conf 2 dbpath=/mongodb/data/arbiter 3 logpath=/mongodb/log/arbiter.log 4 pidfilepath=/mongodb/arbiter.pid 5 directoryperdb=true 6 logappend=true 7 replSet=testrs 8 bind_ip=10.10.148.132 9 port=27017 10 oplogSize=10000 11 fork=true 12 noprealloc=true
*配置文件中參數解釋:
dbpath:數據存放目錄
logpath:日志存放路徑
pidfilepath:進程文件,方便停止mongodb
directoryperdb:為每一個數據庫按照數據庫名建立文件夾存放
logappend:以追加的方式記錄日志
replSet:replica set的名字
bind_ip:mongodb所綁定的ip地址
port:mongodb進程所使用的端口號,默認為27017
oplogSize:mongodb操作日志文件的最大大小。單位為Mb,默認為硬盤剩余空間的5%
fork:以后台方式運行進程
noprealloc:不預先分配存儲
4、相繼啟動mongod 或者安裝mongo服務
進入每個mongodb節點的bin目錄下(配置文件路徑有更改請自行更改下面命令)

./monood -f master.conf ./mongod -f slaver.conf ./mongod -f arbiter.conf
5、配置主,備,仲裁節點
可以通過客戶端連接mongodb,也可以直接在三個節點中選擇一個連接mongodb。

./mongo 10.10.148.130:27017 #ip和port是某個節點的地址 >use admin >cfg={ _id:"testrs", members:[ {_id:0,host:'10.10.148.130:27017',priority:2}, {_id:1,host:'10.10.148.131:27017',priority:1}, {_id:2,host:'10.10.148.132:27017',arbiterOnly:true}] }; >rs.initiate(cfg)
cfg是可以任意的名字,當然最好不要是mongodb的關鍵字,conf,config都可以。最外層的_id表示replica set的名字,members里包含的是所有節點的地址以及優先級。優先級最高的即成為主節點,即這里的10.10.148.130:27017。特別注意的是,對於仲裁節點,需要有個特別的配置——arbiterOnly:true。這個千萬不能少了,不然主備模式就不能生效。
6、測試配置是否成功
配置的生效時間根據不同的機器配置會有長有短,配置不錯的話基本上十幾秒內就能生效,有的配置需要一兩分鍾。如果生效了,執行rs.status()命令會看到如下信息:

{ "set" : "testrs", "date" : ISODate("2013-01-05T02:44:43Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "10.10.148.130:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 200, "optime" : Timestamp(1357285565000, 1), "optimeDate" : ISODate("2013-01-04T07:46:05Z"), "self" : true }, { "_id" : 1, "name" : "10.10.148.131:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 200, "optime" : Timestamp(1357285565000, 1), "optimeDate" : ISODate("2013-01-04T07:46:05Z"), "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"), "pingMs" : 0 }, { "_id" : 2, "name" : "10.10.148.132:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 200, "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"), "pingMs" : 0 } ], "ok" : 1 }
正在進行配置提示:"stateStr" : "RECOVERING"
后話:
Replica Set 是我現在主要使用的集群方式,也是我使用過最穩定和高效的無規則大數據存儲方式。這樣的配置要求運行環境需要至少三台windows/ubuntu,當然我們可以使用VM來進行虛擬化測試,在項目實施的過程中還是建議多台服務器進行配置,如果有能力當然可以上虛擬+存儲。至於大數據的數據檢索部分,千萬級別以下的使用mongodb的索引完全能解決,過億建議使用檢索平台,最近個人在研究 elasticseach 大數據檢索平台,如果有興趣的可以一起學習了解~ 以上是mongodb Replica Set 的配置過程。 小的敬上!