一,概述
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>> 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>> rs.initiate(config);</code>
<code>[root@node1 ~]</code><code># mongo 192.168.30.116:27018</code>
<code>> 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>>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>>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> 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> db.runCommand({enablesharding : </code><code>"testdb"</code><code>});</code>
<code>{ </code><code>"ok"</code> <code>: 1 }</code>
指定分片的key
<code>mongos> 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> use testdb</code>
<code>switched to db testdb</code>
<code>mongos> </code><code>for</code><code>(var i=1;i<=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> 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> 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></code>
以上資訊發現資料一切正常
分片注意的幾個事項:
選擇sharding key的标準:
應該在哪兒存儲資料?
應該從哪兒得到希望的資料?
基本法則:
sharding key應該是主鍵;
sharding key應該能盡量保證避免跨分片查詢。
本文轉自ljl_19880709 51CTO部落格,原文連結:http://blog.51cto.com/luojianlong/1387060,如需轉載請自行聯系原作者