自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一次線上事故,我頓悟了MongoDB的精髓

數(shù)據(jù)庫 MongoDB
讓我們一起,一探究竟,繼續(xù)學(xué)習(xí)「MongoDB分片」的理論與實(shí)踐,實(shí)現(xiàn)快速入門,豐富個人簡歷,提升面試level,給自己增加一點(diǎn)談資,秒變面試小達(dá)人,BAT不是夢。

大家好,我是哪吒,最近項目在使用MongoDB作為圖片和文檔的存儲數(shù)據(jù)庫,為啥不直接存MySQL里,還要搭個MongoDB集群,麻不麻煩?

讓我們一起,一探究竟,繼續(xù)學(xué)習(xí)「MongoDB分片」的理論與實(shí)踐,實(shí)現(xiàn)快速入門,豐富個人簡歷,提升面試level,給自己增加一點(diǎn)談資,秒變面試小達(dá)人,BAT不是夢。

三分鐘你將學(xué)會:

  1. 一次MongoDB線上事故的快速解決
  2. 什么是MongoDB分片?
  3. MongoDB如何分片?
  4. 何時分片?
  5. 搭建MongoDB分片服務(wù)器
  6. MongoDB如何追蹤分片集群數(shù)據(jù)?

MongoDB拒絕連接?顯然是MongoDB服務(wù)又掛了。

圖片

連接MongoDB服務(wù)器,一探究竟。

通過ps -aef|grep mongo查看mongo服務(wù)是否還在?不出所料,都不在了。

圖片

大概率是因?yàn)榇疟P滿了。

df -TH查看磁盤空間。

圖片

磁盤100%如何解決?

cd到log目錄下,通過rm -rf *刪除所有日志,再重啟MongoDB。

mongodb啟動異常:about to fork child process, waiting until server is ready for connection

圖片

由于MongoDB是集群部署的,啟動時,會進(jìn)行數(shù)據(jù)同步,可能會比較耗時,性子急的我,怎么能忍,直接Ctrl C,強(qiáng)制停止,然后再重新啟動。

通過ps -aef|grep mongo查看一下進(jìn)程,兩個一樣的進(jìn)程赫然在列。

通過ps -aef|grep mongo | grep -v grep | awk '{print $2}' | xargs kill -9強(qiáng)制停止所有mongo進(jìn)程。

圖片

將data目錄下的 mongod.lock 和 diagnostic.data文件刪掉,再重啟MongoDB,啟動腳本mongos_start.sh(mongod --config data/mongodb.conf),完美解決。

圖片

MongoDB服務(wù)器的部署目錄中都是什么含義呢?它們之間又有什么關(guān)系呢?下面簡單介紹一下MongoDB的分片。

圖片

一、什么是MongoDB分片??

分片是指跨機(jī)器拆分?jǐn)?shù)據(jù)的過程,也可以叫做分區(qū)。

MongoDB支持手動分區(qū),使用這種方法,應(yīng)用程序會維護(hù)到多個不同數(shù)據(jù)庫服務(wù)器端的連接,每個服務(wù)器端都是完全獨(dú)立的。應(yīng)用程序不僅管理不同服務(wù)器上不同數(shù)據(jù)的存儲,還管理在適當(dāng)?shù)姆?wù)器上查詢數(shù)據(jù)。但當(dāng)從集群中添加或刪除節(jié)點(diǎn),或者面對數(shù)據(jù)分布或負(fù)載模式的變化時,難以維護(hù)。

MongoDB支持自動分片,這種方式試圖將數(shù)據(jù)庫架構(gòu)從應(yīng)用程序中抽離出來,并簡化系統(tǒng)管理。MongoDB自動均衡分片上的數(shù)據(jù),使節(jié)點(diǎn)的添加和刪除變得更容易。

MongoDB的分片機(jī)制允許你創(chuàng)建一個由許多分片組成的集群,并將集合中的數(shù)據(jù)分散在集群中,在每個分片上放置數(shù)據(jù)的一個子集。這允許應(yīng)用程序超出單機(jī)服務(wù)器或副本集的資源限制。

分片組成的集群對應(yīng)用程序來說就像一臺單機(jī)服務(wù)器,分片前運(yùn)行一個或多個稱為mongos的路由進(jìn)程,mongos維護(hù)著一個“目錄”,指明了每個分片包含哪些數(shù)據(jù)。應(yīng)用程序可以正常連接到此路由服務(wù)器并發(fā)出請求。路由服務(wù)器知道哪些數(shù)據(jù)在哪個分片上,可以將請求轉(zhuǎn)發(fā)到適當(dāng)?shù)姆制?。如果有對請求的響?yīng),理由服務(wù)器會收集它們,并將它們合并,然后再返回給應(yīng)用程序,對應(yīng)用程序而言,它只知道自己連接到了一個單獨(dú)的mongod。

圖片

二、MongoDB如何分片??

在單臺機(jī)器上快速建立一個集群。首先,使用--nodb和--norc選項啟動mongo shell:mongo --nodb --norc。

使用ShardingTest類創(chuàng)建集群。運(yùn)行如下代碼:

st = ShardingTest({
name:"one-min-shards",
chunkSize:1,
shards:2,
rs:{
nodes:3,
oplogSize:10
},
other:{
enableBalancer:true
}
});

  • name:分片集群的標(biāo)簽。
  • shards:制定了集群由兩個分片組成。
  • rs:將每個分片定義為一組3個節(jié)點(diǎn)的副本集。
  • enableBalancer:在集群啟動后啟用均衡器。

ShardingTest是為了支持服務(wù)器端測試套件設(shè)計的,它在保持盡可能低的資源占用以及建立體系結(jié)構(gòu)相對復(fù)雜的分片集群方面,提供了很多便利。當(dāng)運(yùn)行ShardingTest后,它會創(chuàng)建一個包含兩個分片的集群,每個分片都是一個副本集。同時會對副本集進(jìn)行配置,并使用必要的選項啟動每個節(jié)點(diǎn)以建立復(fù)制協(xié)議。它會啟動一個mongos來管理跨分片的請求,這樣客戶端就可以像與一個獨(dú)立的mongod通信一樣與集群進(jìn)行交互。最后,它會為用于維護(hù)理由表信心的配置服務(wù)器啟動一個額外的副本集,以確保查詢被定向到正確的分片。

分片的主要使用場景是拆分?jǐn)?shù)據(jù)集以解決硬件和成本的限制,或?yàn)閼?yīng)用程序提供更好的性能。

當(dāng)ShardingTest完成集群設(shè)置后,將啟動并運(yùn)行10個進(jìn)程,你可以連接到這些進(jìn)程:兩個副本集(各有3個節(jié)點(diǎn))、一個配置服務(wù)器副本集(3個節(jié)點(diǎn)),以及一個mongos。默認(rèn)情況下,這些進(jìn)程會從20000端口開始。mongos會運(yùn)行在20009端口上。

三、何時分片??

通常情況下,分片用于:

  • 增加可用RAM。
  • 增加可用磁盤空間。
  • 減少服務(wù)器的負(fù)載。
  • 處理單個MongoDB無法承受的吞吐量。

圖片

四、搭建MongoDB分片服務(wù)器?

1、配置服務(wù)器 config進(jìn)程

配置服務(wù)器是集群的大腦,保存著關(guān)于每個服務(wù)器包含哪些數(shù)據(jù)的所有元數(shù)據(jù),因此必須首先創(chuàng)建配置服務(wù)器。配置服務(wù)器非常重要,運(yùn)行時必須啟動日志功能,并確保它的數(shù)據(jù)存儲在非臨時性驅(qū)動器上。

配置服務(wù)器必須在任何一個mongos進(jìn)程之前通過mongod -f config.conf啟動,因?yàn)閙ongos需要從配置服務(wù)器中提取配置信息。

當(dāng)對配置服務(wù)器進(jìn)行寫入時,MongoDB會使用“majority” 的 writeConcern級別;當(dāng)對配置服務(wù)器進(jìn)行讀取時,MongoDB會使用“majority” 的 readConcern級別;

這確保了分片集群元數(shù)據(jù)在不發(fā)生回滾的情況下才會被提交到配置服務(wù)器副本集。它還確保了只有那些不受配置服務(wù)器故障影響的元數(shù)據(jù)才能被讀取。這可以確保所有mongos路由節(jié)點(diǎn)對分片集群中的數(shù)據(jù)組織方式具有一致性。

在服務(wù)器資源方面,配置服務(wù)器應(yīng)該具有充分的網(wǎng)絡(luò)和CPU資源,配置服務(wù)器只保存了集群中數(shù)據(jù)的目錄,因此只需要很少的硬盤存儲資源。

由于配置服務(wù)器的重要性,在進(jìn)行任何集群維護(hù)前,都應(yīng)該先對配置服務(wù)器的數(shù)據(jù)進(jìn)行備份。

2、mongos進(jìn)程

mongos 是路由服務(wù)器,供應(yīng)用程序連接使用。通過mongod -f config.conf啟動路由服務(wù)器,mongos進(jìn)程需要知道配置服務(wù)器的地址,因此需要在config.conf中配置 cnotallow=configReplSet/配置服務(wù)器的三個地址,通過配置logpath,保存MongoDB的日志。

應(yīng)該啟動一定數(shù)量的mongos進(jìn)程,并盡可能將其放在靠近所有分片的位置,這樣可以提高查詢性能。

3、將副本集轉(zhuǎn)換為分片

在依次啟動配置服務(wù)器、路由服務(wù)器后,可以添加分片了,如果之前已經(jīng)存在副本集,那么這個副本集就會成為第一個分片。

從MongoDB 3.4 開始,對于分片集群,分片的mongod實(shí)例必須配置 --shardsvr 選項,也就是在config.conf中添加shardsvr=true,將副本集轉(zhuǎn)換為分片的過程中,需要對副本集的每個成員都重復(fù)以上動作。

將副本集作為分片添加到集群后,就可以將應(yīng)用程序的連接從副本集改為mongos路由服務(wù)器了,并通過設(shè)置防火墻,切斷應(yīng)用程序與分片的直接連接。

4、數(shù)據(jù)分片

(1)如何數(shù)據(jù)分片

假如有一個test數(shù)據(jù)庫,并在name鍵上對worker集合進(jìn)行分片。

  1. 先對數(shù)據(jù)庫進(jìn)行分片,> sh.enableSharding("test")。
  2. 再對集合進(jìn)行分片,sh.shardCollection("test.worker",{"name":1});。

如果worker集合已經(jīng)存在,則必須在name字段上有索引,否則,shardCollection會返回錯誤。如果分片的集合不存在,mongos會自動在name片鍵上創(chuàng)建索引。

shardCollection命令會將集合拆分成多個數(shù)據(jù)塊,MongoDB會在集群中的分片間均勻的分散集合中的數(shù)據(jù)。

五、MongoDB如何追蹤集群數(shù)據(jù)??

1、數(shù)據(jù)塊

因?yàn)镸ongoDB的數(shù)據(jù)量巨大,MongoDB一般會將文檔以數(shù)據(jù)塊的形式進(jìn)行分組,這些數(shù)據(jù)塊是片鍵指定范圍內(nèi)的文檔,MongoDB一般會用一個較小的表來維護(hù)數(shù)據(jù)塊與分片之間的映射關(guān)系。

需要注意:

  1. 塊與塊之間不能重疊。
  2. 一個塊中的文檔數(shù)量過大時,會自動拆分成兩個文檔。
  3. 一個文檔總是屬于且僅屬于一個塊。

2、塊范圍

  1. 新分片的集合中只有一個塊,塊的邊界是負(fù)無窮到正無窮。
  2. 隨著塊的增長,MongoDB會自動將其拆分成兩塊,范圍從負(fù)無窮到value,value到正無窮。范圍較小的塊包含比value小的值,范圍較大的塊包含value和比value大的值。

因此,mongos可以很容易地找到文檔在哪個塊。

3、拆分塊

各個分片的主節(jié)點(diǎn)mongod進(jìn)程會跟蹤它們當(dāng)前的塊,一旦達(dá)到某個閾值,就會檢查該塊是否需要拆分,如果需要拆分,mongod就會從配置服務(wù)器請求全局塊大小配置值,然后執(zhí)行塊拆分并更新配置服務(wù)器上的元數(shù)據(jù)。配置服務(wù)器會創(chuàng)建新的塊文檔,并修改舊塊的范圍。

當(dāng)客戶端寫入一個塊時,mongod會檢查該塊的拆分閾值。

圖片

如果已經(jīng)達(dá)到了拆分閾值,mongod就會向均衡器發(fā)送一個請求,將最頂部的塊進(jìn)行遷移,否則該塊會留在此分片上。

圖片

因?yàn)榫哂邢嗤I的兩個文檔一定會處于相同的塊中,所以只能在片鍵值不同的文檔之間進(jìn)行拆分。

下面文檔如果以readTime分片,是可以的。

但是,如果我讀書讀的比較快,所有書籍在一個月的時間里都讀完了,readTime就會是一樣的了,那就無法分片了。

因此擁有不同的片鍵值在分片時,顯得尤其重要。

{"name":"哪吒編程","book":"Java核心技術(shù)","readTime":"October"}
{"name":"哪吒編程","book":"Java編程思想","readTime":"October"}
{"name":"哪吒編程","book":"深入理解Java虛擬機(jī)","readTime":"October"}
{"name":"哪吒編程","book":"effective java","readTime":"November"}
{"name":"哪吒編程","book":"重構(gòu) 改善既有代碼的設(shè)計","readTime":"November"}
{"name":"哪吒編程","book":"高性能MySQL","readTime":"December"}
{"name":"哪吒編程","book":"Spring技術(shù)內(nèi)幕","readTime":"December"}
{"name":"哪吒編程","book":"重學(xué)Java設(shè)計模式","readTime":"December"}
{"name":"哪吒編程","book":"深入理解高并發(fā)編程","readTime":"January"}
{"name":"哪吒編程","book":"Redis設(shè)計與實(shí)現(xiàn)","readTime":"January"}

分片的前提條件是所有的配置服務(wù)器必須啟動并可以訪問。如果mongod不斷接到對一個塊的寫請求,則它會持續(xù)嘗試拆分該塊并失敗,而這些拆分嘗試會拖慢mongod。mongod反復(fù)嘗試分片卻無法成功分片的過程被稱為「拆分風(fēng)暴」。

圖片

六、均衡器?

均衡器負(fù)責(zé)數(shù)據(jù)的遷移。均衡器會定期檢查分片之間是否存在不均衡,如果存在,就會對塊進(jìn)行遷移。在MongoDB 3.4 以上的版本上,均衡器位于配置服務(wù)器副本集的主節(jié)點(diǎn)成員上。

均衡器是配置服務(wù)器副本集主節(jié)點(diǎn)上的后臺進(jìn)程,它會監(jiān)視每個分片上的塊數(shù)量。只有當(dāng)一個分片上的塊數(shù)量達(dá)到特定遷移閾值時,均衡器才會被激活。

本文轉(zhuǎn)載自微信公眾號「哪吒編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系哪吒編程公眾號。

責(zé)任編輯:姜華 來源: 哪吒編程
相關(guān)推薦

2022-07-11 13:58:14

數(shù)據(jù)庫業(yè)務(wù)流程系統(tǒng)

2022-09-07 09:09:13

高并發(fā)架構(gòu)

2022-06-06 11:31:31

MySQL數(shù)據(jù)查詢

2020-11-16 12:35:25

線程池Java代碼

2025-03-11 08:48:35

JVMOOM事故

2020-08-20 07:37:21

數(shù)據(jù)庫開源框架

2020-10-21 12:10:30

訂單號Java代碼

2022-06-30 19:00:00

高可用KeepalivedLinux

2021-03-05 22:41:55

CDH集群CDH集群

2020-08-24 07:34:39

網(wǎng)絡(luò)超時請求

2022-05-12 09:52:09

網(wǎng)絡(luò)架構(gòu)HTTP跨域保護(hù)機(jī)制

2019-01-16 09:20:42

架構(gòu)設(shè)計JVM FullGC宕機(jī)事故

2020-09-22 08:06:45

代碼事故

2022-09-13 09:50:08

分頁慢查詢

2024-06-04 08:19:34

2023-01-04 18:32:31

線上服務(wù)代碼

2023-12-08 08:23:55

算法題dfs算法二叉樹

2017-11-09 09:06:29

流量暴增優(yōu)化

2022-11-16 08:00:00

雪花算法原理

2021-04-13 08:54:28

dubbo線程池事故排查
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號