雖然ES提供了replicas shards的機制來保證數據的完整性不會因爲幾個節點的奔潰而被破壞,但是定期的數據備份以備不時之需依然重要。此外,通過備份與恢復也可實現數據在不同集羣間的遷移(直接複製data目錄下的索引文件的做法我嘗試過,但沒有成功)。
備份的方式在 官方文檔 裏有清楚的交代:先創建倉庫(repository),再往倉庫裏添加一個快照(snapshot),查看備份狀態,搞定。雖然官方文檔很輕描淡寫,但我在第一步就卡住了,創建倉庫時需要一個共享文件系統(每個ES節點都需要能訪問),我只是想把數據從線上集羣遷移到線下進行更全面的測試,爲了這麼點事去找系統部走流程等待共享服務器是多麼頭疼啊……
一陣Google之後,決定使用sshfs在ES集羣中每個節點的相同位置掛載一個共享目錄,以下是操作命令:
// 在每個節點上安裝sshfs
yum install fuse sshfs
// 選定一個節點的一個目錄作爲共享目錄
mkdir /root/backup
// 在每個節點的相同位置創建目錄,並掛載共享目錄
mkdir /mnt/backup
sshfs root@192.168.x.x:/root/backup /mnt/backup -o allow_other
// 測試運行ES的用戶是否有對共享目錄的寫權限
sudo -u elasticsearch touch /mnt/backup/test
這裏最大的坑是寫權限問題,我試過在創建/mnt/backup時把owner改成elasticsearch或者在掛載的時候用-o uid= gid= 這樣參數更改目錄的owner,然並卵……折騰了一下午。最後總算在 stack overflow 找到了這個參數-o allow_other,但其實這樣做比較粗魯,機器上的任何用戶都可以訪問這個目錄了,有更優雅實現方式的同學請賜教。
解決了共享目錄的問題之後,就可以像官方文檔一樣輕描淡寫啦:
// 在_plugin/marvel/sense裏 // 創建倉庫 PUT _snapshot/my_backup { "type": "fs", "settings": { "location": "/mnt/backup", "compress": true } } // 針對具體的index創建快照備份 PUT _snapshot/my_backup/snapshot_test { "indices": "index_1, index_2" } // 查看備份狀態 GET _snapshot/my_backup/snapshot_test/_status
現在可以開始進行遷移了:
// 備份創建好之後,在共享目錄/root/backup裏是這樣的: -rw-r--r-- 1 root root 31 12月 15 22:14 index drwxr-xr-x 3 root root 4096 12月 15 22:14 indices -rw-r--r-- 1 root root 83 12月 15 22:14 metadata-snapshot_test -rw-r--r-- 1 root root 181 12月 15 22:14 snapshot-snapshot_test // 在遷移目標的集羣上重複上面創建倉庫的操作 // 將源集羣的備份內容(/root/backup裏的所有文件),複製到遷移目標的集羣倉庫目錄裏 // 在sense中使用RESTful API進行備份的恢復 POST _snapshot/my_backup/snapshot_test/_restore // 查看恢復的狀態 GET _snapshot/my_backup/snapshot_test/_status
以上就是參照官方文檔實施的ES數據備份與遷移,希望對大家有幫助,歡迎留言與交流。