天天看點

mongodb部署一個叢集

一、案例

mongos:    192.168.1.3     hadoop1.abc.com     hadoop1

config server:    192.168.1.4     hadoop2.abc.com     hadoop2

Shard1:    192.168.1.5     hadoop3.abc.com     hadoop3

Shard2:    192.168.1.6     hadoop4.abc.com     hadoop4

配置伺服器是存儲叢集元資訊的 mongod 執行個體.使用 --configsvr 指定一個 mongod 為配置伺服器,每個配置伺服器都存儲了叢集的一份完整的元資訊.

在生産環境下,你必須部署三個配置伺服器,每個配置伺服器都運作在不同的伺服器上以保證良好的正常運作時間和資料安全.在測試環境下,你可以将三台配置伺服器運作在一台伺服器上.

1、為配置伺服器建立資料目錄,預設情況下,配置伺服器将資料檔案存儲在/data/configdb目錄下.你也可以自己指定不同的位置用來存儲資料檔案.通過簡單的指令建立資料目錄:

1

2

<code>[root@hadoop2 ~]# mkdir -pv /mongodb/data </code>

<code>[root@hadoop2 ~]# chown -R mongod.mongod /mongodb/</code>

2、啟動配置伺服器,每台都通過一下指令啟動:

配置伺服器的預設端口是 27019 .你也可以自己指定.以下示例使用預設的端口和預設的資料目錄啟動一個配置伺服器.

<code> </code><code>[root@hadoop2 ~]# mongod --configsvr --dbpath /mongodb/data --port </code><code>27019</code> <code>&amp;</code>

也可以編輯配置檔案

dbpath =  /mongod/data

configsvr = true

配置檔案的配置格式:

&lt;setting&gt; = &lt;value&gt;

三、配置mongos

在叢集中, mongos 負責将查詢與寫入分發到 分片 中.使用 mongos,應用有了通路叢集的統一入口,而不需要直接通路叢集的每個分片

通過緩存 配置伺服器 中叢集的元資訊, mongos 可以得知資料所位于的分片. mongos 使用這些元資訊将應用的讀寫請求分發到不同的分片, mongos 不存儲叢集 持續 的狀态(意思是, mongos 可以随時被重新開機或者添加,而不會造成叢集的資料丢失,也不會造成叢集的異常.),并且占有較少的系統資源.

在 cluster &lt;sharded cluster&gt;`中, :program:`mongos 使用以下步驟分發請求:

确定必須接收請求的 分片 清單.

在所有目标分片上建立遊标.

在某些情況下,當查詢條件包含 shard key 或者 shard key 的字首時,:program:mongos可以将請求分發到部分分片上,否則, mongos 會将請求分發到 所有 存儲這個集合的分片上.

為了檢測應用連接配接的是不是 mongos,可以使用 isMaster 指令.如果應用連接配接的是一個 mongos , isMaster 傳回一個包含 isdbgrid 字元串的 msg ,比如:

mongos屬于輕量級應應用,完全可以與其他服務運作于同一節點:啟動時,需要為mongos執行個體指明各config伺服器的通路位址:

預設情況下,mongos監聽于27017端口;可以使用如下指令啟動mongos執行個體

#mongos  --configdb &lt;config server hostnames((IP|Hostname):Port)&gt;

示例:使用以下配置伺服器,在預設端口上啟動 mongos :

cfg0.example.net

cfg1.example.net

cfg2.example.net

你需要使用以下指令:

每個 mongos 必須使用 configDB 按照相同的順序指定配置伺服器清單.

如果你啟動一個 mongos 時,指定的配置伺服器清單與其他 mongos 中指定的不同, mongos 會傳回 配置伺服器字元串錯誤錯誤并退出啟動.

也可以直接編輯配置檔案

1、注釋dbpath指令

2、添加configdb指令,并指定config伺服器的位址;

而後使用如下指令啟動mongos執行個體

#mongos -f /etc/mongod.conf

一個 shard 可以是一個單獨的:program:mongod或者一個 replica set.在生産環境中,每個分片都應該是一個複制集

3

4

5

6

7

<code>[root@hadoop2 ~]# mongo --host </code><code>192.168</code><code>.</code><code>1.3</code> 

<code>MongoDB shell version: </code><code>3.0</code><code>.</code><code>4</code>

<code>connecting to: </code><code>192.168</code><code>.</code><code>1.3</code><code>:</code><code>27017</code><code>/test</code>

<code>Server has startup warnings: </code>

<code>2015</code><code>-</code><code>08</code><code>-07T18:</code><code>01</code><code>:</code><code>34.816</code><code>+</code><code>0800</code> <code>I CONTROL  ** WARNING: You are running </code><code>this</code> <code>process </code><code>as</code> <code>the root user, which </code><code>is</code> <code>not recommended.</code>

<code>2015</code><code>-</code><code>08</code><code>-07T18:</code><code>01</code><code>:</code><code>34.816</code><code>+</code><code>0800</code> <code>I CONTROL  </code>

<code>mongos&gt;</code>

2、正如下面的示例,使用 sh.addShard() 在叢集中添加分片.每次使用 sh.addShard() 添加一個分片.如果分片是複制集,需要指定複制集的名字與一個成員名字.在生産環境中,所有分片都應該是複制集.

假設一個分片使用了複制集,複制集名字為 rs1 ,有一個運作在 mongodb0.example.net 且端口為 27017 的成員,使用以下指令添加這個分片:

如果添加的shard是獨立的mongod執行個體,則使用如下格式:

<code>sh.addShard(</code><code>"RS_SEVER:P"</code><code>)</code>

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<code>mongos&gt; sh.addShard(</code><code>"192.168.1.5:27017"</code><code>)</code>

<code>{ </code><code>"shardAdded"</code> <code>: </code><code>"shard0001"</code><code>, </code><code>"ok"</code> <code>: </code><code>1</code> <code>} </code>

<code>mongos&gt; sh.addShard(</code><code>"192.168.1.6:27017"</code><code>)</code>

<code>{ </code><code>"shardAdded"</code> <code>: </code><code>"shard0001"</code><code>, </code><code>"ok"</code> <code>: </code><code>1</code> <code>}</code>

<code>mongos&gt; sh.status()</code>

<code>--- Sharding Status --- </code>

<code>  </code><code>sharding version: {</code>

<code> </code><code>"_id"</code> <code>: </code><code>1</code><code>,</code>

<code> </code><code>"minCompatibleVersion"</code> <code>: </code><code>5</code><code>,</code>

<code> </code><code>"currentVersion"</code> <code>: </code><code>6</code><code>,</code>

<code> </code><code>"clusterId"</code> <code>: ObjectId(</code><code>"55c481b81d1ceaba52187728"</code><code>)</code>

<code>}</code>

<code>  </code><code>shards:</code>

<code> </code><code>{  </code><code>"_id"</code> <code>: </code><code>"shard0000"</code><code>,  </code><code>"host"</code> <code>: </code><code>"192.168.1.5:27017"</code> <code>}</code>

<code> </code><code>{  </code><code>"_id"</code> <code>: </code><code>"shard0001"</code><code>,  </code><code>"host"</code> <code>: </code><code>"192.168.1.6:27017"</code> <code>}</code>

<code>  </code><code>balancer:</code>

<code> </code><code>Currently enabled:  yes</code>

<code> </code><code>Currently running:  no</code>

<code> </code><code>Failed balancer rounds </code><code>in</code> <code>last </code><code>5</code> <code>attempts:  </code><code>0</code>

<code> </code><code>Migration Results </code><code>for</code> <code>the last </code><code>24</code> <code>hours: </code>

<code>  </code><code>No recent migrations</code>

<code>  </code><code>databases:</code>

<code> </code><code>{  </code><code>"_id"</code> <code>: </code><code>"admin"</code><code>,  </code><code>"partitioned"</code> <code>: </code><code>false</code><code>,  </code><code>"primary"</code> <code>: </code><code>"config"</code> <code>}</code>

注意,由于添加shard是獨立mongod執行個體,是以你要到192.168.1.5和192.168.1.6把mongod服務啟動起來,否則會出現如下錯誤提示

<code>{</code>

<code> </code><code>"ok"</code> <code>: </code><code>0</code><code>,</code>

<code> </code><code>"errmsg"</code> <code>: </code><code>"couldn't connect to new shard socket exception [CONNECT_ERROR] for 192.168.1.6:27017"</code>

在對集合進行分片之前,必須開啟資料庫的分片.對資料庫開啟分片不會導緻資料的重新配置設定,但這是對這個資料庫中集合進行分片的前提.

開啟如下

<code>mongos&gt; sh.enableSharding(</code><code>"testdb"</code><code>)</code>

<code>{ </code><code>"ok"</code> <code>: </code><code>1</code> <code>}</code>

分片以集合為基本機關.

首先選擇一個 shard key ,所選擇的片鍵會影響叢集的效率.

如果集合中已經包含有資料,需要使用 ensureIndex() 在片鍵上建立索引.如果集合是空的,MongoDB會在 sh.shardCollection() 過程中自動建立索引.

在 mongo 終端中使用 sh.shardCollection() 對一個集合開啟分片,文法如下:

将 &lt;database&gt;.&lt;collection&gt; 字元串換成你資料庫的ns,由資料庫的全名,一個點(即 . ),和集合的全名組成, shard-key-pattern 換成你的片鍵,名字為 建立索引 時指定的名字.

示例

The following sequence of commands shards four collections:

按照順序操作分片:

records 資料庫中的 people 集合使用 { 片鍵開啟分片.

這個集合使用 zipcode 字段重新配置設定資料.如果很多文檔都有相同的 zipcode 值, chunk 會按照 name 的值進行 分裂.

people 資料庫中的 addresses 集合使用片鍵 {.

這個片鍵使用 state 字段重新配置設定資料.如果很多文檔都有相同的 state 值, chunk 會按照 _id 的值進行 分裂.

assets 資料庫中的 chairs 集合使用 { 做片鍵.

這個片鍵使用 type 字段重新配置設定資料.如果很多文檔都有相同的 type 值, chunk 會按照 _id 的值進行 分裂.

events 資料庫中的 alerts 集合使用 { 做片鍵.

2.4 新版功能.

這個片鍵使用 _id 的散列值重新配置設定資料.MongoDB為 散列索引 計算 _id 的值,可以保證叢集中資料的均衡.

<code>mongos&gt; </code><code>for</code><code>(i=</code><code>1</code><code>;i&lt;=</code><code>100</code><code>;i++) db.testcoll.insert({Name: </code><code>"User"</code><code>+i,Age: i,Gender: </code><code>"M"</code><code>,PreferBook: [</code><code>"first book"</code><code>,</code><code>"Second book"</code><code>]})</code>

<code>WriteResult({ </code><code>"nInserted"</code> <code>: </code><code>1</code> <code>})</code>

先根據年齡作順序索引,再根據名字做順序分區

<code>mongos&gt; sh.shardCollection(</code><code>"testdb.testcoll"</code><code>,{Age: </code><code>1</code><code>,Name: </code><code>1</code><code>})</code>

<code>{ </code><code>"collectionsharded"</code> <code>: </code><code>"testdb.testcoll"</code><code>, </code><code>"ok"</code> <code>: </code><code>1</code> <code>}</code>

25

26

<code> </code><code>mongos&gt; sh.status()</code>

<code> </code><code>{  </code><code>"_id"</code> <code>: </code><code>"test"</code><code>,  </code><code>"partitioned"</code> <code>: </code><code>false</code><code>,  </code><code>"primary"</code> <code>: </code><code>"shard0000"</code> <code>}</code>

<code> </code><code>{  </code><code>"_id"</code> <code>: </code><code>"testdb"</code><code>,  </code><code>"partitioned"</code> <code>: </code><code>true</code><code>,  </code><code>"primary"</code> <code>: </code><code>"shard0000"</code> <code>}</code>

<code>  </code><code>testdb.testcoll</code>

<code>   </code><code>shard key: { </code><code>"Age"</code> <code>: </code><code>1</code><code>, </code><code>"Name"</code> <code>: </code><code>1</code> <code>}</code>

<code>   </code><code>chunks:</code>

<code>    </code><code>shard0000 </code><code>1</code>

<code>   </code><code>{ </code><code>"Age"</code> <code>: { </code><code>"$minKey"</code> <code>: </code><code>1</code> <code>}, </code><code>"Name"</code> <code>: { </code><code>"$minKey"</code> <code>: </code><code>1</code> <code>} } --&gt;&gt; { </code><code>"Age"</code> <code>: { </code><code>"$maxKey"</code> <code>: </code><code>1</code> <code>}, </code><code>"Name"</code> <code>: { </code><code>"$maxKey"</code> <code>: </code><code>1</code> <code>} } on : shard0000 Timestamp(</code><code>1</code><code>, </code><code>0</code><code>)</code>

本文轉自 zouqingyun 51CTO部落格,原文連結:http://blog.51cto.com/zouqingyun/1682778,如需轉載請自行聯系原作者