這個系列大致想跟大家分享以下篇章: 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + ...
這個系列大致想跟大家分享以下篇章:
2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
4、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操作)
註意事項:
-
- 這裡只是簡單的添加分片到一個集群,如果還要考慮安全和區域的內容,請參考mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
- 添加新分片後,平衡器會自動遷移塊,遷移過程需要一段時間,可能會對集群性能造成影響。
要添加的分片在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/