MongoDB的官方文檔相當不錯,而且還有中文手冊,雖然有些還沒有被翻譯完整:)建議大家多閱讀線上手冊,省掉一些網上資訊不準確產生的痛苦,呵呵
一,安裝:
在各種作業系統上的安裝非常簡單,從網上下載相應作業系統上的MongoDB的Binaries然後直接就可以運行,這裡不會浪費筆墨,請參考官方中文安裝文檔http://cn.docs.mongodb.org/manual/tutorial/install-mongodb-on-linux/。
FQA:
1.注意各作業系統的OS Architecture也就是是多少位的作業系統。要下載對應的MongoDB程式運行檔案。Widows上可以用 wmic os get osarchitecture命令查看
二,複製集(Replica Sest):
a.安裝配置:
建立測試環境下的三個MongoDB的存貯資料的目錄:
mkdir -p /var/database/mongodb/rs0-0 /var/database/mongodb/rs0-1 /var/database/mongodb/rs0-2
起動三個資料庫服務Instances(約定為一個複製集合)
mongod --port 27017 --dbpath /var/database/mongodb/rs0-0 --replSet rs0
mongod --port 27018 --dbpath /var/databasemongodb/rs0-1 --replSet rs0
mongod --port 27019 --dbpath /var/database/mongodb/rs0-2 --replSet rs0
用Mongodb的管理用戶端,並聯結到在27017連接埠的Mongodb服務,啟動後進行複製集操作:
mongo --port 27017
>rsconf = {
_id: "rs0",
members: [
{
_id: 0,
host: "<hostname>:27017"
}
]
}
>rs.initiate( rsconf )
>rs.add("<hostname>:27018")
>rs.add("<hostname>:27019")
當然也可以直接用configuration方式建立:
>config={_id: 'setA', members:[{_id: 0,host:'127.0.0.1:10000'},{_id:1,host:'127.0.0.1:10001'},{_id:2,host:' 127.0.0.1:10002'}]}
>rs.initiate( rsconf )
配置完成後,驗證查看一下當前複製集的狀態:
>rs.status()
如果你在代碼中使用,在建立MongoDB的對象時,把這三個MongoDB全部做為執行個體化參數即可,MongoDB的driver會自動判斷哪個為Primiary 節點,哪幾個為Slave 節點,Driver預設情況下,會讓connection讀寫同一個節點(一般為Primary),同時也可以設定這個複製集的讀寫分離,或者設定複製集的讀寫嚴格一致性:)。這裡提供Java的代碼例子:
MongoClient mongoClient = new MongoClient(Arrays.asList(
new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
或者:
Mongo mongo = new Mongo(Arrays.asList(
new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
建議大家使用第一種MongoClient類,因為Mongo類將來會被MongoClient所替代。
b.FAQ:
複製集合中的節點選舉策略
複製集中的集點屬性。
對讀寫分離(Tag定向/非定向),寫關注(Write concern)即讀寫一致性
c.工作機制:
MongoDB的用戶端識別這個叢集的主節點(Primary Node)然後進行讀寫到主節點上,如果想分離讀寫,可以進行設定,進行讀寫分離,但寫一直是寫到PrimaryNode上,在寫到的主節點同時,其它Slave節點通過oplog複製主節點資料,當然,也可以設定Chained Replica 模式,一個slave從主節點複節資料,另一個slave節點從這個slave節點再複製資料,一般建議一個replica set上不少於3台節點,因為如果一台失敗,另一台就要作為恢複的資料來源,影響正常資料訪問,所以至少有三台。
三,分區(Sharding)
a.安裝配置:
1.首先建立複製集,但每一台資料庫要以sharding srever 方式啟動。如下:
$mongod --shardsvr --port 27017 --dbpath /srv/mongodb/rs0-0 --replSet rs0
$mongod --shardsvr --port 27018 --dbpath /srv/mongodb/rs0-1 --replSet rs0
$mongod --shardsvr --port 27019 --dbpath /srv/mongodb/rs0-2 --replSet rs0
$mongo --port 27017
>rsconf = { _id: "rs0", members: [ {_id: 0, host: "<hostname>:27017" } ] }
>rs.initiate( rsconf )
>rs.add("<hostname>:27018") >rs.add("<hostname>:27019")
2.再建立同個類似的複製集
$mongod --shardsvr --port 37017 --dbpath /srv/mongodb/rs1-0 --replSet rs1 $mongod --shardsvr --port 37018 --dbpath /srv/mongodb/rs1-1 --replSet rs1 $mongod --shardsvr --port 37019 --dbpath /srv/mongodb/rs1-2 --replSet rs1
$mongo --port 27017
>rsconf = { _id: "rs1", members: [ {_id: 0, host: "<hostname>:37017" } ] }
>rs.initiate( rsconf )
>rs.add("<hostname>:37018") >rs.add("<hostname>:37019")
3.啟動三個佈建服務節點Configsvr
從命令列分別執行如下命令,配置三個Configsvr
mongod.exe --configsvr --dbpath d:/data/configsvr/r0 --port 40000 --shardsvr
mongod.exe --configsvr --dbpath d:/data/configsvr/r0 --port 40001 --shardsvr
mongod.exe --configsvr --dbpath d:/data/configsvr/r0 --port 40002 --shardsvr
4.啟動兩個路由節點mongos
mongos.exe --configdb 127.0.0.1:40000,127.0.0.1:40001,127.0.0.1:40002 --port 50000
mongos.exe --configdb 127.0.0.1:40000,127.0.0.1:40001,127.0.0.1:40002 --port 60000
5.配置分區
call mongo.exe 127.0.0.1:50000
MongoDB shell version: 1.8.0
connecting to: 127.0.0.1:50000
> use admin
switched to db admin
> db.runCommand({addshard:"rs0/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019",name:"ShardSetA"})
{ "shardAdded" : "ShardSetA", "ok" : 1 }
> db.runCommand({addshard:"rs1/127.0.0.1:37017,127.0.0.1:37018,127.0.0.1:37019",name:"ShardSetB"})
{ "shardAdded" : "ShardSetB", "ok" : 1 }
叢集到此已配置完成。
你可以通過用戶端使用這個叢集了這裡只列出Java用戶端代碼:
MongoClient mongoClient = new MongoClient(Arrays.asList(
new ServerAddress("localhost", 50000),
new ServerAddress("localhost", 60000)));
這裡你會發現用的是兩個mongos路由伺服器的連接埠
在用這個叢集之前,你要對你打算Sharding的資料庫進行enable一下。
用用戶端串連Mongos
Mongo --port 50000
>sh.enableSharding("database name")
或者
>db.runCommand( { enableSharding: <database> } )
這樣即可。
如果你想對一個大的collection進行sharding可以執行如下命令
sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )
一切OK可以使用了,不過我拷貝的倉促,有的地方如果有漏copy的地方,大家不要罵我,可以線上問我,也可以加我QQ一齊探討。
b.FAQ:
c.工作機制:
工作機制,用戶端代碼,通過mongodb的driver串連mongos(一個connection(一般是源於driver提供的一個串連池)選一個mongos服務)mongos只是一個路由伺服器,相當於訪問代理
當一個操作到達mongos時,mongos會根據config server上的資訊,把操作轉寄給對應的mongod伺服器,為了提高效率,mongos配置完成後,mongo configservers上的資訊已緩衝在mongs
伺服器上,所以你此時關掉mongo config server也暫時影響不大,除非叢集進行了balance 操作,或者有新的trunck變化。