from:http://logos.name/archives/515
雖然ES提供了replicas shards的機制來保證數據的完整性不會因為幾個節點的奔潰而被破壞,但是定期的數據備份以備不時之需依然重要。此外,通過備份與恢復也可實現數據在不同集群間的遷移(直接復制data目錄下的索引文件的做法我嘗試過,但沒有成功)。
備份的方式在官方文檔里有清楚的交代:先創建倉庫(repository),再往倉庫里添加一個快照(snapshot),查看備份狀態,搞定。雖然官方文檔很輕描淡寫,但我在第一步就卡住了,創建倉庫時需要一個共享文件系統(每個ES節點都需要能訪問),我只是想把數據從線上集群遷移到線下進行更全面的測試,為了這么點事去找系統部走流程等待共享服務器是多么頭疼啊……
一陣Google之后,決定使用sshfs在ES集群中每個節點的相同位置掛載一個共享目錄,以下是操作命令:
1 2 3 4 5 6 7 8 9 10 11 12 | // 在每個節點上安裝sshfs
yum install fuse sshfs
// 選定一個節點的一個目錄作為共享目錄(不要放在系統盤所在目錄)
mkdir /data0/es_backup
// 在每個節點的相同位置創建目錄,并掛載共享目錄
mkdir /mnt/backup
sshfs root@192.168.x.x: /data0/es_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,但其實這樣做比較粗魯,機器上的任何用戶都可以訪問這個目錄了,有更優雅實現方式的同學請賜教。
解決了共享目錄的問題之后,就可以像官方文檔一樣輕描淡寫啦:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 在_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
|
現在可以開始進行遷移了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 備份創建好之后,在共享目錄 /data0/es_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
// 在遷移目標的集群上重復上面創建倉庫的操作
// 將源集群的備份內容( /data0/es_backup 里的所有文件),復制到遷移目標的集群倉庫目錄里
// 在sense中使用RESTful API進行備份的恢復
POST _snapshot /my_backup/snapshot_test/_restore
// 查看恢復的狀態
GET _snapshot /my_backup/snapshot_test/_status
|
以上就是參照官方文檔實施的ES數據備份與遷移,希望對大家有幫助,歡迎留言與交流。