from:http://logos.name/archives/515


雖然ES提供了replicas shards的機制來保證數(shù)據(jù)的完整性不會因為幾個節(jié)點的奔潰而被破壞,但是定期的數(shù)據(jù)備份以備不時之需依然重要。此外,通過備份與恢復(fù)也可實現(xiàn)數(shù)據(jù)在不同集群間的遷移(直接復(fù)制data目錄下的索引文件的做法我嘗試過,但沒有成功)。

備份的方式在官方文檔里有清楚的交代:先創(chuàng)建倉庫(repository),再往倉庫里添加一個快照(snapshot),查看備份狀態(tài),搞定。雖然官方文檔很輕描淡寫,但我在第一步就卡住了,創(chuàng)建倉庫時需要一個共享文件系統(tǒng)(每個ES節(jié)點都需要能訪問),我只是想把數(shù)據(jù)從線上集群遷移到線下進行更全面的測試,為了這么點事去找系統(tǒng)部走流程等待共享服務(wù)器是多么頭疼啊……

一陣Google之后,決定使用sshfs在ES集群中每個節(jié)點的相同位置掛載一個共享目錄,以下是操作命令:

1
2
3
4
5
6
7
8
9
10
11
12
// 在每個節(jié)點上安裝sshfs
yum install fuse sshfs
 
// 選定一個節(jié)點的一個目錄作為共享目錄(不要放在系統(tǒng)盤所在目錄)
mkdir /data0/es_backup
 
// 在每個節(jié)點的相同位置創(chuàng)建目錄,并掛載共享目錄
mkdir /mnt/backup
sshfs root@192.168.x.x:/data0/es_backup /mnt/backup -o allow_other
 
// 測試運行ES的用戶是否有對共享目錄的寫權(quán)限
sudo -u elasticsearch touch /mnt/backup/test

這里最大的坑是寫權(quán)限問題,我試過在創(chuàng)建/mnt/backup時把owner改成elasticsearch或者在掛載的時候用-o uid= gid= 這樣參數(shù)更改目錄的owner,然并卵……折騰了一下午。最后總算在stack overflow找到了這個參數(shù)-o allow_other,但其實這樣做比較粗魯,機器上的任何用戶都可以訪問這個目錄了,有更優(yōu)雅實現(xiàn)方式的同學(xué)請賜教。

解決了共享目錄的問題之后,就可以像官方文檔一樣輕描淡寫啦:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 在_plugin/marvel/sense
 
// 創(chuàng)建倉庫
PUT _snapshot/my_backup
{
    "type": "fs",
    "settings": {
        "location": "/mnt/backup",
        "compress": true
    }
}
 
// 針對具體的index創(chuàng)建快照備份
PUT _snapshot/my_backup/snapshot_test
{
    "indices": "index_1, index_2"
}
 
// 查看備份狀態(tài)
GET _snapshot/my_backup/snapshot_test/_status

現(xiàn)在可以開始進行遷移了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 備份創(chuàng)建好之后,在共享目錄/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
 
// 在遷移目標(biāo)的集群上重復(fù)上面創(chuàng)建倉庫的操作
 
// 將源集群的備份內(nèi)容(/data0/es_backup里的所有文件),復(fù)制到遷移目標(biāo)的集群倉庫目錄里
 
// 在sense中使用RESTful API進行備份的恢復(fù)
POST _snapshot/my_backup/snapshot_test/_restore
 
// 查看恢復(fù)的狀態(tài)
GET _snapshot/my_backup/snapshot_test/_status

以上就是參照官方文檔實施的ES數(shù)據(jù)備份與遷移,希望對大家有幫助,歡迎留言與交流。