MongoDB sharding遷移那些事(三)

2021-02-23 阿里云云棲號

摘要: 如果不了解 MongoDB Sharded Cluster 原理,請先閱讀 MongoDB Sharded cluster架構原理 關於MongoDB Sharding,你應該知道的 關於 sharding 遷移,會分3個部分來介紹,本文為第三部分 負載均衡及遷移策略 chunk 遷移流程 Ba...

如果不了解 MongoDB Sharded Cluster 原理,請先閱讀

關於 sharding 遷移,會分3個部分來介紹,本文為第三部分

負載均衡及遷移策略

chunk 遷移流程

Balancer 運維管理

在前面2個部分裡,介紹了 MongoDB sharding 的遷移策略以及 chunk 遷移的步驟,本文將主要介紹如何管理 Balancer,以更好的為業務服務。

關閉 Balancer

可能需要關閉 Balancer 場景包括

查看 Balancer 當前狀態

sh.getBalancerState()

關閉 Balancer

sh.stopBalancer()

開啟 Balancer

sh.startBalancer()

說明:本文中提到的命令,都是連接到 sharding cluster 的 mongos 上執行

針對某個集合關閉 Balancer

默認情況下,Balancer 會針對所有分片的集合做負載均衡,如果針對某些特殊集合,不想 Balancer 自動去遷移數據,可以僅針對該集合關閉。

針對 students.grades 集合關閉 Balancer

sh.disableBalancing("students.grades")

針對 students.grades 集合開啟 Balancer

sh.enableBalancing("students.grades")

設置 Balancer 時間窗口

為了儘量避免 chunk 遷移影響業務,可以將 Balancer 設置為只在某個時間窗口內工作,避開業務高峰期,如下命令設置 Balancer 只在凌晨2:00 - 6:00 工作。

use config

db.settings.update(

   { _id: "balancer" },

   { $set: { activeWindow : { start : "02", stop : "06" } } },

   { upsert: true }

)

設置遷移選項

moveChunk 允許用戶自定義遷移數據時,數據寫到目標上的安全級別 (自由的在可靠性和遷移效率間做選擇),通過 writeConcern 的方式來指定。

用戶可以修改_secondaryThrottle 以及 writeConcern 參數,這2個參數需要組合起來使用,意思是如果_secondaryThrottle為 true,則使用 writeConcern 選項來指定遷移時寫數據的策略;如果_secondaryThrottle為 false,則使用{w: 1}, 如下命令將 writeConcern 設置為 {w: majority}。

use config

db.settings.update(

   { "_id" : "balancer" },

   { $set : { "_secondaryThrottle" : true ,

              "writeConcern": { "w": "majority" } } },

   { upsert : true }

)

如果沒有設置,則默認使用 {w: 2} ,要求至少寫到目標2個節點(若目標 shard 是單節點,則退化為{w: 1})。

數據遷移完後,源 shard 需要將遷移完的 chunk 移除,默認情況下,源 shard 會將刪除 chunk 的任務加到一個後臺隊列,在後臺異步刪除,然後 Balancer 就可以啟動下一次的 chunk 遷移。用戶可以設置 _waitForDelete 為 true(默認為 false),讓源 shard 在 chunk 遷移完後同步刪除 chunk 數據。

use config

db.settings.update(

   { "_id" : "balancer" },

   { $set : { "_waitForDelete" : true } },

   { upsert : true }

)

設置 chunkSize

MognoDB sharding 默認 chunkSize 為64MB,默認設置在絕大多數場景都是合適的,在某些場景下,用戶可能需要修改 chunkSize 配置,具體參考關於MongoDB Sharding,你應該知道的 文章裡『關於jumbo chunk及 chunk size』部分,這裡不再贅述。

如下命令將 chunkSize 修改為 100MB

use config

db.settings.save( { _id:"chunksize", value: 100 } )

注意事項

將 chunkSize 改小,後臺需要一定時間來對原來 chunk 進行分裂,將大小降低至新 chunkSize 以下。(如果是 jumbo chunk,則無法分裂)

將 chunkSize 改大,原來的小 chunk 不會自動進行合併,只有新的插入或更新操作才能導致 chunk 大小逐步增大。

chunkSize 可修改的範圍為[1MB, 1024MB]之間。

參考資料

(文中所有標藍部分均可閱讀原文獲取詳情)

這是架構師最好的時代。物聯網、移動、雲計算、大數據、人工智慧等新技術在行業的深入應用不斷驅動著企業IT系統的變遷。作為系統的靈魂,架構師的思想、設計、技能和經驗,影響深遠。峰會將深入分享構師們在高可用、高並發、高性能應用架構搭建與實踐的經驗與心得體會,以及自我驅動成長、Docker帶來的架構設計理念等方面的收穫,幫助更多夥伴學習和成長。

13:20-13:30 【視頻】談架構師自我修養 阿里云云棲社區明星專家們

13:30-13:40 開場 郭雪梅 阿里云云棲社區總編

13:40-14:20 我看分布式系統發展和阿里實踐 林偉 阿里雲大數據計算平臺資深架構師

14:20-15:00 Docker大規模應用帶來的架構設計新挑戰 吳崢濤 螞蟻金服高級技術專家

15:00-15:40 微博混合雲,極端流量下的峰值應對與架構挑戰 王關勝 新浪微博資深運維架構師

15:40-16:20 千萬級用戶直播App服務端架構設計和思考 張華偉 一下科技 技術副總裁

16:20-17:00 基於機器學習的阿里智能助理在電商領域的架構構建與實踐 海青 阿里巴巴高級技術專家

掃碼直入活動頁:

相關焦點

  • MongoDB 常見問題:MongoDB診斷
    ### In a new sharded cluster, why does all data remain on one shard?在新的分片集群中,為什麼所有數據都保留在一個分片上?Your cluster must have sufficient data for sharding to make sense.
  • MongoDB 3.3.10 發布 - OSCHINA - 中文開源技術交流社區
    SERVER-22383  mongo shell should permit mongodbSERVER-23815  Add $bucket aggregation stageSERVER-23830  On RHEL7/Centos7 mongod can't stop if pid location in conf differs from the init.d scriptSERVER-24335  Shell sharding
  • 一文快速入門分庫分表中間件 Sharding-JDBC(必修課)
    現在的 ShardingSphere 不單單是指某個框架而是一個生態圈,這個生態圈 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar 這三款開源的分布式資料庫中間件解決方案所構成
  • MongoDB 如何上手和避坑?
    在網遊界,MongoDB也非常流行,比如說大火的陰陽師,資料庫用的就是MongoDB大數據方面,MongoDB有以下三個優勢:1. 自帶sharding,快速得水平擴展,為存儲海量數據帶來便捷2.停機後冷拷貝7、Mongo大數據遷移方案,遷移過程中需要注意什麼,集群的時候呢?一般來說mongodump來遷移即可。集群遷移的話,建議直接在目標伺服器上面搭建從節點。全部搭建完之後,把新的從節點升級為主節點,再把老機器剔除出集群。不過如果數據量太大,而且平時數據更改很頻繁的話,初始化同步的過程可能Oplog不夠用。
  • MongoDB 不得不知的 12 個知識點
    在網遊界,MongoDB也非常流行,比如說大火的陰陽師,資料庫用的就是MongoDB大數據方面,MongoDB有以下三個優勢:1. 自帶sharding,快速得水平擴展,為存儲海量數據帶來便捷2.A:簡單說一下問題提到的幾個資料庫中,mongodb優勢的地方。vs hbase:hbase是基於row key存儲寬列的一款nosql,乍一看結構類似mongodb的_id主鍵和可變長的列數量。具體的原理和區別這裡不展開。
  • 利用 ShardingSphere-JDBC 實現分庫分表實踐
    true    server.address=10.1.20.96    server.port=8080這是buid.gradle內容,只列舉ShardingSphere相關的:    dependencies {        compile group: 'org.apache.shardingsphere', name: 'sharding-jdbc-spring-boot-starter
  • 不容忽視:MongoDB的JavaScript性能
    【IT168 技術】mongodb使用javascript做shell, mongodb的db.eval可以提供給數據驅動與這種javascript shell類似的js接口。
  • MongoDB安裝筆記
    安裝MongoDB 4.24.1 官網下載從官網下載4.2 網盤下載如果官網下載太慢,可以從網盤下載連結: https://pan.baidu.com/s/1KjL759qM81Ix_ZRZZxdepg 提取碼: yvpi4.3 安裝4.3.1 設置mongo環境變量[root@tfdev
  • MongoDB-CRUD&運維工具介紹以及授權認證
    此功 能支持某些類型的實時遷移,這些遷移要求源伺服器保持聯機並在整個遷移過程中運行。通常,此命令將採用以 下形式:mongooplog - from mongodb0.example.net –host mongodb1.example.net•Mongoperf Mongoperf 是一種獨立於 MongoDB 檢查磁碟 I / O 性能的實用程序。它是隨機磁碟 I / O 的測試並呈現結果。
  • Oppo百萬級高並發mongodb集群性能數十倍提升優化實踐
    checkpoint調整後的值如下:checkpoint=(wait=25,log_size=1GB)2.3.4 存儲引擎優化前後IO對比通過上面三個方面的存儲引擎優化後,磁碟IO開始散列到各個不同的時間點,iostat監控優化後的IO負載如下:
  • pyspark操作MongoDB
    有幾點需要注意的:不要安裝最新的pyspark版本,請安裝`pip3 install pyspark==2.3.2``spark-connector`與平常的MongoDB寫法不同,格式是:`mongodb
  • MongoDB 2.0.6 發布,分布式文檔資料庫
    模式自由(schema-free),意味著對於存儲在mongodb資料庫中的文件,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的文件存儲在同一個資料庫裡。 存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用於唯一標識一個文檔,為字符串類型,而值則可以是各中複雜的文件類型。
  • 不要總是依賴機器 MongoDB擴展彰顯分片功夫
    有一瞬間Node2達到 4000 insert/s的,而那個時刻node5隻有 740 insert/s !為什麼會這樣?我們使用mongoimport監視了整個導入過程發現:開始的一段時間內一切運行的很好,我們的集群也提供了一個很好的吞吐量;但是隨著時間的推移,速度在逐漸的減緩。而通過mongostat,我們不難發現:有時候幾秒內許多節點並沒有分配到任何數據。
  • Reactive-MongoDB異步Java Driver解讀
    在訂閱者成功訂閱到發布者之後,其 onSubscribe(Subscription s) 方法會被調用。Subscription 表示的是當前的訂閱關係。當訂閱成功後,可以使用 Subscription 的 request(long n) 方法來請求發布者發布 n 條數據。發布者可能產生3種不同的消息通知,分別對應 Subscriber 的另外3個回調方法。
  • 當MongoDB遇見Spark
    userid進行分組開發Maven dependency配置這裡用的是mongo-spark-connector_2.11 的2.0.0版本和spark的spark-core_2.11的2.0.2版本:    <dependency>        <groupId>org.mongodb.spark
  • 資料庫中間件 Sharding-JDBC 源碼分析 —— SQL 解析(一)之語法解析
    本文主要基於 Sharding-JDBC 1.5.0 正式版 1. 概述 2. Lexer 詞法解析器 3.
  • mongodb的文檔查詢命令find
    具體表現為:db.col.find().pretty()find和sql的類比1.查詢所有的結果sql:select * from t_usermongodb:db.user.find()2.查詢指定的列sql:select name,age from t_usermongodb:db.user.find({},{'name':1,'age':1})
  • 阿里P8精心整理MongoDB+RabbitMQ+Memcached面試題,100%拿offer
    三、mongodbmongodb是一個基於分布式文件存儲的資料庫,由C++語言編寫。它旨在為WEB應用提供可擴展的高性能數據存儲解決方案,最大的特點是支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
  • MongoDB學習筆記整理,請趕緊收藏起來
    mongodb是最近幾年最火的nosql資料庫,在很多大型企業應用廣泛,今天就一起學習它的用法。花了一周時間,整理下面的學習記錄,希望對大家有所幫助。mongodb1. mongodb的安裝,windows 10可以安裝,一般作為服務都是安裝在Linux伺服器上。
  • mall整合Mongodb實現文檔操作
    Mongodb的安裝和使用1.下載Mongodb安裝包,下載地址:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.21-signed.msi2.選擇安裝路徑進行安裝