利用MongoDB 分片集群(Sharded Cluster)實現高性能大數據處理

一、前言

考慮這樣一個場景,有個數據量有10多億數據的設備庫,裡面存放了註冊的設備的信息,並且設備數據還可能會遞增,然後業務集群需要對指定條件的設備群發信息,那麼如何才能高效的來處理這個問題那?

二、思考

2.1 離線分析

為了不影響在線業務,以往需要把一份數據進行多次複製來分別進行業務交易和數據分析的問題,也就是業務交易的數據是在原來的庫,而數據分析是通過手段把原來庫數據定時同步到另外的存儲設備離線分析。上面所說消息群發設備就可以使用這種方式,首先全量把數據同步到另外的存儲設備,然後在定時把原來庫裡面的新數據增量到存儲設備。

2.2 離線庫

2.2.1 阿里雲產品mondb介紹

對於存儲設備可以選擇阿里雲產品MongoDB,原因是MongoDB 分片集群(Sharded Cluster)通過將數據分散存儲到多個分片(Shard)上來實現高可擴展性。實現分片集群時,MongoDB 引入 Config Server 來存儲集群的元數據,引入 mongos 作為應用訪問的入口,mongos 從 Config Server 讀取路由信息,並將請求路由到後端對應的 Shard 上。下面看下原理圖

利用MongoDB 分片集群(Sharded Cluster)實現高性能大數據處理

image.png

  • 用戶訪問 mongos 跟訪問單個 mongod 類似;

  • 所有 mongos 是對等關係,用戶訪問分片集群可通過任意一個或多個mongos;

  • mongos 本身是無狀態的,可任意擴展,集群的服務能力為“Shard服務能力之和”與“mongos服務能力之和”的最小值;

  • 訪問分片集群時,最好將應用負載均勻的分散到多個 mongos 上。

Sharding Cluster使得集合數據被分散到多個Shard存儲,也就是每個shard存放整體數據的一部分

2.2.2 如何正確地連接分片集群?

所有官方的 MongoDB driver 都支持以 Connection String 的方式來連接 MongoDB 分片集群。

下面就是 Connection String 包含的主要內容:

mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]

  • mongodb:// 前綴,代表這是一個Connection String;

  • username:password@ 如果啟用了鑑權,需要指定用戶密碼;

  • hostX:portX多個 mongos 的地址列表;

  • /database鑑權時,用戶帳號所屬的數據庫;

  • ?options 指定額外的連接選項。

2.2.3 java 代碼訪問

通過 java 來連接的示例代碼如下所示:

MongoClientURI connectionString = new MongoClientURI("mongodb://:****@s-m5e80a9241323604.mongodb.rds.aliyuncs.com:3717,s-m5e053215007f404.mongodb.rds.aliyuncs.com:3717/admin"); // ****替換為root密碼MongoClient client = new MongoClient(connectionString);MongoDatabase database = client.getDatabase("mydb");MongoCollection<Document> collection = database.getCollection("mycoll");

通過上述方式連接分片集群時,客戶端會自動將請求分散到多個 mongos 上,以實現負載均衡;同時,當 URI 裡 mongos 數量在2個及以上時,當有 mongos 故障時,客戶端能自動進行 failover,將請求都分散到狀態正常的 mongos 上。

好吧,言歸正傳,上面知道大數據最後會被分散到不同的shard上,而我們的應用系統是集群,如果能讓集群每臺機器分攤不同shard上的數據進行處理,那麼性能肯定槓槓的,可以嗎?答案是必須的。

mongb上有個config.shards,config.shards集合存儲各個Shard的信息,可通過addShard、removeShard命令來動態的從Sharded cluster裡增加或移除shard。

mongos> db.shards.find(){ "_id" : "mongo-9003", "host" : "mongo-9003/10.1.72.135:9003,10.1.71.136:9003,10.1.72.137:9003" }{ "_id" : "mongo-9004", "host" : "mongo-9004/10.1.72.135:9004,10.1.71.136:9004,10.1.72.137:9004" }

通過config.shards可以獲取所以分片shard的地址然後替換上面的url中host,就可以讓集群系統裡不同機器直接訪問shard上的數據。

利用MongoDB 分片集群(Sharded Cluster)實現高性能大數據處理

image.png

三、總結

使用mongdb的分片機器可以使應用集群中每臺機器去訪問分片機器每個shard上面的數據,從而實現併發處理大數據目的

如果你也想在IT行業拿高薪,可以參加我們的訓練營課程,選擇最適合自己的課程學習,技術大牛親授,7個月後,進入名企拿高薪。我們的課程內容有:Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點。如果你想拿高薪的,想學習的,想就業前景好的,想跟別人競爭能取得優勢的,想進阿里面試但擔心面試不過的,你都可以來,群號為:575745314

注:加群要求

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!

6.小號或者小白之類加群一律不給過,謝謝。

相關推薦

推薦中...