天天看點

Mongodb複制集以及sharding的實作

一,概述

mongodb是一個典型的文檔型nosql資料庫,下面說一下Nosql包括的幾大類型資料庫:

NoSQL的資料存儲模型

鍵值模型:

資料模型:key-value存儲

優點:查找速度快

缺點:資料無結構,通常隻被當作字元串或二進制資料

應用場景:内容緩存

執行個體:Redis, Dynamo

列式模型:

資料模型:資料按列存儲,将同一列資料存在一起;

優點:查找迅速、可擴充性強、易于實作分布式;

缺點:功能相對SQL很有限;

應用場景:分布式檔案系統或分布式存儲

執行個體:Bigtable, Cassandra, HBase, Hypertable

文檔模型:

資料模型:與鍵值模型類似,value指向結構化資料;

優點:資料格式要求不嚴格,無需事先定義結構

缺點:查詢性能不高,缺乏統一查詢文法

應用場景:web應用;

執行個體:MongoDB, CouchDB

圖式模型:

資料模型:圖結構模型

優點:利用圖結構相關算法提高性能,并足特殊場景應用需求

缺點:難以實作分布式,功能有定向性;

應用場景:社交網絡、推薦系統、關系圖譜

執行個體:Neo4J

本文介紹的是mongodb的複制集以及sharding,下面來說一下mongodb為什麼要做sharding

越來越大的資料集及不斷提升吞吐量的應用程式對單台mongodb伺服器來講是一個挑戰————大量的查詢很快即能耗盡CPU的計算能力,而較大的資料集存儲需求也有可能很快超出單節點的存儲能力。最終,工作集的大多超出了系統的RAM并給I/O帶去巨大壓力。資料庫管理系統界解決此類問題通常有兩類方案:向上擴充和水準擴充。

sharding即是水準擴充的一種解決方案。它通過将資料集分布于多個也稱作分片(shard)的節點上來降低單節點的通路壓力。每個分片都是一個獨立的資料庫,所有的分片組合起來構成一個邏輯上的完整意義的資料庫。是以,分片機制降低了每個分片的資料操作量及需要存儲的資料量。

要建構一個 MongoDB Sharding Cluster,需要三種角色:

Shard Server:用于存儲實際的資料塊,也就是中繼資料,實際生産環境中一個shard server角色可由幾台機器組個一個relica set承擔,防止主機單點故障

Config Server:存儲了整個 Cluster Metadata,其中包括 chunk 資訊。

Route Server:前端路由,用戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。

下面是mongodb sharding的工作原理圖:

<a href="http://s3.51cto.com/wyfs02/M02/23/7A/wKiom1M35CLg3i2DAADwDRGSG7E361.jpg" target="_blank"></a>

二,實驗環境

   3台主機的環境:

   192.168.30.116  OS:Centos 6.4 x86_64

   192.168.30.117  OS:Centos 6.4 x86_64

   192.168.30.119  OS:Centos 6.4 x86_64

   下面是主機角色:

<a href="http://s3.51cto.com/wyfs02/M00/23/7C/wKioL1M36N6hYuf2AAGGtgvVd7s179.jpg" target="_blank"></a>

下面開始安裝mongodb,這裡使用通用的二進制包安裝

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<code>[root@node1 ~]</code><code># tar zxvf mongodb-linux-x86_64-2.0.4.tgz -C /usr/local/</code>

<code>[root@node1 ~]</code><code># mv /usr/local/mongodb-linux-x86_64-2.0.4 /usr/local/mongodb</code>

<code>[root@node1 ~]</code><code># groupadd -r mongod</code>

<code>[root@node1 ~]</code><code># useradd -M -r -g mongod -d /mongodb/data -s /bin/false -c mongod mongod</code>

<code>[root@node1 ~]</code><code># mkdir /mongodb/data/shard11 -p</code>

<code>[root@node1 ~]</code><code># mkdir /mongodb/data/shard21 -p</code>

<code>[root@node1 ~]</code><code># mkdir /mongodb/data/config -p</code>

<code>[root@node1 ~]</code><code># mkdir -p /var/log/mongo</code>

<code>[root@node1 ~]</code><code># chown -R mongod.mongod /mongodb/data/ /var/log/mongo/</code>

<code>[root@node2 ~]</code><code># tar zxvf mongodb-linux-x86_64-2.0.4.tgz -C /usr/local/</code>

<code>[root@node2 ~]</code><code># mv /usr/local/mongodb-linux-x86_64-2.0.4 /usr/local/mongodb</code>

<code>[root@node2 ~]</code><code># groupadd -r mongod</code>

<code>[root@node2 ~]</code><code># useradd -M -r -g mongod -d /mongodb/data -s /bin/false -c mongod mongod</code>

<code>[root@node2 ~]</code><code># mkdir /mongodb/data/shard12 -p</code>

<code>[root@node2 ~]</code><code># mkdir /mongodb/data/shard22 -p</code>

<code>[root@node2 ~]</code><code># mkdir /mongodb/data/config -p</code>

<code>[root@node2 ~]</code><code># mkdir -p /var/log/mongo</code>

<code>[root@node2 ~]</code><code># chown -R mongod.mongod /mongodb/data/ /var/log/mongo/</code>

<code>[root@node3 ~]</code><code># tar zxvf mongodb-linux-x86_64-2.0.4.tgz -C /usr/local/</code>

<code>[root@node3 ~]</code><code># mv /usr/local/mongodb-linux-x86_64-2.0.4 /usr/local/mongodb</code>

<code>[root@node3 ~]</code><code># groupadd -r mongod</code>

<code>[root@node3 ~]</code><code># useradd -M -r -g mongod -d /mongodb/data -s /bin/false -c mongod mongod</code>

<code>[root@node3 ~]</code><code># mkdir /mongodb/data/shard13 -p</code>

<code>[root@node3 ~]</code><code># mkdir /mongodb/data/shard23 -p</code>

<code>[root@node3 ~]</code><code># mkdir /mongodb/data/config -p</code>

<code>[root@node3 ~]</code><code># mkdir -p /var/log/mongo</code>

<code>[root@node3 ~]</code><code># chown -R mongod.mongod /mongodb/data/ /var/log/mongo/</code>

配置mongod

mongod在啟動時通過指令行選項或配置檔案(如/etc/mongod.conf)接口讀取其配置屬性。這兩種配置接口能夠提供相同的功能,是以,管理者可以根據偏好進行選擇。如果要通過配置檔案讀取配置選項,則可以在啟動mongod時使用--config或-f選項來指定配置檔案的位置。

mongod的基本配置參數

配置mongod的基本工作屬性可通過一些常用參數進行。

fork={true|false}: 是否以daemon方式啟動mongod,為true表示其啟動後其自動轉入背景工作;

bind_ip=IP:指定mongod監聽的IP位址;

port=PORT:指定mongod監聽的端口,預設為27017;

quiet={true|false}:是否工作于靜默模式,以最小化的記錄日志資訊;正常條件下,應該設定為true,僅在調試時才将其設定為false;

dbpath=/PATH/TO/SOMEWHERE:指定mongod存儲資料的位置,通常為/data/mongodb、/var/lib/mongodb或/srv/mongodb等;

logpath=/PATH/TO/SOMEFILE:日志檔案路徑,例如/var/log/mongodb/mongod.log;如果沒有指定檔案路徑,日志資訊則會發往标準輸出;

logappend={true|false}:設定mongod在啟動時是否不覆寫日志檔案中的原有日志資訊,true表示以追加方式記錄日志,即不覆寫;

journal={true|false}:是否啟動日志功能;日志功能是保證工作于單執行個體模式的mongod寫入資料持久性的惟一途徑;

安全相關的配置參數

資料庫伺服器的安全機制可有效防範非授權通路。

bind_ip=IP: 指定mongod監聽的IP位址;生産環境中,通常需要将其指定為一個可接受外部用戶端請求的IP位址,但應該僅開放需要接受用戶端請求的IP位址;如果需要指定多個位址,彼此間使用逗号分隔即可;

nounixsocket={true|false}:是否禁用mongodb的Unix套接字功能,預設為啟用;主要用于本地通信;

auth={true|false}:是否啟用認證功能;如果要啟用,遠端用戶端需要被授權方能通路mongodb伺服器;

配置replica sets

28

29

30

<code>[root@node1 ~]</code><code># mv /etc/mongod.conf /etc/mongod.conf.bak</code>

<code>[root@node1 ~]</code><code># vi /etc/mongod.conf</code>

<code>shardsvr = </code><code>true</code>

<code>replSet = shard1</code>

<code>port = 27017</code>

<code>dbpath=</code><code>/mongodb/data/shard11</code>

<code>oplogSize = 100</code>

<code>logpath=</code><code>/var/log/mongo/shard11</code><code>.log</code>

<code>logappend = </code><code>true</code>

<code>fork = </code><code>true</code>

<code>[root@node2 ~]</code><code># mv /etc/mongod.conf /etc/mongod.conf.bak</code>

<code>[root@node2 ~]</code><code># vi /etc/mongod.conf</code>

<code>dbpath=</code><code>/mongodb/data/shard12</code>

<code>logpath=</code><code>/var/log/mongo/shard12</code><code>.log</code>

<code>[root@node3 ~]</code><code># mv /etc/mongod.conf /etc/mongod.conf.bak</code>

<code>[root@node3 ~]</code><code># vi /etc/mongod.conf</code>

<code>dbpath=</code><code>/mongodb/data/shard13</code>

<code>logpath=</code><code>/var/log/mongo/shard13</code><code>.log</code>

啟動replica sets

<code>[root@node1 ~]</code><code># /usr/local/mongodb/bin/mongod -f /etc/mongod.conf</code>

<code>[root@node1 ~]</code><code># netstat -anptl | grep mong</code>

<code>tcp        0      0 0.0.0.0:28017               0.0.0.0:*                   LISTEN      5888</code><code>/mongod</code>

<code>tcp        0      0 0.0.0.0:27017               0.0.0.0:*</code>

同樣啟動node2,node3的shard1

配置shard2用到的replica sets:

<code>[root@node1 ~]</code><code># vi /etc/mongod2.conf</code>

<code>replSet = shard2</code>

<code>port = 27018</code>

<code>dbpath=</code><code>/mongodb/data/shard21</code>

<code>logpath=</code><code>/var/log/mongo/shard21</code><code>.log</code>

<code>[root@node2 ~]</code><code># vi /etc/mongod2.conf</code>

<code>dbpath=</code><code>/mongodb/data/shard22</code>

<code>logpath=</code><code>/var/log/mongo/shard22</code><code>.log</code>

<code>dbpath=</code><code>/mongodb/data/shard23</code>

<code>logpath=</code><code>/var/log/mongo/shard23</code><code>.log</code>

分别啟動node1,node2,node3的shard2

<code>[root@node1 ~]</code><code># /usr/local/mongodb/bin/mongod -f /etc/mongod2.conf</code>

<code>[root@node2 ~]</code><code># /usr/local/mongodb/bin/mongod -f /etc/mongod2.conf</code>

<code>[root@node3 ~]</code><code># /usr/local/mongodb/bin/mongod -f /etc/mongod2.conf</code>

登入其中一個shard1的mongod,初始化複制集

<code>[root@node1 ~]</code><code># mongo 192.168.30.116:27017</code>

<code>&gt; config = {_id: </code><code>'shard1'</code><code>,members: [</code>

<code>                          </code><code>{_id: 0, host: </code><code>'192.168.30.116:27017'</code><code>},</code>

<code>                          </code><code>{_id: 1, host: </code><code>'192.168.30.117:27017'</code><code>},</code>

<code>                          </code><code>{_id: 2, host: </code><code>'192.168.30.119:27017'</code><code>}]</code>

<code>}</code>

<code>&gt; rs.initiate(config);</code>

<code>[root@node1 ~]</code><code># mongo 192.168.30.116:27018</code>

<code>&gt; config = {_id: </code><code>'shard2'</code><code>,members: [</code>

<code>                          </code><code>{_id: 0, host: </code><code>'192.168.30.116:27018'</code><code>},</code>

<code>                          </code><code>{_id: 1, host: </code><code>'192.168.30.117:27018'</code><code>},</code>

<code>                          </code><code>{_id: 2, host: </code><code>'192.168.30.119:27018'</code><code>}]</code>

到此就配置好了二個replica sets,也就是準備好了二個shards

配置三台config server

<code>[root@node1 ~]</code><code># vi /etc/config.conf</code>

<code>configsvr = </code><code>true</code>

<code>port = 20000</code>

<code>dbpath=</code><code>/mongodb/data/config</code>

<code>logpath=</code><code>/var/log/mongo/config</code><code>.log</code>

<code>[root@node2 ~]</code><code># vi /etc/config.conf</code>

<code>[root@node3 ~]</code><code># vi /etc/config.conf</code>

<code>[root@node1 ~]</code><code># /usr/local/mongodb/bin/mongod -f /etc/config.conf</code>

<code>[root@node2 ~]</code><code># /usr/local/mongodb/bin/mongod -f /etc/config.conf</code>

<code>[root@node3 ~]</code><code># /usr/local/mongodb/bin/mongod -f /etc/config.conf</code>

<code>[root@node1 ~]</code><code># /usr/local/mongodb/bin/mongos --configdb 192.168.30.116:20000,192.168.30.117:20000,192.168.30.119:20000 --port 30000 --chunkSize 5 --logpath /mongodb/data/mongos.log --logappend --fork</code>

<code>[root@node2 ~]</code><code># /usr/local/mongodb/bin/mongos --configdb 192.168.30.116:20000,192.168.30.117:20000,192.168.30.119:20000 --port 30000 --chunkSize 5 --logpath /mongodb/data/mongos.log --logappend --fork</code>

<code>[root@node3 ~]</code><code># /usr/local/mongodb/bin/mongos --configdb 192.168.30.116:20000,192.168.30.117:20000,192.168.30.119:20000 --port 30000 --chunkSize 5 --logpath /mongodb/data/mongos.log --logappend --fork</code>

檢視是mongod,config,mongos是否啟動

<code>[root@node1 ~]</code><code># ss -antpl | grep mong</code>

<code>LISTEN     0      128           192.168.30.116:30000                    *:*      </code><code>users</code><code>:((</code><code>"mongos"</code><code>,3627,14))</code>

<code>LISTEN     0      128           192.168.30.116:28017                    *:*      </code><code>users</code><code>:((</code><code>"mongod"</code><code>,22036,6))</code>

<code>LISTEN     0      128           192.168.30.116:28018                    *:*      </code><code>users</code><code>:((</code><code>"mongod"</code><code>,3287,8))</code>

<code>LISTEN     0      128           192.168.30.116:31000                    *:*      </code><code>users</code><code>:((</code><code>"mongos"</code><code>,3627,13))</code>

<code>LISTEN     0      128           192.168.30.116:20000                    *:*      </code><code>users</code><code>:((</code><code>"mongod"</code><code>,3487,6))</code>

<code>LISTEN     0      128           192.168.30.116:21000                    *:*      </code><code>users</code><code>:((</code><code>"mongod"</code><code>,3487,7))</code>

<code>LISTEN     0      128           192.168.30.116:27017                    *:*      </code><code>users</code><code>:((</code><code>"mongod"</code><code>,22036,7))</code>

<code>LISTEN     0      128           192.168.30.116:27018                    *:*      </code><code>users</code><code>:((</code><code>"mongod"</code><code>,3287,7))</code>

都已啟動成功

連接配接到其中一個mongos程序,并切換到admin資料庫做以下配置:

<code>[root@node1 ~]</code><code># /usr/local/mongodb/bin/mongo 192.168.30.116:30000/admin</code>

<code>MongoDB shell version: 2.0.4</code>

<code>connecting to: 192.168.30.116:30000</code><code>/admin</code>

<code>&gt;db.runCommand( { addshard: </code><code>"shard1/192.168.30.116:27017,192.168.30.117:27017,192.168.30.119:27017″,name:"</code><code>s1",maxsize:20480});</code>

<code>&gt;db.runCommand( { addshard: </code><code>"shard2/192.168.30.116:27018,192.168.30.117:27018,192.168.30.119:27018″,name:"</code><code>s2",maxsize:20480});</code>

檢視加入的2個shard

<code>mongos&gt; db.runCommand( { listshards : 1 } );</code>

<code>{</code>

<code>    </code><code>"shards"</code> <code>: [</code>

<code>        </code><code>{</code>

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

<code>            </code><code>"host"</code> <code>: </code><code>"shard1/192.168.30.116:27017,192.168.30.117:27017,192.168.30.119:27017"</code>

<code>        </code><code>},</code>

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

<code>            </code><code>"host"</code> <code>: </code><code>"shard2/192.168.30.116:27018,192.168.30.117:27018,192.168.30.119:27018"</code>

<code>        </code><code>}</code>

<code>    </code><code>],</code>

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

啟動用資料庫分片

<code>mongos&gt; db.runCommand({enablesharding : </code><code>"testdb"</code><code>});</code>

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

指定分片的key

<code>mongos&gt; db.runCommand({shardcollection :</code><code>"testdb.user"</code><code>,key :{_id:1}});</code>

<code>{ </code><code>"collectionsharded"</code> <code>: </code><code>"test.user"</code><code>, </code><code>"ok"</code> <code>: 1 }</code>

插入20W行資料測試是否分片

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<code>mongos&gt; use testdb</code>

<code>switched to db testdb</code>

<code>mongos&gt; </code><code>for</code><code>(var i=1;i&lt;=200000;i++) db.user.insert({age:i,name:</code><code>"ljl"</code><code>,addr:</code><code>"beijing"</code><code>,country:</code><code>"china"</code><code>})</code>

<code>mongos&gt; db.user.stats()</code>

<code>    </code><code>"sharded"</code> <code>: </code><code>true</code><code>,</code>

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

<code>    </code><code>"ns"</code> <code>: </code><code>"testdb.user"</code><code>,</code>

<code>    </code><code>"count"</code> <code>: 70001,</code>

<code>    </code><code>"numExtents"</code> <code>: 7,</code>

<code>    </code><code>"size"</code> <code>: 6160096,</code>

<code>    </code><code>"storageSize"</code> <code>: 11190272,</code>

<code>    </code><code>"totalIndexSize"</code> <code>: 2289280,</code>

<code>    </code><code>"indexSizes"</code> <code>: {</code>

<code>        </code><code>"_id_"</code> <code>: 2289280</code>

<code>    </code><code>},</code>

<code>    </code><code>"avgObjSize"</code> <code>: 88.00011428408166,</code>

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

<code>    </code><code>"nchunks"</code> <code>: 10,</code>

<code>    </code><code>"shards"</code> <code>: {</code>

<code>        </code><code>"s1"</code> <code>: {</code>

<code>            </code><code>"ns"</code> <code>: </code><code>"testdb.user"</code><code>,</code>

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

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

<code>            </code><code>"storageSize"</code> <code>: 8192,</code>

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

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

<code>            </code><code>"lastExtentSize"</code> <code>: 8192,</code>

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

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

<code>            </code><code>"totalIndexSize"</code> <code>: 8176,</code>

<code>            </code><code>"indexSizes"</code> <code>: {</code>

<code>                </code><code>"_id_"</code> <code>: 8176</code>

<code>            </code><code>},</code>

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

<code>        </code><code>"s2"</code> <code>: {</code>

<code>            </code><code>"count"</code> <code>: 70001,</code>

<code>            </code><code>"size"</code> <code>: 6160096,</code>

<code>            </code><code>"avgObjSize"</code> <code>: 88.00011428408166,</code>

<code>            </code><code>"storageSize"</code> <code>: 11182080,</code>

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

<code>            </code><code>"lastExtentSize"</code> <code>: 8388608,</code>

<code>            </code><code>"totalIndexSize"</code> <code>: 2281104,</code>

<code>                </code><code>"_id_"</code> <code>: 2281104</code>

以上資訊發現資料已經分布在不同分片上

下面模拟自動故障轉移功能,在node1關閉shard1

<code>[root@node1 ~]</code><code># /usr/local/mongodb/bin/mongod --shutdown --shardsvr --replSet shard1 --port 27017 --dbpath /mongodb/data/shard11</code>

<code>killing process with pid: 22036</code>

<code>[root@node1 ~]</code><code># /usr/local/mongodb/bin/mongo 192.168.30.116:30000/testdb</code>

<code>connecting to: 192.168.30.116:30000</code><code>/testdb</code>

<code>mongos&gt; db.user.</code><code>find</code><code>()</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb007b"</code><code>), </code><code>"age"</code> <code>: 1, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb007c"</code><code>), </code><code>"age"</code> <code>: 2, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb007d"</code><code>), </code><code>"age"</code> <code>: 3, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb007e"</code><code>), </code><code>"age"</code> <code>: 4, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb007f"</code><code>), </code><code>"age"</code> <code>: 5, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0080"</code><code>), </code><code>"age"</code> <code>: 6, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0081"</code><code>), </code><code>"age"</code> <code>: 7, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0082"</code><code>), </code><code>"age"</code> <code>: 8, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0083"</code><code>), </code><code>"age"</code> <code>: 9, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0084"</code><code>), </code><code>"age"</code> <code>: 10, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0085"</code><code>), </code><code>"age"</code> <code>: 11, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0086"</code><code>), </code><code>"age"</code> <code>: 12, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0087"</code><code>), </code><code>"age"</code> <code>: 13, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0088"</code><code>), </code><code>"age"</code> <code>: 14, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb0089"</code><code>), </code><code>"age"</code> <code>: 15, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb008a"</code><code>), </code><code>"age"</code> <code>: 16, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb008b"</code><code>), </code><code>"age"</code> <code>: 17, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb008c"</code><code>), </code><code>"age"</code> <code>: 18, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb008d"</code><code>), </code><code>"age"</code> <code>: 19, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: ObjectId(</code><code>"5338092034594e87a8cb008e"</code><code>), </code><code>"age"</code> <code>: 20, </code><code>"name"</code> <code>: </code><code>"ljl"</code><code>, </code><code>"addr"</code> <code>: </code><code>"beijing"</code><code>, </code><code>"country"</code> <code>: </code><code>"china"</code> <code>}</code>

<code>has </code><code>more</code>

<code>mongos&gt;</code>

以上資訊發現資料一切正常

分片注意的幾個事項:

選擇sharding key的标準:

應該在哪兒存儲資料?

應該從哪兒得到希望的資料?

基本法則:

sharding key應該是主鍵;

sharding key應該能盡量保證避免跨分片查詢。

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