mongo 3.4分片集群系列之八:分片管理

来源:http://www.cnblogs.com/ddbear/archive/2017/12/18/8058038.html
-Advertisement-
Play Games

這個系列大致想跟大家分享以下篇章: 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + ...


這個系列大致想跟大家分享以下篇章:

1、mongo 3.4分片集群系列之一:淺談分片集群

2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全

4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 區域

5、mongo 3.4分片集群系列之五:詳解平衡器

6、mongo 3.4分片集群系列之六:詳解配置資料庫

7、mongo 3.4分片集群系列之七:配置資料庫管理

8、mongo 3.4分片集群系列之八:分片管理

 

 

這篇為實踐篇。

這篇主要分4部分:

          1)  添加分片到一個集群中

          2)  在現有的分片集群移除一個分片

          3)  遷移一個分片集群到不同的硬碟上

          4)  查看集群配置

 

 

在開展這篇實踐篇之前,先說明一下現有集群的架構;

 

用兩個虛擬機模仿兩台伺服器(真實伺服器也按照這個方法實踐,可以行得通)。

IP分別為192.168.209.155和192.168.209.156。其中,這兩個IP之間必須互通。即192.168.209.155可以ping通192.168.209.156,192.168.209.156也可以ping通192.168.209.155。

配置大致如下:(此操作是建立在mongo3.4版本)

名稱

主機

副本集

Data路徑

Log路徑

Router1

192.168.209.155

6666

 

 

 

Router2

192.168.209.156

6666

 

 

 

lConfig1

 

192.168.209.155

6000

 

mongo_config

/mongo_config1/data

/mongo_config1/log

Config2

6001

/mongo_config2/data

/mongo_config2/log

Config3

6002

/mongo_config3/data

/mongo_config3/log

Shard1

192.168.209.155

6100

 

/mongo_shard1/data

/mongo_shard1/log

Shard2

192.168.209.155

6101

 

/mongo_shard2/data

/mongo_shard2/log

Shard4

192.168.209.156

6100

 

/mongo_shard4/data

/mongo_shard4/log

 

1、 添加分片到一個集群中(在192.168.209.155操作)

註意事項:

要添加的分片在192.168.209.155上,埠是6102

1)     為新分片創建文件夾,並創建配置文件

# mkdir –p /mongo_shard3/data

# mkdir –p /mongo_shard3/log

# vim /mongo_shard3/mongo_shard3_secure.conf

配置文件mongo_shard3_secure.conf內容如下:

     

2)     啟動新分片

  # mongod –fork –config /mongo_shard3/mongo_shard3_secure.conf

3)     連接任何一個mongos實例

  # mongo –port 6666

4)     添加分片

  Use admin;

  Sh.addShard(“192.168.209.156:6100”);

2、 在現有的分片集群移除一個分片(在192.168.209.155操作)

註意事項:

刪除分片,對於mongo,並不是簡單的斷開分片集群和分片之間的連接。而是,先把要刪除的分片中的塊,遷移到其他分片中,然後,才會斷開分片與集群之間的連接。以上說的過程是通過一個命令運行,然後mongo系統性自動運行遷移的。這個過程根據網路容量和數據量,可能需要幾分鐘到幾天才能完成。

假設,要移除的塊是shard0002,主機:192.168.209.155:6102

1)     確保分片集群的平衡器是啟用的

連接到mongos實例

# mongo –port 6666

Sh.status()

檢查balancer: currently enabled: 是否是yes。

     

  若是no,則通過sh.setBalancerState(true)命令啟動,啟動後,再通過Sh.status()檢查平衡器的狀態。

2)     從分片中移除塊

這裡已經確定要移除的塊的名稱是shard0002。

若是不確定,可以通過db.adminCommand( { listShards: 1 } )命令查找出所有分片,然後明確要移除塊的分片名稱是什麼。

Use admin;

db.runCommand( { removeShard: "shard0002" } )

註意:這個過程根據網路容量和數據量,可能需要幾分鐘到幾天才能完成。

它會立即返回以下響應,但並不代表移除塊已完成。

{

    "msg" : "draining started successfully",

    "state" : "started",

    "shard" : "shard0002",

    "ok" : 1

}

3)     檢查遷移的狀態,確保分片遷移塊完成

請再次運行以下命令,知道遷移塊完成

Use admin;

db.runCommand( { removeShard: "shard0002" } )

這時,該命令會返回以下的響應:

{

     "msg" : "draining ongoing",

    "state" : "ongoing",

    "remaining" : {

        "chunks" : 42,

        "dbs" : 1

    },

    "ok" : 1

}

繼續執行removeShard命令檢查狀態,直到剩餘的塊數量(remaining.chunks)為0為止。

4)     移動未分片的數據

如果分片是集群中一個或多個資料庫的主分片,則分片將具有未分片的數據。如果分片不是任何資料庫的主分片,請跳到下一個任務, 完成遷移。

在一個集群中,一個資料庫帶有未分片的集合,這些集合只會存儲在一個分片上。該分片成為該資料庫的主分片。(群集中的不同資料庫可以有不同的主分片。)

警告: 在完成分片的塊排除之前(即在剩餘塊的數量還沒有為0之前),請勿執行此程式。

可以在資料庫中,用sh,status()命令確定要移除的分片是否是主分片,在返回的結果文檔中,databases欄位列出了每個資料庫及其主分片。

這裡假設分片shard0002上,只有一個資料庫products,並且該資料庫的主分片剛好是shard0002。現在要將分片shard0002移動到shard0001上。

使用movePrimary 命令,將資料庫移動到另一個分片,這個命令只能一個一個資料庫移動。例如,將資料庫”products”中所有剩餘的未分片數據從 shard0002到shard0001:

  db.runCommand( { movePrimary: "products", to: "shard0001" })

在MongoDB完成移動所有數據之前,此命令不會返回結果,這可能需要很長時間。此命令的響應將類似於以下內容:

  { "primary" : "shard0001", "ok" : 1 }

5)     檢查狀態,確保遷移完全完成

請再次運行以下命令,確保遷移塊完成

Use admin;

db.runCommand( { removeShard: "shard0002" } )

完成時會顯示成功消息:

{

    "msg" : "removeshard completed successfully",

    "state" : "completed",

    "shard" : "shard0002",

    "ok" : 1

}

一旦state欄位的值“completed”,您可以安全地停止包含mongodb0分片的進程。

3、遷移一個分片集群到不同的硬碟上(在192.168.209.155和192.168.209.156操作)

假設要將192.168.209.155上所有分片集群的組件(1個路由,3個配置伺服器,2個分片)遷移到192.168.209.156上。(這裡的分片是單實例,每一個分片都沒有做副本集。分片是否做副本集區別於第(5)步)

原配置:

名稱

主機

副本集

Data路徑

Log路徑

Router1

192.168.209.155

6666

 

 

 

Router2

192.168.209.156

6666

 

 

 

Config1

 

192.168.209.155

6000

 

mongo_config

/mongo_config1/data

/mongo_config1/log

Config2

6001

/mongo_config2/data

/mongo_config2/log

Config3

6002

/mongo_config3/data

/mongo_config3/log

Shard1

192.168.209.155

6100

 

/mongo_shard1/data

/mongo_shard1/log

Shard2

192.168.209.155

6101

 

/mongo_shard2/data

/mongo_shard2/log

Shard4

192.168.209.156

6100

 

/mongo_shard4/data

/mongo_shard4/log

遷移後,綠色字體為有變動的

名稱

主機

副本集

Data路徑

Log路徑

Router1

192.168.209.156

6600

 

 

 

Router2

192.168.209.156

6666

 

 

 

Config1

 

192.168.209.156

6000

 

mongo_config

/mongo_config1/data

/mongo_config1/log

Config2

6001

/mongo_config2/data

/mongo_config2/log

Config3

6002

/mongo_config3/data

/mongo_config3/log

Shard1

192.168.209.156

6101

 

/mongo_shard1/data

/mongo_shard1/log

Shard2

192.168.209.156

6102

 

/mongo_shard2/data

/mongo_shard2/log

Shard4

192.168.209.156

6100

 

/mongo_shard4/data

/mongo_shard4/log

 

1)     在操作分片集群之前,請先在192.168.209.156上創建對應的文件夾和配置文件。(在192.168.209.156操作)

2)     禁用平衡器(在192.168.209.155操作)

連接到mongos實例

# mongo –port 6666

sh.stopBalancer()

3)     單獨遷移每一個配置伺服器(在192.168.209.155和192.168.209.156操作)

由於配置伺服器有3個,config1(主成員),config2,config3,因此,請執行3次3.1)到3.4)4個步驟。先替換非主成員,最後一個才替換主成員。

這裡用config2為例。

3.1)  啟動替換的配置伺服器(在192.168.209.156操作)

  # mongod --fork --config /mongo_config1/mongo_config1_secure.conf

  以上文件是配置伺服器的配置文件,如何設置可以參考mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 中3.2中(1)中2)。

3.2)  將新的配置伺服器添加到副本集(在192.168.209.155操作)

連接到配置伺服器的·主成員config1

# mongo --port 6000

rs.add(“192.168.209.156:6001”);

3.3)  關閉替換的成員(在192.168.209.155操作)

如果更換主成員config1,請先降級主成員,然後再關閉。

降級主成員(用3.2)的視窗繼續操作):

rs.stepDown();

關閉替換的成員(例子還是config2):

# mongo --port 6001

use admin;

db.shutdownServer();

exit;

3.4)  從配置伺服器副本集中刪除要替換的成員(在192.168.209.155操作)

在完成替換配置伺服器的初始同步後(也就是新的配置伺服器已經完全同步了現在配置伺服器)

連接到配置伺服器的·主成員config1

# mongo --port 6000

rs.add(“192.168.209.155:6001”);

4)     重啟mongos實例(在192.168.209.155和192.168.209.156操作)

修改mongos實例的配置伺服器,將sharding.configDB設置為新的IP:port 。以192.168.209.156:6666為例。

原來配置

     

新配置

     

5)     遷移分片(在192.168.209.155和192.168.209.156操作)

這裡提供兩個方法,一個是參照官方文檔的,一個是我用經驗試出來的,後者是暴力的解決方法。不過我確實這麼乾過。在那個迫不得已的時刻,哎,一言道不盡啊。大家可以參考參考,請謹慎操作,僅供學習。

以移動shard1為例:

方法一(參照官方文檔)

在192.168.209.156上添加分片shard1.可以參考上面1、添加分片到一個集群中;

在192.168.209.155上刪除分片shard1. 可以參考上面2、在現有的分片集群移除一個分片;

總之,步驟很多。本人沒有親自實踐過分片副本集的移動,這裡就不闡述了,若是有需要,請參考官方文檔https://docs.mongodb.com/v3.4/tutorial/migrate-sharded-cluster-to-new-hardware/#migrate-the-shards

方法二(很粗暴的方法,僅一家之言,僅供參考)

a)      在192.168.209.155上,先關閉shard1的服務;

b)     將192.168.209.155的shard1對應的文件夾(即/mongo_shard1/)整個文件夾複製到192.168.209.156中,放在/mongo_shard1/

c)      修改配置資料庫

連接到配置資料庫的主節點:

  # mongo –port 6000

  Use config

  db.shards.updateOne({'_id':'shard0000'},{$set:{'host':'192.168.209.156:6101'}})

d)     在192.168.209.156上,修改新shard1的配置文件

將原來155的分片的配置文件,從埠6100修改為6101

e)      在192.168.209.156上,啟動新分片shard1

  # mongo --fork --config /mongo_shard1/mongo_shard1_secure.conf

6)     重啟平衡器(在192.168.209.156操作)

連接到mongos實例

  # mongo –port 6666

  sh.startBalancer()

4、查看集群配置(在192.168.209.156操作)

1)     列出資料庫,確認是否啟用分片

# mongo –port 6666

use config

db.databases.find()

2)     列出分片

use admin

db.runCommand( { listShards : 1 } )

3)     查看集群詳情

sh,status()

 

 --------------------------------------- over ------------------------------------------------------

以上資料,大部分是參考官網的資料,在此表示感謝。

https://docs.mongodb.com/v3.4/tutorial/add-shards-to-shard-cluster/

https://docs.mongodb.com/v3.4/tutorial/remove-shards-from-cluster/

https://docs.mongodb.com/v3.4/tutorial/migrate-sharded-cluster-to-new-hardware/

https://docs.mongodb.com/v3.4/tutorial/view-sharded-cluster-configuration/

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、ls命令 用於查看目錄下的文件信息。 ls 當前目錄下都有哪些文件: -l選項,顯示當前目錄下文件的詳細信息: -a選項,顯示當前目錄下所有文件,包括隱藏文件(名字以'.'開頭): -al選項,顯示當前目錄下所有文件的詳細信息: -alh,顯示當前目錄下所有文件的詳細信息,文件的大小易讀: 指定 ...
  • 前一篇博客關於SQL Server on Linux的安裝,地址:http://www.cnblogs.com/fishparadise/p/8057650.html,現在測試把Windows平臺下的一個資料庫遷移到Linux平臺下。 1. 環境 Windows: Microsoft SQL Ser ...
  • 1. 原始單據與實體之間的關係 === 可以是一對一、一對多、多對多的關係。在一般情況下,它們是一對一的關係:即一張原始單據對應且只對應一個實體。 在特殊情況下,它們可能是一對多或多對一的關係,即一張原始單證對應多個實體,或多張原始單證對應一個實體。 這裡的實體可以理解為基本表。明確這種對應關係後, ...
  • 由於工作需要,從本地Sqlite資料庫轉為MySql資料庫。遇到了一些坑,隨後又埋了。記錄下過程: 一、安裝MySql 首先上官網下載windows版的MySql.解壓。詳情是參考了幾位同鞋的文章: https://www.cnblogs.com/LxyXY/p/7708016.html MySql ...
  • 引言 在上一篇 "大數據學習系列之四 Hadoop+Hive環境搭建圖文詳解(單機)" 和之前的 "大數據學習系列之二 HBase環境搭建(單機)" 中成功搭建了Hive和HBase的環境,併進行了相應的測試。本文主要講的是如何將Hive和HBase進行整合。 Hive和HBase的通信意圖 Hiv ...
  • 一 前言 一直對InnoDB引擎的啟動過程不太瞭解,查資料整理了下InnoDB引擎啟動的過程和關閉過程,後續會整理些有關redo undo 的知識點。 二 思維導圖 三 參考文章 MySQL運維內參 ...
  • SQL Select 語句完整的執行順序:1、from 子句組裝來自不同數據源的數據;2、where 子句基於指定的條件對記錄行進行篩選;3、group by 子句將數據劃分為多個分組;4、使用聚集函數進行計算;5、使用 having 子句篩選分組;6、計算所有的表達式;7、select 的欄位;8... ...
  • 序列 是資料庫生成的一系列數值 1 2 3 4 用於實現id 自增長使用 mySql 實現id 自增長 設置 auto_increment oracle資料庫 藉助於序列 創建序列語法 create sequence 序列名 序列的屬性 nextval --下一個值 currval --當前值 特點... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...