亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

深入理解MongoDB分片的管理

2020-03-14 13:07:06
字體:
來源:轉載
供稿:網友

前言

在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一種水平擴展數據庫系統性能的方法,能夠將數據集分布式存儲在不同的分片(shard)上,每個分片只保存數據集的一部分,MongoDB保證各個分片之間不會有重復的數據,所有分片保存的數據之和就是完整的數據集。分片集群將數據集分布式存儲,能夠將負載分攤到多個分片上,每個分片只負責讀寫一部分數據,充分利用了各個shard的系統資源,提高數據庫系統的吞吐量。

數據集被拆分成數據塊(chunk),每個數據塊包含多個doc,數據塊分布式存儲在分片集群中。MongoDB負責追蹤數據塊在shard上的分布信息,每個分片存儲哪些數據塊,叫做分片的元數據,保存在config server上的數據庫 config中,一般使用3臺config server,所有config server中的config數據庫必須完全相同。通過mongos能夠直接訪問數據庫config,查看分片的元數據;mongo shell 提供 sh 輔助函數,能夠安全地查看分片集群的元數據信息。

mongodb分片原理,mongodb,刪除分片,mongodb分片策略

對任何一個shard進行查詢,只會獲取collection在當前分片上的數據子集,不是整個數據集。Application 只需要連接到mongos,對其進行的讀寫操作,mongos自動將讀寫請求路由到相應的shard。MongoDB通過mongos將分片的底層實現對Application透明,在Application看來,訪問的是整個數據集。

一,主分片

在分片集群中,不是每個集合都會分布式存儲,只有使用sh.shardCollection()顯式將collection分片后,該集合才會分布式存儲在不同的shard中。對于非分片集合(un-sharded collection),其數據只會存儲在主分片(Primary shard)中,默認情況下,主分片是指數據庫最初創建的shard,用于存儲該數據庫中非分片集合的數據。每個數據庫都有一個主分片。

Each database in a sharded cluster has a primary shard that holds all the un-sharded collections for that database. Each database has its own primary shard.

例如,一個分片集群有三個分片:shard1,shard2,shard3,在分片shard1創建一個數據庫blog。如果將數據庫bolg分片,那么MongoDB會自動在shard2,shard3上創建一個結構相同的數據庫blog,數據庫blog的Primary Shard是Shard1。

圖示,Collection2的主分片是ShardA。

mongodb分片原理,mongodb,刪除分片,mongodb分片策略

使用 movePrimary命令變更數據庫默認的Primary shard,非分片集合將會從當前shard移動到新的主分片。

db.runCommand( { movePrimary : "test", to : "shard0001" } )

在使用movePrimary命令變更數據庫的主分片之后,config server中的配置信息是最新的,mongos緩存的配置信息變得過時了。MongoDB提供命令:flushRouterConfig 強制mongos從config server獲取最新的配置信息,刷新mongos的緩存。

db.adminCommand({"flushRouterConfig":1})

二,分片的元數據

不要直接到config server上查看分片集群的元數據信息,這些數據非常重要,安全的方式是通過mongos連接到config數據查看,或者使用sh輔助函數查看。

使用sh輔助函數查看

sh.status()

連接到mongos查看config數據庫中的集合

mongos> use config

1,shards 集合保存分片信息

db.shards.find()

shard的數據存儲在host指定的 replica set 或 standalone mongod中。

{ "_id" : "shard_name", "host" : "replica_set_name/host:port", "tag":[shard_tag1,shard_tag2] }

2,databases集合保存分片集群中所有數據庫的信息,不管數據庫是否分片

db.databases.find()

如果在數據庫上執行sh.enableSharding(“db_name”) ,那么字段partitioned字段值就是true;primary 字段指定數據庫的主分片(primary shard)。

{ "_id" : "test", "primary" : "rs0", "partitioned" : true}

3,collections集合保存所有已分片集合的信息,不包括非分片集合(un-sharded collections)

key是:分片的片鍵

db.collections.find(){ "_id" : "test.foo", "lastmodEpoch" : ObjectId("57dcd4899bd7f7111ec15f16"), "lastmod" : ISODate("1970-02-19T17:02:47.296Z"), "dropped" : false, "key" : {  "_id" : 1 }, "unique" : true}

4,chunks 集合保存數據塊信息,

ns:分片的集合,結構是:db_name.collection_name

min 和 max: 片鍵的最小值和最大值

shard:塊所在的分片

db.chunks.find(){ "_id" : "test.foo-_id_MinKey", "lastmod" : Timestamp(1, 1), "lastmodEpoch" : ObjectId("57dcd4899bd7f7111ec15f16"), "ns" : "test.foo", "min" : {  "_id" : 1 }, "max" : {  "_id" : 3087 }, "shard" : "rs0"}

5,changelog集合記錄分片集群的操作,包括chunk的拆分和遷移操作,Shard的增加或刪除操作

what 字段:表示操作的類型,例如:multi-split表示chunk的拆分,

"what" : "addShard","what" : "shardCollection.start","what" : "shardCollection.end", "what" : "multi-split",

6,tags 記錄shard的tag和對應的片鍵范圍

{ "_id" : { "ns" : "records.users", "min" : { "zipcode" : "10001" } }, "ns" : "records.users", "min" : { "zipcode" : "10001" }, "max" : { "zipcode" : "10281" }, "tag" : "NYC"}

7,settings 集合記錄均衡器狀態和chunk的大小,默認的chunk size是64MB。

{ "_id" : "chunksize", "value" : 64 }{ "_id" : "balancer", "stopped" : false }

8,locks 集合記錄分布鎖(distributed lock),保證只有一個mongos 實例能夠在分片集群中執行管理任務。

mongos在擔任balancer時,會獲取一個分布鎖,并向config.locks中插入一條doc。

The locks collection stores a distributed lock. This ensures that only one mongos instance can perform administrative tasks on the cluster at once. The mongos acting as balancer takes a lock by inserting a document resembling the following into the locks collection.

{ "_id" : "balancer", "process" : "example.net:40000:1350402818:16807", "state" : 2, "ts" : ObjectId("507daeedf40e1879df62e5f3"), "when" : ISODate("2012-10-16T19:01:01.593Z"), "who" : "example.net:40000:1350402818:16807:Balancer:282475249", "why" : "doing balance round"}

三,刪除分片

刪除分片時,必須確保該分片上的數據被移動到其他分片中,對于以分片的集合,使用均衡器來遷移數據塊,對于非分片的集合,必須修改集合的主分片。

1,刪除已分片的集合數據

step1,保證均衡器是開啟的

sh.setBalancerState(true);

step2,將已分片的集合全部遷移到其他分片

use admindb.adminCommand({"removeShard":"shard_name"})

removeShard命令會將數據塊從當前分片上遷移到其他分片上去,如果分片上的數據塊比較多,遷移過程可能耗時很長。

step3,檢查數據塊遷移的狀態

use admindb.runCommand( { removeShard: "shard_name" } )

使用removeShard命令能夠查看數據塊遷移的狀態,remaining 字段表示剩余數據塊的數量

{  "msg" : "draining ongoing", "state" : "ongoing", "remaining" : {  "chunks" : 42,  "dbs" : 1 }, "ok" : 1}

step4,數據塊完成遷移

use admindb.runCommand( { removeShard: "shard_name" } ){ "msg" : "removeshard completed successfully", "state" : "completed", "shard" : "shard_name", "ok" : 1}

2,刪除未分片的數據庫

step1,查看未分片的數據庫

未分片的數據庫,包括兩部分:

     1、數據庫未被分片,該數據沒有使用sh.enableSharding(“db_name”) ,在數據庫config中,該數據庫的partitioned字段是false

     2、數據庫中存在collection未被分片,即當前的分片是該集合的主分片

use configdb.databases.find({$or:[{"partitioned":false},{"primary":"shard_name"}]})

對于partitioned=false的數據庫,其數據全部保存在當前shard中;對于partitioned=true,primary=”shard_name“的數據庫,表示存在未分片(un-sharded collection)存儲在該數據庫中,必須變更這些集合的主分片。

step2,修改數據庫的主分片

db.runCommand( { movePrimary: "db_name", to: "new_shard" })

四,增加分片

由于分片存儲的是數據集的一部分,為了保證數據的高可用性,推薦使用Replica Set作為shard,即使Replica Set中只包含一個成員。連接到mongos,使用sh輔助函數增加分片。

sh.addShard("replica_set_name/host:port")

不推薦將standalone mongod作為shard

sh.addShard("host:port")

五,特大塊

在有些情況下,chunk會持續增長,超出chunk size的限制,成為特大塊(jumbo chunk),出現特大塊的原因是chunk中的所有doc使用同一個片鍵(shard key),導致MongoDB無法拆分該chunk,如果該chunk持續增長,將會導致chunk的分布不均勻,成為性能瓶頸。

在chunk遷移時,存在限制:每個chunk的大小不能超過2.5萬條doc,或者1.3倍于配置值。chunk size默認的配置值是64MB,超過限制的chunk會被MongoDB標記為特大塊(jumbo chunk),MongoDB不能將特大塊遷移到其他shard上。

MongoDB cannot move a chunk if the number of documents in the chunk exceeds either 250000 documents or 1.3 times the result of dividing the configured chunk size by the average document size.

1,查看特大塊

使用sh.status(),能夠發現特大塊,特大塊的后面存在 jumbo 標志

 { "x" : 2 } -->> { "x" : 3 } on : shard-a Timestamp(2, 2) jumbo

2,分發特大塊

特大塊不能拆分,不能通過均衡器自動分發,必須手動分發。

step1,關閉均衡器

sh.setBalancerState(false)

step2,增大Chunk Size的配置值

由于MongoDB不允許移動大小超出限制的特大塊,因此,必須臨時增加chunk size的配置值,再將特大塊均衡地分發到分片集群中。

use configdb.settings.save({"_id":"chunksize","value":"1024"})

step3,移動特大塊

sh.moveChunk("db_name.collection_name",{sharded_filed:"value_in_chunk"},"new_shard_name")

step4,啟用均衡器

sh.setBalancerState(true)

step5,刷新mongos的配置緩存

強制mongos從config server同步配置信息,并刷新緩存。

use admindb.adminCommand({ flushRouterConfig: 1 } )

六,均衡器

均衡器是由mongos轉變的,就是說,mongos不僅負責將查詢路由到相應的shard上,還要負責數據塊的均衡。一般情況下,MongoDB會自動處理數據均衡,通過config.settings能夠查看balancer的狀態,或通過sh輔助函數查看

sh.getBalancerState()

返回true,表示均衡器在正運行,系統自動處理數據均衡,使用sh輔助函數能夠關閉balancer

sh.setBalancerState(false)

balancer不能立即終止正在運行的塊遷移操作,在mongos轉變為balancer時,會申請一個balancer lock,查看config.locks 集合,

use configdb.locks.find({"_id":"balancer"})--or sh.isBalancerRunning()

如果state=2,表示balancer正處于活躍狀態,如果state=0,表示balancer已被關閉。

均衡過程實際上是將數據塊從一個shard遷移到其他shard,或者先將一個大的chunk拆分小的chunk,再將小塊遷移到其他shard上,塊的遷移和拆分都會增加系統的IO負載,最好將均衡器的活躍時間限制在系統空閑時進行,可以設置balancer的活躍時間窗口,限制balancer在指定的時間區間內進行數據塊的拆分和遷移操作。

use configdb.settings.update(  {"_id":"balancer"},  "$set":{"activeWindow":{"start":"23:00","stop":"04:00"}}),  true)

均衡器拆分和移動的對象是chunk,均衡器只保證chunk數量在各個shard上是均衡的,至于每個chunk包含的doc數量,并不一定是均衡的。可能存在一些chunk包含的doc數量很多,而有些chunk包含的doc數量很少,甚至不包含任何doc。因此,應該慎重選擇分片的索引鍵,即片鍵,如果一個字段既能滿足絕大多數查詢的需求,又能使doc數量均勻分布,那么該字段是片鍵的最佳選擇。

總結

以上就是這篇文章的全部內容,希望對大家的學習或者工作帶來一定的幫助,如果有疑問的大家可以留言交流。


注:相關教程知識閱讀請移步到MongoDB頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产另类 国产精品国产免费| 国产一区二区三区网站| 国产精品日韩在线观看| 国产精品久久久久久久久| 欧美极品少妇xxxxⅹ裸体艺术| 欧美日韩亚洲一区二区三区| 亚洲精品国产精品国产自| 亚洲第一视频网站| 亚洲精品乱码久久久久久金桔影视| 久久99国产精品自在自在app| 91美女福利视频高清| 97国产精品视频人人做人人爱| 欧美剧在线观看| 91亚洲国产精品| 国产精品99久久久久久久久| 最近2019年手机中文字幕| 国产999精品久久久| 亚洲开心激情网| 欧美日韩亚洲网| 成人免费福利在线| 国产精品久久久久久久久久ktv| 欧美电影免费播放| 久久久久久久久久av| y97精品国产97久久久久久| 91探花福利精品国产自产在线| 欧美性猛交xxxx富婆弯腰| 琪琪亚洲精品午夜在线| 欧美另类极品videosbest最新版本| 国产欧美日韩免费| 美女黄色丝袜一区| 亚洲欧美中文日韩v在线观看| 久久影视电视剧免费网站| 91色精品视频在线| 日韩精品在线影院| 欧美日韩激情视频8区| 亚洲午夜激情免费视频| 日韩高清电影免费观看完整版| 韩国美女主播一区| 97精品国产91久久久久久| 欧美另类xxx| 一区二区在线免费视频| 亚洲高清一区二| 欧美性猛交xxxx富婆弯腰| 精品福利在线视频| 久久这里只有精品99| 欧美大尺度电影在线观看| 亚洲精品美女久久久| 中文字幕亚洲欧美日韩2019| 国产精品久久久久久中文字| 久久91精品国产91久久久| 欧美久久精品午夜青青大伊人| 欧美激情在线播放| 国产日韩欧美在线播放| 日韩在线视频免费观看高清中文| 日韩av手机在线看| 91久久精品视频| 日本国产高清不卡| 国产精品久久久久久久久影视| 亚洲精品有码在线| 国产亚洲精品久久久久久777| 国内精品免费午夜毛片| 久久成人精品视频| 日韩人在线观看| 亚洲精选一区二区| 尤物九九久久国产精品的分类| 午夜精品久久久久久久99热| 欧美激情欧美激情| 亚洲精品中文字幕有码专区| 欧美人成在线视频| 日本精品视频在线观看| 亚洲精品美女久久久久| 不卡伊人av在线播放| 社区色欧美激情 | 在线不卡国产精品| 国产色综合天天综合网| 午夜精品久久久久久99热软件| 日韩av一卡二卡| 亚洲天堂开心观看| 久久九九免费视频| 国产精品久久久久久久午夜| 国产午夜精品全部视频播放| 国产精品入口日韩视频大尺度| 在线播放国产一区中文字幕剧情欧美| 亚洲欧美国产精品久久久久久久| 国产一区二区三区免费视频| 欧美在线一区二区三区四| 亚洲精品久久久久久久久久久久| 久久久女人电视剧免费播放下载| 原创国产精品91| 久久久国产一区| 国产手机视频精品| 亚洲电影免费观看高清完整版| 97精品国产97久久久久久春色| 亚洲欧美日韩天堂| 欧美激情免费看| 亚洲精品在线91| 亚洲成人精品在线| 亚洲3p在线观看| 亚洲国产精品成人va在线观看| 欧美黑人巨大精品一区二区| 亚洲精品电影网站| 国产欧美一区二区三区久久人妖| 亚洲精品456在线播放狼人| 亚洲欧美国产精品| 在线观看视频99| 揄拍成人国产精品视频| 午夜免费久久久久| 亚洲国产精久久久久久| 色妞久久福利网| 国产精品美女主播在线观看纯欲| 亚洲精品有码在线| 亚洲男女自偷自拍图片另类| 午夜精品一区二区三区在线| 少妇高潮 亚洲精品| 亚洲色图日韩av| 日韩中文第一页| 欧美野外wwwxxx| 久久天天躁狠狠躁夜夜躁| 国产免费亚洲高清| 日韩av在线影视| 欧美日韩激情网| 欧美黄色三级网站| 亚洲国产精品系列| 国产欧美精品久久久| 国产欧美精品va在线观看| 成人97在线观看视频| 亚洲国产另类 国产精品国产免费| 国产aⅴ夜夜欢一区二区三区| 欧美孕妇孕交黑巨大网站| 精品五月天久久| 亚洲欧洲日产国码av系列天堂| 欧美电影免费观看网站| 久久影院中文字幕| 国产日韩亚洲欧美| 精品久久久一区| 国产精欧美一区二区三区| 欧美天天综合色影久久精品| 超碰日本道色综合久久综合| 伦理中文字幕亚洲| 亚洲欧美自拍一区| 亚洲精品不卡在线| 91沈先生在线观看| 亚洲欧洲国产伦综合| 亚洲国产精彩中文乱码av在线播放| 亚洲欧美中文字幕| 性色av一区二区三区红粉影视| 精品二区三区线观看| 97人人爽人人喊人人模波多| 欧美日韩综合视频网址| 日韩最新中文字幕电影免费看| 欧美综合在线第二页| 色哟哟入口国产精品| 日韩欧美国产黄色| 亚洲a在线观看| 国产91ⅴ在线精品免费观看| 亚洲成人av中文字幕| 亚洲丝袜在线视频| 亚洲欧美视频在线| 亚洲小视频在线观看| 在线丨暗呦小u女国产精品| 国产成人av网| 91精品在线播放| 欧美日韩国产一中文字不卡| 18一19gay欧美视频网站|