Mongodb分片集群部署

Mongodb分片概括

  • 分片在多臺服務器上分布數(shù)據(jù)的方法, Mongodb使用分片來支持具有非常大的數(shù)據(jù)集和高吞吐量的操作的部署
  • 具有大數(shù)據(jù)集和高吞吐量應用程序的數(shù)據(jù)庫系統(tǒng)蹬癌,可以挑戰(zhàn)單臺服務器的容量。
    例如虹茶,高查詢率可以耗盡服務器的cpu容量逝薪,工作集大小大于系統(tǒng)的RAM強制磁盤驅(qū)動器的I/O容量,
  • 有兩種方法來解決系統(tǒng)增長:垂直和水平縮放蝴罪。
    • 垂直縮放 涉及增加的單個服務器的容量董济,例如使用更強大的CPU,加入更多的RAM要门,或增加的存儲空間量虏肾。可用技術中的限制可能限制單個機器對于給定工作負載足夠強大暂衡。此外询微,基于云的提供商具有基于可用硬件配置的硬上限。因此狂巢,對于垂直縮放存在實際的最大值撑毛。
    • 包括將系統(tǒng)數(shù)據(jù)和負載在多個服務器,添加額外的服務器,需要增加容量藻雌。雖然單個機器的總速度或容量可能不高雌续,但是每個機器處理整個工作負載的子集,潛在地提供比單個高速大容量服務器更好的效率胯杭。擴展部署的容量僅需要根據(jù)需要添加額外的服務器驯杜,這可以是比單個機器的高端硬件低的總體成本。權衡是基礎設施的復雜性和部署的維護做个。
  • Mongodb的支持水平擴展鸽心,分片。
分片目的

對于單臺數(shù)據(jù)庫服務器居暖,龐大的數(shù)據(jù)量及高吞吐量的應用程序?qū)λ詿o疑是個巨大的挑戰(zhàn)顽频。頻繁的CRUD操作能夠耗盡服務器的CPU資源,快速的數(shù)據(jù)增長也會讓硬盤存儲無能為力太闺,最終內(nèi)存無法滿足數(shù)據(jù)需要導致大量的I/O糯景,主機負載嚴重。為了解決這種問題省骂,對于數(shù)據(jù)庫系統(tǒng)一般有兩種方法:垂直擴展分片(水平擴展)蟀淮。

【垂直擴展】:添加更多的CPU和存儲資源來增加系統(tǒng)性能。這種方式缺點是:擁有大量CPU和RAM資源的高端機器比普通PC機器昂貴得太多钞澳,而且單點故障會影響整個系統(tǒng)的服務怠惶。

【分片】:相反地,分片將大的數(shù)據(jù)集分配到多臺主機上轧粟,每個分片是一個獨立的數(shù)據(jù)庫甚疟,這些分片整體上構成一個完整的邏輯數(shù)據(jù)庫。分片減少了每臺服務器上的數(shù)據(jù)操作量逃延,隨著集群的增長,每臺分片處理越來越少的數(shù)據(jù)轧拄,結果揽祥,增加了系統(tǒng)整體服務能力。另外檩电,分片還減少了每臺服務器需要存儲的數(shù)據(jù)量拄丰。

MongoDB中的分片

MongoDB通過配置分片集群來支持分片,一個分片集群包括以下幾個組件:分片俐末,查詢路由料按,配置服務器

  • 分片:用來存儲數(shù)據(jù),為了提供系統(tǒng)可用性和數(shù)據(jù)一致性卓箫,一個生產(chǎn)環(huán)境的分片集群载矿,通常每個分片是一個副本集。
  • 查詢路由:指客戶端應用訪問每個分片的路徑烹卒。
  • 配置服務器:存儲集群的元數(shù)據(jù)闷盔,這些數(shù)據(jù)包含了集群數(shù)據(jù)集到各分片的映射關系弯洗。查詢路由就是通過這些元數(shù)據(jù)到特定的分片上執(zhí)行指定的數(shù)據(jù)操作。(從v3.2開始逢勾,配置服務器也可以作為副本集牡整,但是必須使用WiredTiger存儲引擎,反對使用3個鏡像實例作為配置服務器)
數(shù)據(jù)劃分

MongoDB的數(shù)據(jù)劃分溺拱,是以集合級別為標準逃贝。分片通過shard key來劃分集合數(shù)據(jù)。

  • shard key:

為了對集合分片迫摔,你需要指定一個shard key沐扳。shard key既可以是集合的每個文檔的索引字段也可以是集合中每個文檔都有的組合索引字段。MongoDB將shard keys值按照塊(chunks)劃分攒菠,并且均勻的將這些chunks分配到各個分片上迫皱。MongoDB使用基于范圍劃分基于散列劃分來劃分chunks的。

  • 基于范圍劃分

MongoDB通過shard key值將數(shù)據(jù)集劃分到不同的范圍就稱為基于范圍劃分辖众。對于數(shù)值型的shard key:你可以虛構一條從負無窮到正無窮的直線(理解為x軸)卓起,每個shard key 值都落在這條直線的某個點上,然后MongoDB把這條線劃分為許多更小的沒有重復的范圍成為塊(chunks)凹炸,一個chunk就是就某些最小值到最大值的范圍戏阅。

  • 基于散列劃分:

MongoDB計算每個字段的hash值,然后用這些hash值建立chunks啤它。

  • 基于范圍和基于散列劃分的性能比較:

基于范圍劃分對于范圍查詢比較高效奕筐。假設在shard key上進行范圍查詢,查詢路由很容易能夠知道哪些塊與這個范圍重疊变骡,然后把相關查詢按照這個路線發(fā)送到僅僅包含這些chunks的分片离赫。但是基于范圍劃分很容易導致數(shù)據(jù)不均勻分布,這樣會削弱分片集群的功能塌碌。例如當shard key是個成直線上升的字段渊胸,如時間。那么台妆,所有在給定時間范圍內(nèi)的請求都會映射到相同的chunk翎猛,也就是相同的分片上。這種情況下接剩,小部分的分片將會承受大多數(shù)的請求切厘,那么系統(tǒng)整體擴展并不理想。

相反的懊缺,基于散列劃分是以犧牲高效范圍查詢?yōu)榇鷥r疫稿,它能夠均勻的分布數(shù)據(jù),散列值能夠保證數(shù)據(jù)隨機分布到各個分片上。

  • 使用標簽來自定義數(shù)據(jù)分布

MongoDB允許DBA們通過標簽標記分片的方式直接平衡數(shù)據(jù)分布策略而克,DBA可以創(chuàng)建標簽并且將它們與shard key值的范圍進行關聯(lián)靶壮,然后分配這些標簽到各個分片上,最終平衡器轉(zhuǎn)移帶有標簽標記的數(shù)據(jù)到對應的分片上员萍,確保集群總是按標簽描述的那樣進行數(shù)據(jù)分布腾降。標簽是控制平衡器行為及集群中塊分布的主要方法

維持數(shù)據(jù)分布平衡

新加入的數(shù)據(jù)及服務器都會導致集群數(shù)據(jù)分布不平衡,MongoDB采用兩種方式確保數(shù)據(jù)分布的平衡:

  • 拆分

拆分是一個后臺進程碎绎,防止塊變得太大螃壤。當一個塊增長到指定塊大小的時候,拆分進程就會塊一分為二筋帖,整個拆分過程是高效的奸晴。不會涉及到數(shù)據(jù)的遷移等操作。

  • 平衡

平衡器是一個后臺進程日麸,管理塊的遷移寄啼。平衡器能夠運行在集群任何的mongd實例上。當集群中數(shù)據(jù)分布不均勻時代箭,平衡器就會將某個分片中比較多的塊遷移到擁有塊較少的分片中墩划,直到數(shù)據(jù)分片平衡為止。舉個例子:如果集合users有100個塊在分片1里嗡综,50個塊在分片2中乙帮,那么平衡器就會將分片1中的塊遷移到分片2中,直到維持平衡极景。

分片采用后臺操作的方式管理著源分片和目標分片之間塊的遷移察净。在遷移的過程中,源分片中的塊會將所有文檔發(fā)送到目標分片中盼樟,然后目標分片會獲取并應用這些變化氢卡。最后,更新配置服務器上關于塊位置元數(shù)據(jù)晨缴。

  • 從集群中增加和刪除分片

添加新分片到集群中會產(chǎn)生數(shù)據(jù)不平衡异吻,因為新分片中沒有塊,當MongoDB開始遷移數(shù)據(jù)到新分片中時喜庞,等到數(shù)據(jù)分片平衡恐怕需要點時間。

當刪除一個分片時棋返,平衡器將會把分片中所有塊遷移到另一個分片中延都,在完成這些遷移并更新元數(shù)據(jù)后,你就可以安全的刪除分片了睛竣。

分片集群

  • 一個mongodb分片集群由以下幾部分組成

    img
  • shard 每個shard包含分片數(shù)據(jù)的子集晰房,每個shard可以部署一個副本集
    一臺機器的一個數(shù)據(jù)表 Collection1 存儲了 1T 數(shù)據(jù),壓力太大了!在分給4個機器后殊者,每個機器都是256G与境,則分攤了集中在一臺機器的壓力。也許有人問一臺機器硬盤加大一點不就可以了猖吴,為什么要分給四臺機器呢摔刁?不要光想到存儲空間,實際運行的數(shù)據(jù)庫還有硬盤的讀寫海蔽、網(wǎng)絡的IO共屈、CPU和內(nèi)存的瓶頸。在mongodb集群只要設置好了分片規(guī)則党窜,通過mongos操作數(shù)據(jù)庫就能自動把對應的數(shù)據(jù)操作請求轉(zhuǎn)發(fā)到對應的分片機器上拗引。在生產(chǎn)環(huán)境中分片的片鍵可要好好設置,這個影響到了怎么把數(shù)據(jù)均勻分到多個分片機器上幌衣,不要出現(xiàn)其中一臺機器分了1T矾削,其他機器沒有分到的情況,這樣還不如不分片豁护!

img
  • mongos MongoS充當一個查詢的路由器哼凯,提供客戶端應用程序和所述分片簇之間的接口,mongos作為數(shù)據(jù)庫集群請求的入口,所有的請求都是通過mongos來進行協(xié)調(diào)的择镇,不需要在應用程序添加一個路由選擇器挡逼,mongos自己就是一個請求分發(fā)中心,它負責把對應的數(shù)據(jù)請求轉(zhuǎn)發(fā)到對應的shard服務器上腻豌,在生產(chǎn)環(huán)境中通常有多個monogs作為請求的入口家坎,防止其中一個掛掉所有mongos請求都沒有辦法操作
  • config servers 為集群配置的服務器存儲元數(shù)據(jù)和配置設置,從Mongodb3.4開始吝梅,配置服務器必須部署為復制集虱疏,mongos本身沒有物理存儲分片服務器和數(shù)據(jù)路由信息,只是緩存在內(nèi)存當中苏携,配置服務器則實際存儲這些數(shù)據(jù)做瞪,mongos第一次啟動或者關掉重啟會從configserver中加載配置信息,以后如果配置信息有變化會通過所有的mongos更新自己的狀態(tài)右冻,這樣mongs就能繼續(xù)準確路由装蓬,在生產(chǎn)環(huán)境中通常有多個config server配置服務器,因為它存儲了分片路由的元數(shù)據(jù)纱扭,如果就一個如果掛掉一個牍帚,整個mongodb基礎就會掛掉。
片鍵
  • 片鍵
    1乳蛾、在分發(fā)集合中文件時暗赶,mongodb的分區(qū)使用的收集片鍵關鍵鄙币,在片鍵由存在目標集合中的每個文檔中的一個不可變或多個字段
    2、在分割集合的時候選擇片鍵蹂随,<font color=red>分片鍵完成之后是不能更改的</font>十嘿,分片集合只能有1個片鍵,到片鍵的非空集合岳锁,集合必須有一個索引绩衷,與片鍵啟動,對于空空集合浸锨,如果集合尚未具有指定分片鍵的相關索引唇聘,則Mongodb會創(chuàng)建索引
    3、分片鍵的選擇會影響分片集群的性能和效率以及可伸縮性柱搜,具有最佳可能的硬件可以通過分片達到瓶頸迟郎,片鍵和其支持指數(shù)的選擇也可以影響數(shù)據(jù)的拆分,但集群可以使用
    4聪蘸、片鍵決定了集群中一個集合的文件咋不同的片鍵中的分布宪肖,片鍵字段必須被索引,且在集合中的每條記錄都不能為空健爬,可以是單個字段或者是復合字段
    5控乾、Mongodb使用片鍵的范圍是吧數(shù)據(jù)分布在分片中,每個范圍娜遵,又稱為數(shù)據(jù)塊蜕衡,定義了一個不重疊的片鍵范圍Mongodb把數(shù)據(jù)塊與他們存儲的文檔分布到集群中的不同分布中,當一個數(shù)據(jù)塊的大小超過數(shù)據(jù)塊最大大小的時候设拟,Mongodb會宜聚片鍵的范圍將數(shù)據(jù)塊分裂為更小的數(shù)據(jù)塊

    img
  • 片鍵的使用語法
    1慨仿、在分片集合,必須制定目標集合和片鍵的sh.shardCollection()

sh.shardCollection(namespace, key)

2纳胧、哈希片鍵使用單字段的哈希索引進行數(shù)據(jù)在分片之間的平均分發(fā)镰吆,除數(shù)取余一致性哈希
3、被選為片鍵的字段必須有足夠大的基數(shù)跑慕,或者有足夠多的不同的值万皿,對于單調(diào)的遞增的字段如果ObjectID或是時間戳,哈希索引效果更好
4核行、如果在一個空集合創(chuàng)建哈希片鍵牢硅,Mongodb會自動創(chuàng)建并遷移數(shù)據(jù)塊,以保證每個分片上都有兩個數(shù)據(jù)塊芝雪,也可以執(zhí)行shardCollection指定numInitialChunks參數(shù)以控制初始化時Mongodb創(chuàng)建數(shù)據(jù)塊數(shù)目减余,或者手動調(diào)用split命令在分片上分裂數(shù)據(jù)塊
5、對使用了哈希片鍵分片的集合進行請求時绵脯,Mongodb會自動計算哈希值佳励,應用不需要解析哈希值

shard集群部署

  • 部署ip規(guī)劃

    172.17.237.33:30001    config1
    172.17.237.34:30002    config2
    172.17.237.36:30003    config3
    172.17.237.37:40000    mongos
    172.17.237.38:50000    shard1
    172.17.237.39:50001    shard2
    172.17.237.40:50002    shard3
    172.17.237.41:60000    sha1
    172.17.237.42:60001    sha2
    172.17.237.43:60002    sha3
    
配置config server 副本集
  • 配置confi1配置文件
[root@My-Dev db2]# vim config1.conf 
[root@My-Dev db1]# vim configsvr.conf 
logpath=/home/mongodb/test/db1/log/db1.log
pidfilepath=/home/mongodb/test/db1/db1.pid
logappend=true
port=30000  
fork=true
dbpath=/home/mongodb/test/db1/data
configsvr=true   # 在配置文件添加此項就行
oplogSize=512
replSet=config
  • 配置confi2配置文件
[root@My-Dev db2]# vim config2.conf 
logpath=/home/mongodb/test/db2/log/db2.log
pidfilepath=/home/mongodb/test/db2/db2.pid
logappend=true
port=30001
fork=true
dbpath=/home/mongodb/test/db2/data
oplogSize=512
replSet=config
configsvr=true
  • 配置confi3配置文件
[root@My-Dev db2]# vim config3.conf
logpath=/home/mongodb/test/db3/log/db3.log
pidfilepath=/home/mongodb/test/db3/db3.pid
logappend=true
port=30002
fork=true
dbpath=/home/mongodb/test/db3/data
oplogSize=512
replSet=config
configsvr=true
  • 啟動config server
[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db1/config1.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 5260
child process started successfully, parent exiting

[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db2/config2.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 5202
child process started successfully, parent exiting

[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db3/config3.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 4260
child process started successfully, parent exiting
  • 配置config副本集
> use admin
switched to db admin

> config = { _id:"config",members:[ {_id:0,host:"conf1:30000"}, {_id:1,host:"conf2:30001"}, {_id:2,host:"conf3:30002"}] }        #定義副本集
{
    "_id" : "config",
    "members" : [
        {
            "_id" : 0,
            "host" : "conf1:30000"
        },
        {
            "_id" : 1,
            "host" : "conf2:30001"
        },
        {
            "_id" : 2,
            "host" : "conf3:30002"
        }
    ]
}
> rs.initiate(config)     #初始化副本集
{ "ok" : 1 }
配置mongos
  • 添加配置mongos配置文件
    遇到坑了,在啟動mongos的時候啟動失敗蛆挫,結果是mongodb3.0以后的版本config server必須是復制集才行赃承,結果我的版本是3.4最新的版本,所以說還需要添加兩臺confi server
[root@My-Dev db4]# vim  mongos.conf 

logpath=/home/mongodb/test/db4/log/db4.log
pidfilepath=/home/mongodb/test/db4/db4.pid
logappend=true
port=40004
fork=true
configdb=mongos/172.17.237.33:30000,172.17.237.34:30001,172.17.237.36:30002   #如果有多個mongo confi的話就用逗號分隔開 
  • 啟動mongos
[root@My-Dev bin]# ./mongos -f /home/mongodb/test/db4/mongos.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 6268
child process started successfully, parent exiting
shard2副本集集群部署
  • 配置sha配置文件
[root@My-Dev db8]# more shard21.conf 
logpath=/home/mongodb/test/db8/log/db8.log
pidfilepath=/home/mongodb/test/db8/db8.pid
directoryperdb=true
logappend=true
port=60000
fork=true
dbpath=/home/mongodb/test/db8/data 
oplogSize=512
replSet=sha
shardsvr=true



[root@My-Dev db9]# more shard22.conf 
logpath=/home/mongodb/test/db9/log/db9.log
pidfilepath=/home/mongodb/test/db9/db9.pid
directoryperdb=true
logappend=true
port=60001
fork=true
dbpath=/home/mongodb/test/db9/data 
oplogSize=512
replSet=sha
shardsvr=true


[root@My-Dev db10]# more shard23.conf 
logpath=/home/mongodb/test/db10/log/db10.log
pidfilepath=/home/mongodb/test/db10/db10.pid
directoryperdb=true
logappend=true
port=60002
fork=true
dbpath=/home/mongodb/test/db10/data 
oplogSize=512
replSet=sha
shardsvr=true
  • 啟動shard
[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db8/shard21.conf 
[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db9/shard22.conf 
[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db10/shard23.conf 
  • 配置shard2副本集集群
> use admin 
switched to db admin
> sha = { _id:"sha",members:[ {_id:0,host:"sha1:60000"}, {_id:1,host:"sha2:60001"}, {_id:2,host:"sha3:60002"}]}
{
    "_id" : "sha",
    "members" : [
        {
            "_id" : 0,
            "host" : "sha1:60000"
        },
        {
            "_id" : 1,
            "host" : "sha2:60001"
        },
        {
            "_id" : 2,
            "host" : "sha3:60002"
        }
    ]
}
> rs.initiate(sha)
{ "ok" : 1 }
shard1副本集集群部署
  • 配置shard配置文件
[root@My-Dev db5]# vim shard1.conf 
logpath=/home/mongodb/test/db5/log/db5.log
pidfilepath=/home/mongodb/test/db5/db5.pid
directoryperdb=true
logappend=true
port=50000
fork=true
dbpath=/home/mongodb/test/db5/data
oplogSize=512
replSet=shard
shardsvr=true


[root@My-Dev db6]# vim shard2.conf 
logpath=/home/mongodb/test/db6/log/db6.log
pidfilepath=/home/mongodb/test/db6/db6.pid
directoryperdb=true
logappend=true
port=50001
fork=true
dbpath=/home/mongodb/test/db6/data
oplogSize=512
replSet=shard
shardsvr=true


[root@My-Dev db7]# vim shard3.conf 
logpath=/home/mongodb/test/db7/log/db7.log
pidfilepath=/home/mongodb/test/db7/db7.pid
directoryperdb=true
logappend=true
port=50002
fork=true
dbpath=/home/mongodb/test/db7/data
oplogSize=512
replSet=shard
shardsvr=true
  • 啟動shard
[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db7/shard1.conf 
[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db7/shard2.conf 
[root@My-Dev bin]# ./mongod -f /home/mongodb/test/db7/shard3.conf 
  • 配置shard2副本集集群
> use admin
switched to db admin
> shard = { _id:"shard",members:[ {_id:0,host:"shard1:50000"}, {_id:1,host:"shard2:50001"}, {_id:2,host:"shard3:50002"}] }
{
    "_id" : "shard",
    "members" : [
        {
            "_id" : 0,
            "host" : "shard1:50000"
        },
        {
            "_id" : 1,
            "host" : "shard2:50001"
        },
        {
            "_id" : 2,
            "host" : "shard3:50002"
        }
    ]
}
> rs.initiate(shard)
{ "ok" : 1 }
分片配置
  • 分片集合中是否有數(shù)據(jù)
    默認第一個添加的shard就是主shard悴侵,存放沒有被分割的shard就是主shard
    在創(chuàng)建分片的時瞧剖,必須在索引中創(chuàng)建的,如果這個集合中有數(shù)據(jù)可免,則首先自己先創(chuàng)建索引抓于,然后進行分片,如果是分片集合中沒有數(shù)據(jù)的話浇借,則就不需要創(chuàng)建索引捉撮,就可以分片
  • 登陸mongos配置分片,向分區(qū)集群中添加shard服務器和副本集
[root@My-Dev bin]# ./mongo mongos:40004    #登陸到mongos中

mongos> sh.status()  #查看分片狀態(tài)
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("589b0cff36b0915841e2a0a2")
}
  shards:
  active mongoses:
    "3.4.1" : 1
 autosplit:
    Currently enabled: yes
  balancer:
    Currently enabled:  yes
    Currently running:  no
        Balancer lock taken at Wed Feb 08 2017 20:20:16 GMT+0800 (CST) by ConfigServer:Balancer
    Failed balancer rounds in last 5 attempts:  0
    Migration Results for the last 24 hours: 
        No recent migrations
  databases:
  • 添加shard副本集
#首先要登陸到shard副本集中查看那個是主節(jié)點妇垢,本次實驗室使用了兩個shard副本集 sh.addShard("<replSetName>/主節(jié)點IP/port") 
mongos> sh.addShard("shard/shard1:50000")  
{ "shardAdded" : "shard", "ok" : 1 }

mongos> sh.addShard("sha/sha:60000")
{ "shardAdded" : "shard", "ok" : 1 }

mongos> sh.status()  #查看分片集群已經(jīng)成功把shard加入分片中
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("589b0cff36b0915841e2a0a2")
}
  shards:
    {  "_id" : "sha",  "host" : "sha/sha1:60000,sha2:60001,sha3:60002",  "state" : 1 }
    {  "_id" : "shard",  "host" : "shard/shard1:50000,shard2:50001,shard3:50002",  "state" : 1 }
  active mongoses:
    "3.4.1" : 1
 autosplit:
    Currently enabled: yes
  balancer:
    Currently enabled:  yes
    Currently running:  no
        Balancer lock taken at Wed Feb 08 2017 20:20:16 GMT+0800 (CST) by ConfigServer:Balancer
    Failed balancer rounds in last 5 attempts:  5
    Last reported error:  Cannot accept sharding commands if not started with --shardsvr
    Time of Reported error:  Thu Feb 09 2017 17:42:21 GMT+0800 (CST)
    Migration Results for the last 24 hours: 
        No recent migrations
  databa
  • 指定那個數(shù)據(jù)庫使用分片巾遭,創(chuàng)建片鍵
mongos> sh.enableSharding("zhao")  #指定zhao數(shù)據(jù)庫中使用分片
{ "ok" : 1 }

mongos> sh.shardCollection("zhao.call",{name:1,age:1})   #在zhao數(shù)據(jù)庫和call集合中創(chuàng)建了name和age為升序的片鍵
{ "collectionsharded" : "zhao.call", "ok" : 1 }
 
  • 查看sh.status()信息
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("589b0cff36b0915841e2a0a2")
}
  shards:
    {  "_id" : "sha",  "host" : "sha/sha1:60000,sha2:60001,sha3:60002",  "state" : 1 }
    {  "_id" : "shard",  "host" : "shard/shard1:50000,shard2:50001,shard3:50002",  "state" : 1 }
  active mongoses:
    "3.4.1" : 1
 autosplit:
    Currently enabled: yes
  balancer:
    Currently enabled:  yes
    Currently running:  no
        Balancer lock taken at Wed Feb 08 2017 20:20:16 GMT+0800 (CST) by ConfigServer:Balancer
    Failed balancer rounds in last 5 attempts:  5
    Last reported error:  Cannot accept sharding commands if not started with --shardsvr
    Time of Reported error:  Thu Feb 09 2017 17:56:02 GMT+0800 (CST)
    Migration Results for the last 24 hours: 
        No recent migrations
  databases:
    {  "_id" : "zhao",  "primary" : "shard",  "partitioned" : true }
        zhao.call
            shard key: { "name" : 1, "age" : 1 }
            unique: false
            balancing: true
            chunks:
                shard    1
            { "name" : { "$minKey" : 1 }, "age" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 }, "age" : { "$maxKey" : 1 } } on : shard Timestamp(1, 0) 
  • 測試批量插入數(shù)據(jù)驗證
mongos> for ( var i=1;i<10000000;i++){db.call.insert({"name":"user"+i,age:i})};
  • 查看當前是否已經(jīng)分片到兩個shard中去了
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("589b0cff36b0915841e2a0a2")
}
  shards:
    {  "_id" : "sha",  "host" : "sha/sha1:60000,sha2:60001,sha3:60002",  "state" : 1 }
    {  "_id" : "shard",  "host" : "shard/shard1:50000,shard2:50001,shard3:50002",  "state" : 1 }
  active mongoses:
    "3.4.1" : 1
 autosplit:
    Currently enabled: yes
  balancer:
    Currently enabled:  yes
    Currently running:  no
        Balancer lock taken at Wed Feb 08 2017 20:20:16 GMT+0800 (CST) by ConfigServer:Balancer
    Failed balancer rounds in last 5 attempts:  5
    Last reported error:  Cannot accept sharding commands if not started with --shardsvr
    Time of Reported error:  Thu Feb 09 2017 17:56:02 GMT+0800 (CST)
    Migration Results for the last 24 hours: 
        4 : Success
  databases:
    {  "_id" : "zhao",  "primary" : "shard",  "partitioned" : true }
        zhao.call
            shard key: { "name" : 1, "age" : 1 }
            unique: false
            balancing: true
            chunks:   #數(shù)據(jù)已經(jīng)分片到兩個chunks里面了
                sha    4
                shard    5
            { "name" : { "$minKey" : 1 }, "age" : { "$minKey" : 1 } } -->> { "name" : "user1", "age" : 1 } on : sha Timestamp(4, 1) 
            { "name" : "user1", "age" : 1 } -->> { "name" : "user1", "age" : 21 } on : shard Timestamp(5, 1) 
            { "name" : "user1", "age" : 21 } -->> { "name" : "user1", "age" : 164503 } on : shard Timestamp(2, 2) 
            { "name" : "user1", "age" : 164503 } -->> { "name" : "user1", "age" : 355309 } on : shard Timestamp(2, 3) 
            { "name" : "user1", "age" : 355309 } -->> { "name" : "user1", "age" : 523081 } on : sha Timestamp(3, 2) 
            { "name" : "user1", "age" : 523081 } -->> { "name" : "user1", "age" : 710594 } on : sha Timestamp(3, 3) 
            { "name" : "user1", "age" : 710594 } -->> { "name" : "user1", "age" : 875076 } on : shard Timestamp(4, 2) 
            { "name" : "user1", "age" : 875076 } -->> { "name" : "user1", "age" : 1056645 } on : shard Timestamp(4, 3) 
            { "name" : "user1", "age" : 1056645 } -->> { "name" : { "$maxKey" : 1 }, "age" : { "$maxKey" : 1 } } on : sha Timestamp(5, 0) 
  • 查看當前分片中是否均勻的分配到連個shard當中,true是均勻的
    false不是均勻的
mongos> sh.getBalancerState()
true
選擇sharing kes注意點
  • 考慮應該在哪里儲存數(shù)據(jù)闯估?
  • 應該在哪里讀取數(shù)據(jù)灼舍?
  • sharding key 應該是主鍵
  • sharding key 應該你能盡量保證避免分片查詢

sharing 進級

  • 如果sharing 分片不均勻沒有分片均勻
  • sharding : 新增shard和移除shard
mongos> sh.addShard("sha4/192.168.2.10:21001")
Balancer
  • 開啟Balncer
    開啟Balancer之后,chunks之后會自動均分
mongos> sh.startBalancer()
  • 設置Balancer進程運行時間窗口
    默認情況ixaBalancing進程在運行時為降低Balancing進程對系統(tǒng)的影響涨薪,可以設置Balancer進程的運行時間窗口骑素,讓Balancer進程在指定時間窗口操作
#設置時間窗口
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )
  • 查看Balancer運行時間窗口
# 查看Balancer時間窗口
mongos> db.settings.find();
{ "_id" : "balancer", "activeWindow" : { "start" : "23:00", "stop" : "6:00" }, "stopped" : false }

mongos> sh.getBalancerWindow()
{ "start" : "23:00", "stop" : "6:00" }
  • 刪除Balancer進程運行時間窗口
 mongos> db.settings.update({ "_id" : "balancer" }, { $unset : { activeWindow : 1 }});
mongos> db.settings.find();
{ "_id" : "chunksize", "value" : 10 }
{ "_id" : "balancer", "stopped" : false }
在shell腳本中執(zhí)行mongodb
[root@My-Dev ~]# echo  -e "use zhao \n  db.call.find()" |mongo --port 60001 
Mongodb片鍵的添加
  • 首先進入mongos的的admin數(shù)據(jù)庫中
mongos> use admin
switched to db admin  
mongos> db.runCommand({"enablesharding":"zl"})   #創(chuàng)建zl庫中
{ "ok" : 1 }
mongos> db.runCommand(db.runCommand({"shardcollection":"$ent.t_srvappraise_back","key")
  • 分片腳本
#!/bin/bash
url=10.241.96.155
port=30000
ent=test1

./mongo $url:$port/admin <<EOF
db.runCommand({"enablesharding":"$ent"});
db.runCommand({"shardcollection":"$ent.t_srvappraise_back","key":{"sa_seid":"hashed"}})
exit;
EOF

參考地址

如果大家喜歡我的文章,可以關注個人訂閱號刚夺。歡迎隨時留言献丑、交流。如果想加入微信群的話一起討論的話光督,請加管理員簡棧文化-小助手(lastpass4u)阳距,他會拉你們進群。

簡棧文化服務訂閱號
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末结借,一起剝皮案震驚了整個濱河市筐摘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌船老,老刑警劉巖咖熟,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柳畔,居然都是意外死亡馍管,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門薪韩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來确沸,“玉大人捌锭,你說我怎么就攤上這事÷奚樱” “怎么了观谦?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桨菜。 經(jīng)常有香客問我豁状,道長,這世上最難降的妖魔是什么倒得? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任柿隙,我火速辦了婚禮筋现,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己封寞,他們只是感情好治筒,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布彤叉。 她就那樣靜靜地躺著格了,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挤巡。 梳的紋絲不亂的頭發(fā)上剩彬,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音矿卑,去河邊找鬼喉恋。 笑死,一個胖子當著我的面吹牛母廷,可吹牛的內(nèi)容都是我干的轻黑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琴昆,長吁一口氣:“原來是場噩夢啊……” “哼氓鄙!你這毒婦竟也來了?” 一聲冷哼從身側響起业舍,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤抖拦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舷暮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體态罪,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年下面,在試婚紗的時候發(fā)現(xiàn)自己被綠了复颈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沥割,死狀恐怖耗啦,靈堂內(nèi)的尸體忽然破棺而出凿菩,到底是詐尸還是另有隱情,我是刑警寧澤帜讲,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布蓄髓,位于F島的核電站,受9級特大地震影響舒帮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陡叠,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一玩郊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枉阵,春花似錦译红、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拙徽,卻和暖如春刨沦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膘怕。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工想诅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岛心。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓来破,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忘古。 傳聞我的和親對象是個殘疾皇子徘禁,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容