Consul 資料備份和還原介紹

在上一篇 使用 Consul Template 達成 Nginx 設定檔的動態更新 中建立完 Consul,但是有個大問題,Consul 大部分資料都不會儲存至實體檔案,不論是 Key/Value, Token, Policies, Roles 等都是,所以只要一把容器(Container)關閉資料就不見了... 本篇就來介紹備份指令。

進入容器:
    
docker exec -it consul /bin/sh
    

建議切換到 /consul 路徑下,因為部分資料就是儲存在這裡,如果有設定 volume 就可以直接在外部取得檔案,刪除後也會保留資料。
    
cd /consul
    

備份

    
consul snapshot save backup.snap
    

如果有開啟 ACL 需要附加 token:
    
consul snapshot save -token 4321abcd-1234-0408-a123-fedcbaabcdef backup.snap
    

顯示備份資料資訊

    
consul snapshot inspect backup.snap
    

範例輸出:
	
 consul snapshot inspect backup.snap
 ID           2-56-1681310938346
 Size         6221
 Index        56
 Term         2
 Version      1

 Type                        Count      Size
 ----                        ----       ----
 Register                    3          2.1KB
 ConnectCA                   1          1.2KB
 ConnectCAProviderState      1          1.1KB
 Index                       20         594B
 Autopilot                   1          199B
 ConnectCAConfig             1          195B
 SystemMetadata              3          191B
 CoordinateBatchUpdate       1          176B
 FederationState             1          139B
 KVS                         2          138B
 ChunkingState               1          12B
 ----                        ----       ----
 Total                                  6.1KB
    

還原

    
consul snapshot restore backup.snap
    
註:需要先切換到備份路徑或是指定檔案路徑

如果有開啟 ACL 一樣需要附加 token:
    
consul snapshot restore -token 4321abcd-1234-0408-a123-fedcbaabcdef backup.snap
    

已開啟 ACL 後缺少 Token 的解決方式

如果開啟 ACL 後重新啟動容器(Container) 會發現 Token 失效,根本無法還原,解決方式就是使用設定檔指定最高權限的 token,如果忘記 token 也可以使用這個方式來替換既有 token

在容器內的 /consul/config/consul-acl.json 檔案新增下面區塊內容即可
    
{
  "acl": {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true,
    "tokens":{
       "initial_management":"4321abcd-1234-0408-a123-fedcbaabcdef"
    }
  }
}
    
註:其他部分應該在開啟 ACL 時就已經新增。

留言