一、關于mongodb
MongoDB是一個基于分布式檔案存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充的高性能資料存儲解決方案。 MongoDB是一個介于關系資料庫和非關系資料庫之間的産品,是非關系資料庫當***能最豐富,最像關系資料庫的。他支援的資料結構非常松散,是類似json的bjson格式,是以可以存儲比較複雜的資料類型。Mongo最大的特點是他支援的查詢語言非常強大,其文法有點類似于面向對象的查詢語言,幾乎可以實作類似關系資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。
二、mongodb分布式應用原理
MongoDB叢集包括一定數量的mongod(分片存儲資料)、mongos(路由處理)、config server(配置節點)、clients(用戶端)、arbiter(仲裁節點:為了選舉某個分片存儲資料節點那台為主節點)。
1、shards:一個shard為一組mongod,通常一組為兩台,主從或互為主從,這一組mongod中的資料時相同的,具體可見《mongodb分布式之資料複制》。資料分割按有序分割方式,每個分片上的資料為某一範圍的資料塊,故可支援指定分片的範圍查詢,這同google的BigTable 類似。資料塊有指定的最大容量,一旦某個資料塊的容量增長到最大容量時,這個資料塊會切分成為兩塊;當分片的資料過多時,資料塊将被遷移到系統的其他分片中。另外,新的分片加入時,資料塊也會遷移。
2、mongos:可以有多個,相當于一個控制中心,負責路由和協調操作,使得叢集像一個整體的系統。mongos可以運作在任何一台伺服器上,有些選擇放在shards伺服器上,也有放在client 伺服器上的。mongos啟動時需要從config servers上擷取基本資訊,然後接受client端的請求,路由到shards伺服器上,然後整理傳回的結果發回給client伺服器。
3、config server:存儲叢集的資訊,包括分片和塊資料資訊。主要存儲塊資料資訊,每個config server上都有一份所有塊資料資訊的拷貝,以保證每台config server上的資料的一緻性。
4、shard key:為了分割資料集,需要制定分片key的格式,類似于用于索引的key格式,通常由一個或多個字段組成以分發資料,比如:
{ name : 1 }
{ _id : 1 }
{ lastname : 1, firstname : 1 }
{ tag : 1, timestamp : -1 }
mongoDB的分片為有序存儲(1為升序,-1為降序),shard key相鄰的資料通常會存在同一台服務
(資料塊)上。
三、mongodb分布式部署方式
伺服器部署可以有多種方式。首先,每台config server、mongos、mongod都可以是單獨的伺服器,但這樣會導緻某些伺服器的浪費,比如config server。下圖為實體機共享的叢集部署,不需要額外加機器。
當然也有其他的方案,比如把mongos部署在所有的mongod(server1-6)上,又或者在每個運用伺服器(server7)上部署mongos。這樣部署有個好處在于,appserver和mongos之間的通信建立在localhost interface上,減少了通信成本。當然,此乃官方說法,但本人有想法,盡管減少了appserver和mongos之間的通信成本,但mongos與mongod之間的通信成本卻增加了,而且把mongos部署在appserver上并不是很利于sa管理,mongoDB應該是一個相對獨立的系統,與應用的耦合度應該盡量降到最低,萬一應用想要換資料庫,也能多少減少些工作量。
四、mongodb分布式的安裝
1、下載下傳
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz
2、安裝
tar zxvf mongodb-linux-2.0.4.tgz
cp -fr mongodb-linux-*2.0.4/* /data/mongodb/
mkdir -p /data/mongodb/data/ #建立資料存儲目錄
mkdir -p /data/mongodb/log/ #建立日志存儲目錄
mkdir -p /data/mongodb/config/ #建立配置存儲目錄
mkdir -p /data/mongodb/arbiter/ #建立仲裁節點存儲目錄
3、單機模式以及個參數說明
mongod --fork --bind_ip 127.0.0.1 --port 11811 --dbpath /data0/mongodb/data --directoryperdb --logpath /data0/mongodb/log/db1.log --logappend --nohttpinterface
netstat -ntlp|grep mongod
簡單的參數說明:
–logpath 日志檔案路徑
–master 指定為主機器
–slave 指定為從機器
–source 指定主機器的IP位址
–pologSize 指定日志檔案大小不超過64M.因為resync是非常操作量大且耗時,最好通過設定一個足夠大的oplogSize來避免resync(預設的 oplog大小是空閑磁盤大小的5%)。
–logappend 日志檔案末尾添加
–port 啟用端口号
–fork 在背景運作
–only 指定隻複制哪一個資料庫
–slavedelay 指從複制檢測的時間間隔
–auth 是否需要驗證權限登入(使用者名和密碼)
–noauth 不需要驗證權限登入(使用者名和密碼)
五、叢集模式mongos,mongod,configsvr
1.Shard分片--
第一組分片
192.168.200.226:
/data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface
#啟動rep1分片的一個資料節點
/data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log #啟動路由節點,讀取201.226上的配置節點的配置檔案,(在配置節點啟動後啟動)
/data/mongodb/bin/mongod --replSet rep1 --fork --port 11814 --dbpath /data/mongodb/arbiter --directoryperdb --logpath /data/mongodb/log/arbiter.log --logappend --nohttpinterface
#啟動分片的仲裁節點
192.168.201.226:
/data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface
#啟動rep1分片的第二個資料節點
/data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log
#啟動第二個路由節點 (在配置節點啟動後啟動)
2.ConfigServer---
#啟動config server
192.168.201.226:
/data/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/config --port 11812 --fork --logpath /data/mongodb/log/mc.log
#啟動配置節點,注意配置節點應該優先啟動,不然路由節點讀取不到配置節點資訊則會啟動失敗。
3.Mongos路由---
#啟動mongos,指定config server, chunkSize 256M
192.168.201.226:
/data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log
#啟動路由節點
由于機器有限,隻配置了一個shard分片,該分片裡有2個節點,新增加分片隻需對應改replSet 名稱即可。
4.配置replSet: 連接配接任一mongod members
mongo 192.168.201.226:11813
config = {_id: 'rep1', members: [
{_id: 0, host: '192.168.200.226:11813', priority: 2}, #priority 為定義優先級,預設為1,高優先級會被認為是主節點優先啟用。
{_id: 1, host: '192.168.201.226:11813'},
{_id: 2, host: '192.168.200.226:11814', arbiterOnly: true}]
}
rs.initiate(config);
rs.status()
5.連接配接mongos增加shard 80G
mongo 192.168.201.226:11811/admin
show dbs
use admin
db.runCommand({addshard:'rep1/192.168.201.226:11813,192.168.200.226:11813',maxsize:81920})
db.runCommand({listshards:1})
6.連接配接mongos增加建立test庫和c1集合,并測試
mongo 192.168.201.226:11811/admin
db.runCommand({enablesharding:'test'})
printShardingStatus()
db.runCommand({shardcollection:'test.auto_increment_id', key:{_id:1}, unique : true})
db.runCommand({shardcollection:'test.c1', key:{_id:1}, unique : true})
for (var i = 1; i <= 100; i++)db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"})
db.c1.stats()
db.createCollection("cap_coll", {capped:true, size:100000, max:100});
db.mycoll.validate();
7.檢查:
db.printCollectionStats()
8.管理:
mongo 127.0.0.1:11811
show dbs
use admin
show collections
db.serverStatus()
db.shutdownServer()
exit
9.索引:
db.product_data.ensureIndex({data_id: 1}, {unique: true,dropDups: true}); #建立索引
db.product_data.dropIndexes(); #删除索引