- 論壇徽章:
- 0
|
MongoDB 集群
本文是一篇轉(zhuǎn)載文章,作者對MongoDB集群結(jié)構(gòu),集群中各個(gè)角色的功能和基本原理做了詳細(xì)地圖文并茂地講解,值得一看。
原文鏈接:http://www.javabloger.com/article/mongodb-cluster.html
MongoDB 集群中包含一個(gè)自動(dòng)分片模塊 (“mongos”). 自動(dòng)分片可以用于構(gòu)建一個(gè)大規(guī)模的可擴(kuò)展的數(shù)據(jù)庫集群,這個(gè)集群可以并入動(dòng)態(tài)增加的機(jī)器。自動(dòng)建立一個(gè)水平擴(kuò)展的數(shù)據(jù)庫集群系統(tǒng),將數(shù)據(jù)庫分表存儲在sharding的各個(gè)節(jié)點(diǎn)上。在一個(gè)mongodb的集群中包括一些shards(mongod進(jìn)程),mongos的路由進(jìn)程,一個(gè)或多個(gè)config服務(wù)器。sharding是一種對大規(guī)模數(shù)據(jù)存儲的一種策略,關(guān)于sharding的詳細(xì)信息可以查看這里。也許有人會問,為什么需要做這種策略,因?yàn)樵谝粋(gè)大型系統(tǒng)中最后的瓶頸會落在網(wǎng)絡(luò)的帶寬和磁盤的讀寫上,如果將數(shù)據(jù)分布在多個(gè)機(jī)器上的多個(gè)磁盤上,將會系統(tǒng)數(shù)據(jù)的處理能有所提高。
MongoDB 集群的結(jié)構(gòu):
下圖中Shard是指每個(gè)節(jié)點(diǎn)的shard有一個(gè)或更多的服務(wù)器和存儲數(shù)據(jù)的mongod進(jìn)程,而mongod是MongoDB數(shù)據(jù)的核心進(jìn)程。
每臺機(jī)器上的mongod從配置獲取服務(wù)器(元數(shù)據(jù)metadata ),然后,當(dāng)收到客戶端請求時(shí),它請求路由到相應(yīng)的服務(wù)器組和編譯結(jié)果發(fā)送回客戶端。
mongos進(jìn)行可以被看作是一個(gè)路由和協(xié)調(diào)的過程,因?yàn)樗梢允沟妹總(gè)單一的各個(gè)節(jié)點(diǎn)組成一個(gè)集群系統(tǒng)。 另外還需要強(qiáng)調(diào)一點(diǎn)mongos進(jìn)程沒有持久狀態(tài),每個(gè)實(shí)例都需要一定的數(shù)據(jù)存儲的內(nèi)存空間。
換而言之,所謂MongoDB 集群也就是 MongoDB做了一個(gè)數(shù)據(jù)庫路由的策略,而且保證跨庫操作的數(shù)據(jù)庫事務(wù),而MongoDB 集群中的關(guān)鍵部分Sharding不是一門新技術(shù),而是一種策略,關(guān)鍵還是看應(yīng)用場景和案例提供的可用性,因?yàn)镾harding不僅僅是MongoDB 集群中所提到的分布在不同的機(jī)器上,還可以分表,分區(qū),分?jǐn)?shù)據(jù),等等。
MongoDB 集群的工作原理:
其中有一個(gè)服務(wù)器上存儲著集群的metadata信息,包括每個(gè)服務(wù)器,每個(gè)shard的基本信息和chunk信息Config Server 主要存儲的是chunk信息。每一個(gè)config服務(wù)器都復(fù)制了完整的chunk信息,就是下圖中左邊黃色的部分。
如果客戶端對集群的MongoDB插入一條數(shù)據(jù),客戶端并不知道剛剛插入的數(shù)據(jù)被分配到具體哪個(gè)MongoDB節(jié)點(diǎn)上了,因?yàn)楫?dāng)一條數(shù)據(jù)被傳入 MongoDB集群中通過mongos路由,所以我們并感覺不到是數(shù)據(jù)存放在哪個(gè)shard的 chunk上,但是通過后臺的Sharding的管理命令可以看到插入的數(shù)據(jù)存放在哪個(gè)節(jié)點(diǎn)上。
配置MongoDB集群
模擬2個(gè)shard服務(wù)、一個(gè)config服務(wù)、一個(gè)mongos process,全部運(yùn)行在一個(gè)測試的服務(wù)器上,具體配置步驟如下:
口水: –shardsvr 是表示以sharding模式啟動(dòng)Mongodb服務(wù)器,Mongodb數(shù)據(jù)同步方式參見我寫的另外一篇文章“MongoDB 主(Master)/從(Slave)數(shù)據(jù)同步 ”
- $ mkdir /data/db/a
- $ mkdir /data/db/b
- $ mkdir /data/db/config
- $ ./mongod –shardsvr –dbpath /data/db/a –port 10000 > /tmp/sharda.log &
- $ cat /tmp/sharda.log
- $ ./mongod –shardsvr –dbpath /data/db/b –port 10001 > /tmp/shardb.log &
- $ cat /tmp/shardb.log
- $ ./mongod –configsvr –dbpath /data/db/config –port 20000 > /tmp/configdb.log &
- $ cat /tmp/configdb.log
- $ ./mongos –configdb localhost:20000 > /tmp/mongos.log &
- $ cat /tmp/mongos.log
- $ # we connect to mongos process
- $ ./mongo
- MongoDB shell version: 1.1.0-
- url: test
- connecting to: test
- type "help" for help
- > use admin
- switched to db admin
- > db.runCommand( { addshard : "localhost:10000", allowLocal : true } )
- {"ok" : 1 , "added" : "localhost:10000"}
- > db.runCommand( { addshard : "localhost:10001", allowLocal : true } )
- {"ok" : 1 , "added" : "localhost:10001"}
- > config = connect("localhost:20000")
- > config = config.getSisterDB("config")
- > test = db.getSisterDB("test")
- test
- > db.runCommand( { enablesharding : "test" } )
- {"ok" : 1}
- > db.runCommand( { shardcollection : "test.people", key : {name : 1} } )
- {"ok" : 1}
- > db.runCommand({listshards:1})
- {"servers" : [{"_id" : ObjectId( "4a9d40c981ba1487ccfaa634") , "host" : "localhost:10000"},
- {"_id" : ObjectId( "4a9d40df81ba1487ccfaa635") , "host" : "localhost:10001"}] ,
- "ok" : 1}
- >
復(fù)制代碼 BTW:
MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,MongoDB的數(shù)據(jù)結(jié)構(gòu)非常松散,他的數(shù)據(jù)格式類似json的bjson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。
另外,Mongo最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
Mongo還可以解決海量數(shù)據(jù)的查詢效率,根據(jù)官方文檔,當(dāng)數(shù)據(jù)量達(dá)到50GB以上數(shù)據(jù)時(shí),Mongo數(shù)據(jù)庫訪問速度是MySQL10 倍以上。對于這點(diǎn)我將來會去做些試驗(yàn)來進(jìn)行證明。
每個(gè)節(jié)點(diǎn)上都是單點(diǎn)的,不知道MongoDB Sharding+Replication是什么效果,因?yàn)楸簧⒘械姆⻊?wù)器還是存在著單點(diǎn)的現(xiàn)象,如果其中一個(gè)散列的節(jié)點(diǎn)壞點(diǎn)那么數(shù)據(jù)就不存在了。下面還要試試這2種方式的結(jié)合。
相關(guān)文章:
MongoDB 主(Master)/從(Slave)數(shù)據(jù)同步
Java操作 MongoDB NoSQL數(shù)據(jù)庫
|
|