成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MongoDB從入坑到入迷

運維 數據庫運維 MongoDB
我司是一家正處于高速發展,目前擁有數百萬用戶,年銷售額近五十億的社交電商公司。公司技術部建立之初,為了適應用戶量的高速增長,與業務的不斷變更迭代,在選用數據庫的時候,經過調研對比我們選擇了MongoDB。

背景:我司是一家正處于高速發展,目前擁有數百萬用戶,年銷售額近五十億的社交電商公司。公司技術部建立之初,為了適應用戶量的高速增長,與業務的不斷變更迭代,在選用數據庫的時候,經過調研對比我們選擇了MongoDB。

[[330601]]

是的,你沒看錯,All in MongoDB!

全文大綱:

1. 為什么使用MongoDB(選擇數據的時候我們是怎么考慮的?)

2. MongoDB架構(99.99%高可用,晚上安心睡大覺!)

3. MongoDB 分片(海量數據應對之道!)

4. MongoDB文檔模型介紹(靈活!靈活!靈活!)

1.為什么使用MongoDB

因為我司主要做社交電商的業務,所以對數據庫的性能有一定的要求,加上商品交易是公司主要盈利來源,所以對數據庫的高可用也有一定的要求。

總結一下我們對數據庫的要求:

  • 安全,穩定
  • 高可用
  • 高性能

我們在考慮數據庫選型的時候主要考慮什么?

  • 數據規模
  • 支持讀寫并發量
  • 延遲與吞吐量

從數據規模來說訂單和商品SKU,還有會員信息這些重要的數據記錄肯定會隨著時間源源不斷的增長,所以我們需要的不僅僅是滿足當下要求,更需要為半年一年后海量數據更為方便的擴容做考量!

下面我們從MongoDB的架構,性能,和文檔模型來介紹一下我們選擇MongoDB的理由!

2.MongoDB架構

2.1 關于高可用

數據庫作為系統核心,要保證99.99%的可用性,而高可用的保證來自于MongoDB冗余數據的復制集模式。MongoDB自帶多副本高可用,只需要合理的配置,就能避免單數據庫節點故障導致服務的不可用。

 

圖例說明:

  • 一個Primary主節點,主要接受來自server的讀寫;
  • 兩個Secondary從節點,用于同步來自Primary的數據。

關于高可用:當主節點發生故障的時候,兩個從節點會進行選舉,投票產生一個新的主節點,進而保證服務的可用性。(PS:在選舉過程中數據不可寫入,但是如果Secnondary節點配置可讀,那么此時是可以讀取數據的。)這就是MongoDB的高可用,配置簡單,不需要引入額外的中間件或者插件去輔助數據庫節點間的故障轉移。

2.2 關于選舉算法《分布式一致性算法---raft》

raft協議是在leader節點發生故障或者網絡分區導致腦裂時如何保證分布式數據一致性的一個算法,MongoDB采用了該算法來保證當主節點故障或者網絡分區的情況下,數據的一致性。當然MongoDB用的和raft原版算法肯定會略有不同,MongoDB會采用Secondary向Primary拉數據,而不是Primary向Secondary推數據的方式來減輕Primary的壓力等等有利于數據庫操作的方式對raft進行改進使用。

raft算法動畫演示

http://thesecretlivesofdata.com/raft/

2.3 關于超大規模復制集(集群)

  1.    "_id" : <num>, 
  2.    "host" : <hostname:port>, 
  3.    "arbiterOnly" : false
  4.    "buildIndexes" : true
  5.    "hidden" : false
  6.    "priority" : 0,  // 設置為0 
  7.    "tags" : { 
  8.  
  9.  
  10.    }, 
  11.    "slaveDelay" : NumberLong(0), 
  12.    "votes" : 0  // 設置為0 

MongoDB最多允許50個節點,但是最多只有7個節點有投票權,一個節點可以配置7個無投票權的Non-Voting節點,加上一個Primary節點。

為什么只能允許存在7個投票節點呢?參考2.2小節的raft算法,節點越多,投票時間越長,選舉出來的Primary節點時間也就越長,這個過程中我們是無法進行寫操作的,因為沒有主節點。

那么多非投票節點有什么用呢?大家應該都聽過MySQL的讀寫分離吧,利用讀寫分離來提高數據庫性能。 MongoDB這里其實也可以,Primary用來寫,Secondary用來讀,可以給BI部門一個Secondary,給財務部門一個Secondary,給運營部門一個Secondary······

2.4 WriteConcern

既然我們的數據庫擁有至少超過三個節點(1Primary+2Secondary),Secondary通過同步Primary的數據來保持一致性,那么當我們寫操作的時候,如何保證數據安全的落盤呢?

 

有以下幾種情況:

1. 寫Primary成功,返回客戶端寫成功,Secondary還未同步Primary的時候,Primary掛了,數據丟失!

2. 寫Primary成功,數據同步一個Secondary成功,返回客戶端寫成功。此時Primary掛了,數據不會丟失。但是恰好Primary與同步的Secondary同時掛了,數據丟失!

3. 寫Primary成功,數據同步兩個Secondary成功,返回客戶端寫成功。此時Primary掛了,數據不會丟失。

我們對以上三種情況進行分析:第一種情況有風險會造成數據丟失。第二種情況還是會出現數據丟失,但是數據丟失的概率大大降低。第三種情況是最安全的做法,但是節點數目多了,同步非常耗時,用戶需要等待的時間過長,一般不考慮。

MongoDB在這里推薦折衷方案就是使用Write Concern---在數據可靠性與效率之間的權衡!

  1. db.products.insert
  2.    { item: "envelopes", qty : 100, type: "Clasp" }, 
  3.    { writeConcern: { w: "majority" , wtimeout: 5000 } }  // 設置writeConcern為majority,超時時間為5000毫秒 

3.MongoDB分片

3.1 大規模數據是如何影響數據庫效率的?

數據庫的性能還與數據庫本身規模息息相關。拿關系型數據庫舉例:

  • 查詢百萬表和千萬表甚至過億的表效率相差很大,查詢性能急劇惡化。
  • 插入的時候創建索引可能會引起索引樹的調整與頁分裂。

3.2 面對海量數據如何提升數據讀寫效率?

為了在海量數據中提升數據庫的效率,我們采用分而治之的思想,將大表拆成小表,大庫拆成小庫。

關系型數據庫中我們常用分表分庫來解決:

  • 例如將訂單庫分為在線庫和離線庫,近三個月是在線庫,遠期的訂單數據放入離線庫,這樣在線庫的數據就大大減少,數據庫性能就得到了提升。
  • 又例如當我們的用戶量過多超過千萬行記錄,單表查詢效率下降,我們將一張用戶表拆成多張用戶表,這個就是水平拆分。

MongoDB中我們是如何做的呢?

3.3 MongoDBSharding

 

MongoDB的分片

通過將同一個集合(Collection1)的數據按片鍵(shard keys)分到不同的分片(shard)上面,減少同一個數據文件上的數據量,已達到拆分數據規模的目的。

 

Shard 優勢:在線擴容,動態擴容

Shard:用于存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障。

Config Server:配置服務器 mongod實例,存儲了整個集群的元數據與配置,其中包括 chunk信息,在MongoDB 3.4中,配置服務器必須部署為一個副本集。

Mongos:mongos充當查詢路由器,提供客戶端應用程序和切分集群之間的接口。

服務器插入的數據通過Mongos路由到具體地址,這也是MongoDB的便利之處,不需要自己關注路由,也不需要使用第三方提供的中間件輔助路由,可靠,放心。

 

分片的負載均衡

當我們的MongoDB 副本集變成分片集群后,隨著數據量的增長,各個分片也會越來越大,這里就會出現兩種情況:

1. 冷熱數據,某個分片數據量過大。

2. 數據總量大,分片集群的分片過大。

當出現問題(1)的時候,MongoDB的負載均衡器(Balancer)會自動將大分片中的數據遷往小分片。注意這并不意味我們可以高枕無憂了,恰恰相反,我們應該反思是不是自己片鍵選擇失誤而造成的數據不均勻!因為對分片遷移也是消耗性能的,應用服務器寫一次到Shard B,然后Shard B重寫到Shard C無形之中數據被寫了兩次,這是極大的浪費!

當出現問題(2)的時候,當然是給過大的分片集合添加新的分片以此分攤分片集群的壓力。

注意:MongoDB分片雖然是可在線的,但是多少都會對正常的讀寫操作性能有一定的影響,建議在非繁忙時間段進行分片部署!

4.MongoDB文檔模型介紹

數據庫建模的挑戰在于平衡應用的需要,適合該數據庫引擎發揮的結構以及數據的檢索模式。當我們設計數據模型的時候,需要考慮應用使用數據的情況(查詢,更新,和數據處理)以及該數據本身的結構。

4.1 靈活的Schema

在關系型數據庫中,必須按照確定的表結構去插入數據。但是,由于MongoDB是文檔型數據庫,在插入數據的時候默認并不對此做要求。其表現在于:

同一個集合中不同文檔不一定需要有相同的字段,并且字段類型也可以不同。

在集合中改變文檔的結構,例如增加一個字段,刪除一個字段,或者改變一個字段的類型,只需要對該文檔更新即可。

4.2 舉例1:N模型設計

在電商業務中,一個用戶可能有多個收件人以及收件地址。在關系型數據庫中,我們需要建立聯系人表,地址表,并且將其關聯。但是在MongoDB中,我們只需要一個集合就能將此搞定!

數據關系如下:

  1. // patron document 
  2.    _id: "joe"
  3.    name"Joe Bookreader" 
  4.  
  5.  
  6. // address documents 
  7.    patron_id: "joe", // reference to patron document 
  8.    street: "123 Fake Street"
  9.    city: "Faketon"
  10.    state: "MA"
  11.    zip: "12345" 
  12.  
  13.  
  14.    patron_id: "joe"
  15.    street: "1 Some Other Street"
  16.    city: "Boston"
  17.    state: "MA"
  18.    zip: "12345" 

在MongoDB中我們可以這樣進行設計:

  1.    "_id""joe"
  2.    "name""Joe Bookreader"
  3.    "addresses": [ 
  4.                 { 
  5.                   "street""123 Fake Street"
  6.                   "city""Faketon"
  7.                   "state""MA"
  8.                   "zip""12345" 
  9.                 }, 
  10.                 { 
  11.                   "street""1 Some Other Street"
  12.                   "city""Boston"
  13.                   "state""MA"
  14.                   "zip""12345" 
  15.                 } 
  16.               ] 
  17.  } 

沒錯,以上就是集合中的一個document(文檔),是不是感覺很靈活很方便!你可以在SKU集合中添加分類信息,或者商品標簽,還可以在庫存集合中冗余SKU的基本信息,還可以在訂單集合中冗余部分下單者信息···沒錯,就是這么靈活!這也是我們選擇MongoDB的一個重要原因之一,讓開發者的心智負擔少了很多,不需要成為SQL高手,你也能在MongoDB中寫出性能優異的查詢語句。

當然冗余一時爽,重構火葬場的段子也不是沒聽過,因為過多的冗余最終會造成數據的過于臃腫,性能降低等各種問題,這個要控制住開發者的冗余沖動,也依賴于團隊技術Leader對此的把關。

總結

互聯網業務不是一成不變的,產品和用戶的需求還有市場都一直在變!我們沒有技術實力打造一個能夠適應靈活多變的業務的中臺,但是目前我們可以選擇一個可靠,強大并且靈活的數據庫 -- MongoDB!

作者:唐銀鵬

開源愛好者、Gopher。

從事電商、IM系統 深度研發,MongoDB愛好者,公眾號《從菜鳥到大佬》作者。

本文轉載自微信公眾號「 Mongoing中文社區」,可以通過以下二維碼關注。轉載本文請聯系 Mongoing中文社區公眾號。

 

責任編輯:武曉燕 來源: Mongoing中文社區
相關推薦

2021-03-11 11:01:20

iOS小組件iPhone

2023-10-13 08:23:05

2025-04-22 07:52:59

2025-04-27 01:33:23

MongoDBDocker容器

2025-05-14 08:15:00

MongoDB操作命令Docker

2011-09-05 09:28:58

MySQLMongoDB

2023-09-02 12:52:27

2018-09-06 14:29:13

容器主機存儲

2011-04-01 09:29:52

MySQLMongoDB

2021-07-05 22:32:33

數據倉庫團隊

2016-09-22 15:50:38

JavascriptRedux源碼解析

2022-04-19 14:08:06

大數據云計算數字化轉型

2020-06-04 12:15:37

Go內存池對象池

2021-10-25 05:54:59

SSD固態硬盤存儲

2021-03-25 10:14:10

自動化運營人工智能AIOps

2024-08-15 08:00:00

MongoDB數據庫NoSQL

2020-03-09 17:28:51

NoSQLMongoDB數據庫

2018-03-30 09:45:29

物理機Kubernetes滴滴彈性云

2009-06-10 16:34:49

無線網絡連接故障

2014-01-09 11:09:52

手游創業運營立項
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女激情av| 91高清在线观看 | 五月天激情综合网 | 91porn成人精品 | 欧美一区二区三区四区视频 | 国产精品国产自产拍高清 | 在线播放亚洲 | 91视频大全 | 日韩欧美三区 | 亚洲精品一区二区三区 | 希岛爱理在线 | 国产真实乱全部视频 | 欧美国产精品一区二区三区 | 精品国产乱码久久久久久影片 | 国产精品久久久久一区二区三区 | 国产精品乱码一区二区三区 | 韩日一区二区 | 亚洲成人免费av | 亚洲高清免费视频 | 精品国产视频 | 91成人在线| 人人射人人插 | 91超碰caoporn97人人 | 国产成人精品网站 | 日日操夜夜摸 | 国产成人精品免费视频大全最热 | 日韩免费成人av | 亚洲欧美一区二区三区国产精品 | 亚洲视频免费观看 | 国产成人麻豆免费观看 | 亚洲综合区 | 亚洲综合第一页 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 色播视频在线观看 | 超碰97免费观看 | 国产高清视频一区二区 | 欧美久久久久久久久中文字幕 | 特黄色毛片 | 久久新 | 亚洲精品一区在线观看 | 精品视频一二区 |