国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數據庫 > MongoDB > 正文

MongoDB分片詳解

2020-10-29 18:44:05
字體:
來源:轉載
供稿:網友

分片是MongoDB的擴展方式,通過分片能夠增加更多的機器來用對不斷增加的負載和數據,還不影響應用.

1.分片簡介

分片是指將數據拆分,將其分散存在不同機器上的過程.有時也叫分區.將數據分散在不同的機器上,不需要功能

強大的大型計算機就可以存儲更多的數據,處理更大的負載.

使用幾乎所有數據庫軟件都能進行手動分片,應用需要維護與若干不同數據庫服務器的連接,每個連接還是完全

獨立的.應用程序管理不同服務器上的不同數據,存儲查村都需要在正確的服務器上進行.這種方法可以很好的工作,但是也

難以維護,比如向集群添加節點或從集群刪除節點都很困難,調整數據分布和負載模式也不輕松.

MongoDB支持自動分片,可以擺脫手動分片的管理.集群自動切分數據,做負載均衡.

 2.MongoDB的自動分片

MongoDB分片的基本思想就是將集合切分成小塊.這些塊分散到若干片里面,每個片只負責總數據的一部分.應用程序不必知道

哪片對應哪些數據,甚至不需要知道數據已經被拆分了,所以在分片之前要運行一個路由進程,進程名mongos,這個路由器知道

所有數據的存放位置,所以應用可以連接它來正常發送請求.對應用來說,它僅知道連接了一個普通的mongod.路由器知道和片的

對應關系,能夠轉發請求到正確的片上.如果請求有了回應,路由器將其收集起來回送給應用.

在沒有分片的時候,客戶端連接mongod進程,分片時客戶端會連接mongos進程.mongos對應用隱藏了分片的細節.

從應用的角度看,分片和不分片沒有區別.所以需要擴展的時候,不必修改應用程序的代碼.

不分片的客戶端連接:

 

分片的客戶端連接:

 

什么時候需要分片:

a.機器的磁盤不夠用了

b.單個mongod已經不能滿足些數據的性能需要了

c.想將大量數據放在內存中提高性能

一般來說,先要從不分片開始,然后在需要的時候將其轉換成分片.

3.片鍵

設置分片時,需要從集合里面選一個鍵,用該鍵的值作為數據拆分的依據.這個鍵成為片鍵.

假設有個文檔集合表示的是人員,如果選擇名字"name"做為片鍵,第一篇可能會存放名字以A-F開頭的文檔.

第二片存G-P開頭的文檔,第三篇存Q-Z的文檔.隨著增加或刪除片,MongoDB會重新平衡數據,是每片的流量比較

均衡,數據量也在合理范圍內(如流量較大的片存放的數據或許會比流量下的片數據要少些)

 4.將已有的集合分片

假設有個存儲日志的集合,現在要分片.我們開啟分片功能,然后告訴MongoDB用"timestamp"作為片鍵,就要所有數據放到

了一個片上.可以隨意插入數據,但總會是在一個片上.

然后,新增一個片.這個片建好并運行了以后,MongoDB就會把集合拆分成兩半,成為塊.每個塊中包含片鍵值在一定

范圍內的所有文檔,假設其中一塊包含時間戳在2011.11.11前的文檔,則另一塊含有2011.11.11以后的文檔.其中

一塊會被移動到新片上.如果新文檔的時間戳在2011.11.11之前,則添加到第一塊,否則添加到第二塊.

 5.遞增片鍵還是隨機片鍵

片鍵的選擇決定了插入操作在片之間的分布.

如果選擇了像"timestamp"這樣的鍵,這個值可能不斷增長,而且沒有太大的間斷,就會將所有數據發送到一個片上

(含有2011.11.11以后日期的那片).如果有添加了新片,再拆分數據,還是會都導入到一臺服務器上.添加了新片,

MongoDB肯能會將2011.11.11以后的拆分成2011.11.11-2021.11.11.如果文檔的時間大于2021.11.11以后,

所有的文檔還會以最后一片插入.這就不適合寫入負載很高情況,但按照片鍵查詢會非常高效.

如果寫入負載比較高,想均勻分散負載到各個片,就得選擇分布均勻的片鍵.日志例子中時間戳的散列值,沒有模式的"logMessage"

都是復合這個條件的.

不論片鍵隨機跳躍還是穩定增加,片鍵的變化很重要.如,如果有個"logLevel"鍵的值只有3種值"DEBUG","WARN","ERROR",

MongoDB無論如何也不能把它作為片鍵將數據分成多于3片(因為只有3個值).如果鍵的變化太少,但又想讓其作為片鍵,

可以把這個鍵與一個變化較大的鍵組合起來,創建一個復合片鍵,如"logLevel"和"timestamp"組合.

選擇片鍵并創建片鍵很像索引,以為二者原理相似.事實上,片鍵也是最常用的索引.

 6.片鍵對操作的影響

最終用戶應該無法區分是否分片,但是要了解選擇不同片鍵情況下的查詢有何不同.

假設還是那個表示人員的集合,按照"name"分片,有3個片,其名字首字母的范圍是A-Z.下面以不同的方式查詢:

db.people.find({"name":"Refactor"})

mongos會將這個查詢直接發送給Q-Z片,獲得響應后,直接轉發給客戶端

db.people.find({"name":{"$lt":"L"}})

mongos會將其先發送給A-F和G-P片,然后將結果轉發給客戶端.

db.people.find().sort({"email":1})

mongos會在所有片上查詢,返回結果時還會做歸并排序,確保結果順序正確.

mongos用游標從各個服務器上獲取數據,所以不必等到全部數據都拿到才向客戶端發送批量結果.

db.people.find({"email":re@msn.cn})

mongos并不追蹤"email"鍵,所以也不知道應該將查詢發給那個片.所以他就向所有片順序發送查詢.

如果是插入文檔,mongos會依據"name"鍵的值,將其發送到相應的片上.

 7.建立分片

建立分片有兩步:啟動實際的服務器,然后決定怎么切分數據.

分片一般會有3個組成部分:

a.片

片就是保存子集合數據的容器,片可是單個的mongod服務器(開發和測試用),也可以是副本集(生產用).所以一片

有多臺服務器,也只能有一個主服務器,其他的服務器保存相同的數據.

b.mongos

mongos就是MongoDB配的路由器進程.它路由所有的請求,然后將結果聚合.它本身并不存儲數據或者配置信息

但會緩存配置服務器的信息.

c.配置服務器

配置服務器存儲了集群的配置信息:數據和片的對應關系.mongos不永久存房數據,所以需要個地方存放分片的配置.

它會從配置服務器獲取同步數據.

 8.啟動服務器

首先要啟動配置服務器和mongos.配置服務器需要先啟動.因為mongos會用到其上的配置信息.

配置服務器的啟動就像普通的mongod一樣

mongod --dbpath "F:/mongo/dbs/config" --port 20000 --logpath "F:/mongo/logs/config/MongoDB.txt" --rest

配置服務器不需要很多的空間和資源(200M實際數據大約占用1kB的配置空間)

 建立mongos進程,一共應用程序連接.這種路由服務器連接數據目錄都不需要,但一定要指明配置服務器的位置:

mongos --port 30000 --configdb 127.0.0.1:20000 --logpath "F:/mongo/logs/mongos/MongoDB.txt"

分片管理通常是通過mongos完成的.

添加片

片就是普通的mongod實例(或副本集)

mongod --dbpath "F:/mongo/dbs/shard" --port 10000 --logpath "F:/mongo/logs/shard/MongoDB.txt" --rest

mongod --dbpath "F:/mongo/dbs/shard1" --port 10001 --logpath "F:/mongo/logs/shard1/MongoDB.txt" --rest

連接剛才啟動的mongos,為集群添加一個片.啟動shell,連接mongos:

確定連接的是mongos而不是mongod,通過addshard命令添加片:

>mongo 127.0.0.1:30000mongos> db.runCommand(... {... "addshard":"127.0.0.1:10000",... "allowLocal":true... }... )Sat Jul 21 10:46:38 uncaught exception: error { "$err" : "can't find a shard toput new db on", "code" : 10185 }mongos> use adminswitched to db adminmongos> db.runCommand(... {... "addshard":"127.0.0.1:10000",... "allowLocal":1... }... ){ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand(... {... "addshard":"127.0.0.1:10001",... "allowLocal":1... }... ){ "shardAdded" : "shard0001", "ok" : 1 }

當在本機運行片的時候,得設定allowLocal鍵為1.MongoDB盡量避免由于錯誤的配置,將集群配置到本地,

所以得讓它知道這僅僅是開發,而且我們很清楚自己在做什么.如果是生產環境中,則要將其部署在不同的機器上.

想添加片的時候,就運行addshard.MongoDB會負責將片集成到集群.

切分數據

MongoDB不會將存儲的每一條數據都直接發布,得先在數據庫和集合的級別將分片功能打開.

如果是連接配置服務器,

E:/mongo/bin>mongo 127.0.0.1:20000MongoDB shell version: 2.0.6connecting to: 127.0.0.1:20000/test> use adminswitched to db admin> db.runCommand({"enablesharding":"test"}){"errmsg" : "no such cmd: enablesharding","bad cmd" : {"enablesharding" : "test"},"ok" : 0}

應該是連接 路由服務器:

db.runCommand({"enablesharding":"test"})//將test數據庫啟用分片功能.

對數據庫分片后,其內部的集合便會存儲到不同的片上,同時也是對這些集合分片的前置條件.

在數據庫級別啟用了分片以后,就可以使用shardcollection命令堆積和進行分片:

db.runCommand({"shardcollection":"test.refactor","key":{"name":1}})//對test數據庫的refactor集合進行分片,片鍵是name

如果現在對refactor集合添加數據,就會依據"name"的值自動分散到各個片上.

9.生產配置

進入生產環境后,需要更健壯的分片方案,成功的構建分片需要如下條件:

多個配置服務器

多個mongos服務器

每個片都是副本集

正確的設置w

健壯的配置

設置多個配置服務器是很簡單的.

設置多個配置服務器和設置一個配置服務器一樣

mongod --dbpath "F:/mongo/dbs/config" --port 20000 --logpath "F:/mongo/logs/config/MongoDB.txt" --restmongod --dbpath "F:/mongo/dbs/config1" --port 20001 --logpath "F:/mongo/logs/config1/MongoDB.txt" --restmongod --dbpath "F:/mongo/dbs/config2" --port 20002 --logpath "F:/mongo/logs/config2/MongoDB.txt" --rest

啟動mongos的時候應將其連接到3個配置服務器上:

mongos --port 30000 --configdb 127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002 --logpath "F:/mongo/logs/mongos/MongoDB.txt"

配置服務器使用的是兩步提交機制,而不是普通的MongoDB的異步復制,來維護集群配置的不同副本.這樣能保證集群的狀態

的一致性.這意味著,某臺配置服務器宕機后,集群的配置信息是只讀的.客戶端還是能夠讀寫,但是只有所有配置服務器備份了

以后才能重新均衡數據.

多個mongos

mongos的數量不受限制,建議針對一個應用服務器只運行一個mongos進程.這樣每個應用服務器就可以與mongos進行

本地回話,如果服務器不工作了,就不會有應用試圖與不存的mongos通話了

健壯的片

生產環境中,每個片都應是副本集,這樣單個服務器壞了,就不會導致整個片失效.用addshard命令就可以將副本集作為片添加,

添加時,只要指定副本集的名稱和種子就行了.

如要添加副本集refactor,其中包含一個服務器127.0.0.1:10000(還有別的服務器),就可以用下列命令將其添加到集群中:

db.runCommand({"addshard":"refactor/127.0.0.1:10000"})

如果127.0.0.1:10000服務器掛了,mongos會知道它所連接的是一個副本集,并會使用新的主節點.

10.管理分片

分片信息主要存放在config數據庫上,這樣就能被任何連接到mongos的進程訪問到了.

配置集合

在shell中連接了mongos,并使用了use config數據庫

a.片

可以在shareds集合中查到所有的片

db.shards.find()

b.數據庫

databases集合含有已經包含在片上的數據庫列表和一些相關信息

db.databases.find()

返回的文檔解釋:

"_id"

表示數據庫名

"partitioned"

表示是否啟用了分片功能

"primary"

這個值與"_id"相對應,表名這個數據的"大本營"在哪里.不論分片與否,數據庫總會有個大本營.要是分片的話,創建數據庫時會

隨機選擇一個片.也就是說,大本營是開始創建數據庫文檔的位置.雖然分片時數據庫也會用到很多別的服務器,但會從這個片開始.

c.塊

塊信息存儲在chunks集合中.這可以看到數據到底是怎么切分到集群中的

db.chunks.find()

分片命令

獲得概要

db.printShardingStatus()

刪除片

用removeshard就能從集群中刪除片.removeshard會把給定片上的所有塊的數據都挪到其他片上

db.runCommand({"removeshard":"127.0.0.1:10001"})

在挪動過程中,removeshard會顯示進程

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
2019中文字幕视频| 一区二区三区四区在线免费视频| 国产精品自产拍在线观看2019 | 国产精品第八页| 国产在线中文字幕| 国产精品一区二区资源| 国产在线视频精品视频免费看| 日本电影全部在线观看网站视频| 精品推荐国产麻豆剧传媒| 国产高清视频在线| 91中文在线| 91在线最新| 色欧美在线观看| 九九热免费视频| 国产一卡2卡3卡免费网站| 奇米影视狠狠狠| 九九热在线观看视频| 国产精品入口麻豆高清| eeuss在线观看| 国产尤物一区二区三区| 国产超碰在线| 蜜桃av在线免费观看| 国产精品亚洲色图| 国产黄在线看| 欧洲有码在线视频| 懂色av中文在线| 中文乱码字幕高清在线观看| 久久国产热视频| 91欧洲在线视精品在亚洲| 日本在线天堂| 国产中文伊人| 亚洲午夜久久久久中文字幕| 狠狠干天天干| 在线激情小视频| 国产美女福利在线| 四虎成人免费| 国产福利三区| 狠狠操天天操夜夜操| jizz在线免费观看| 精品一区二区三区在线成人| 五月亚洲综合| 国产在线视频自拍| 麻豆视频国产| 亚洲欧美中文字幕在线观看| 91福利在线免费| 99在线欧洲视频| 国产视频三级在线观看播放| 国产一区在线视频观看| 麻豆视频国产| 免费视频中文字幕| www久久日com| 欧美精品日韩少妇| www.99色.com| 国产字幕在线看| 国产在线传媒| 国产女主播在线观看| 国产精品久久精品牛牛影视| 国产丝袜精品丝袜| 国产经典av| 中文乱码字幕高清在线观看| 国产一级影片| 国产精品jvid在线观看| 国产香蕉尹人视频在线| 国产精品186在线观看在线播放| 99热在线观看免费| 国产亚洲精品拍拍拍拍拍| 国产视频三级在线观看播放| 国产xxx在线| 在线看黄网址| 国产在线视精品麻豆| 国产精品美女一区二区三区四区| 国产精品久久麻豆| 精品国产一区二区三区久久久狼牙| 国产夫妻视频| 亚洲国产成人综合| 久久精品无码一区二区日韩av| 国产中文字幕网| 国产导航在线| 交视频在线观看国产| 国产精品秘入口| 欧美黑人乱大交| 国产精品麻豆一区二区三区 | 国产情侣高潮对白| 日本在线视频www鲁啊鲁| 国产精品一区二区资源| 在线观看av中文| 国产亚洲精品自在线观看| 一本大道五月香蕉| 久久久久久久久免费视频| 国产日本视频| 免费三级毛片| 在线视频中文字幕久| 国产一二在线观看| 九九久久久2| 亚洲wwwwww| 91啦中文在线| 天天操天天射天天色| 日本一级理论片在线大全| 国产福利视频在线| 国产青青草在线| 国产乱精品一区二区三区| 日本在线视频www鲁啊鲁| 99热播在线观看| 最近中文字幕mv免费高清视频8| 亚洲第一页在线播放| 91在线超碰| 国产精品第八页| 国产精品久久久久久精| 91xxx在线观看| 午夜视频在线观看网站午夜视频在线| 亚洲精品aaaa精品| 午夜在线视频播放| 亚洲www色| 男女午夜视频在线观看| 人人在线视频| 成人欧美亚洲| 国产不卡一卡2卡三卡4卡5卡在线| 国产成人综合亚洲欧美在| 国产一级网站视频在线| 国产三区在线观看| 精品亚洲综合| 亚洲天堂二区| 国产嫩草在线视频| 福利在线国产| 国产成a人亚洲精v品| 性国产高清在线观看| 狠狠操五月天| 伊人国产在线看一| 看成年女人免费午夜视频| 成人日韩欧美| 一区二区免费播放| 国产中文在线观看| 国产激情99| 午夜在线视频| 国产欧美日韩精品综合| av福利在线播放| 久久精品最新免费国产成人| 国产精品久久久久久久牛牛 | 中文字幕高清av| 99中文字幕一区| 国产一级二级在线| 免费中文字幕| 伊人国产在线看一| 啪啪免费视频一区| 国产图片综合| 开心婷婷激情五月| 在线免费国产视频| 国产偷窥洗澡视频| 狠狠干天天爱| 免费午夜一级| 日韩黄色成人| 在线中文字幕视频| 国产成人夜间影院在线观看| 天堂在线免费视频| 福利在线国产| 久久91精品视频| av在线官网| av在线free| 91精品专区| 国产人成在线观看| 激情丁香在线| sese在线视频| 欧美日韩**字幕一区| 天天草天天草| 麻豆精品传媒视频观看| 青娱乐在线视频观看| 色吊丝av中文字幕| 欧美日韩不卡中文字幕在线| 青青草原国产在线观看| 日本免费不卡| 国产在线视频福利| 国产麻豆一区二区三区精品 | 超碰免费在线播放| 久久综合精品视频| 高清色视频在线观看| 激情六月丁香| 国产人成精品| 91精品大全| 亚洲wwwwww| 黄污在线观看| 国产深夜福利| 国产黄网站在线观看| 精品精品导航| 免费女人毛片视频| 成年人在线观看| 精品免费视频一卡2卡三卡4卡不卡| 中文字幕在线资源| 国产网站免费观看| 99热国产在线| 久久久久久日本一区99| 国产网红在线| 欧美性猛交xxxx免费看久久| 成人精品福利| 国产福利片在线| 开心丁香婷婷深爱五月| 国产区高清在线| 任你操在线观看| 国产精品扒开做爽爽爽的视频| 亚洲激情丁香| 国产精品欧美色图|