天天看點

mongodb分布式叢集架構

一、關于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();  #删除索引

繼續閱讀