最低要求的角色:超級管理員(所謂超級管理員就是 admin)
可以通過兩種方式從集群中刪除主機:
- 使用 Cloudera Manager 刪除;
- 從集群 A 中刪除主機,將其提供給由 Cloudera Manager 管理的其他集群;
兩種方法都會涉及退役主機(decommission)、刪除角色(role)、刪除托管服務軟件(service),但最終都會保留數據目錄。
使用 Cloudera Manager 刪除主機
- 在 Cloudera Manager 管理控制臺中,單擊
Hosts
選項卡,在All Hots
中:
- 選擇要刪除的主機;
- 選擇 Actions for Selected > Decommission;
這里需要注意 3 點:
- 尤其是運行了 hdfs datanode、kafka broker 這樣的數據節點,退役節點所需時間和數據量線性正相關;
- 請勿同時下線 2 臺或者以上的數據節點,可能會造成數據丟失;
- 必須要等待這一步執行完成才可以進行下一步操作;
- 停止 cloudera-scm-agent:
pssh -h list_cm_agent "sudo systemctl stop cloudera-scm-agent"
- 確認進程停止:
pssh -h list_cm_agent -P "ps aux | grep 'cloudera-scm-agent.pid' | grep -v grep"
- 在 Cloudera Manager 管理控制臺中,單擊
Hosts
選項卡; - 重新選擇步驟 2 中選擇的主機;
- 選擇 Actions for Selected > Delete;
從集群中刪除主機
該操作可以把節點從集群中挪走,但是保留 Cloudera 管理服務角色(如 ServiceMonitor 等)。
- 在 Cloudera Manager 管理控制臺中,單擊
Hosts
選項卡; - 選擇要刪除的主機;
- 選擇 Actions for Selected > Remove From Cluster 。將顯示 "Remove Hosts From Cluster" 對話框;
- 跳過移除 Cloudera 管理服務角色的步驟,單擊 "Confirm" 以完成刪除選定的主機;
常見問題
Q:如果沒有按照如上步驟正確刪除主機,可能會導致主機仍然在 All Hosts
列表中,但是實際已經下線。這樣走 7180 endpoint 的監控腳本就會產生誤報,類似信息大致如下:
HOST_AGENT_LOG_DIRECTORY_FREE_SPACE=NOT_AVAILABLE, HOST_AGENT_PARCEL_DIRECTORY_FREE_SPACE=NOT_AVAILABLE, HOST_AGENT_PROCESS_DIRECTORY_FREE_SPACE=NOT_AVAILABLE, HOST_CLOCK_OFFSET=NOT_AVAILABLE, HOST_DNS_RESOLUTION=NOT_AVAILABLE, HOST_MEMORY_SWAPPING=NOT_AVAILABLE, HOST_NETWORK_FRAME_ERRORS=NOT_AVAILABLE, HOST_NETWORK_INTERFACES_SLOW_MODE=NOT_AVAILABLE, HOST_SCM_HEALTH=BAD
A:對于 CM Manager 來說,它會把主機元數據全部存放在 DB 里,對應的表為 ${DATABASE}.HOSTS
,我們只要刪除對應的僵尸機器記錄即可,數據庫名稱一般是默認的 cm
:
DELETE FROM cm.HOSTS WHERE HOST_ID='${HOST_ID}';
但是可能會因為之前執行過的指令和該行記錄產生了外鍵依賴而刪除不了,報類似外鍵依賴的錯,那么就首先需要刪除對應的 COMMANDS
表的記錄:
DELETE FROM cm.AUDITS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.CLIENT_CONFIGS_TO_HOSTS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.COMMANDS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.COMMANDS_SCHEDULES WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.CONFIGS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.CONFIGS_AUD WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.HOSTS_AUD WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.PROCESSES WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.ROLES WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.ROLES_AUD WHERE HOST_ID='${HOST_ID}';
然后再執行刪除:
SET FOREIGN_KEY_CHECKS = 0
DELETE FROM cm.HOSTS WHERE HOST_ID='${HOST_ID}';
SET FOREIGN_KEY_CHECKS = 1