Elasticsearch數據遷移與備份

雖然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 1215 22:14 index
drwxr-xr-x 3 root root 4096 1215 22:14 indices
-rw-r--r-- 1 root root   83 1215 22:14 metadata-snapshot_test
-rw-r--r-- 1 root root  181 1215 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數據備份與遷移,希望對大家有幫助,歡迎留言與交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章