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變化。