ElasticSearch의 스냅샷을 복구해보는 실험을 진행하기 위해 다른 사람들이 올려놓은 튜토리얼을 참고하였다. 그런데 다들 Local 모드에서 실험을 하여서 2개의 서버로 Cluster가 구성되어 있는 나의 사례와는 방법이 다를 것이라고 생각했고 실제로 그랬다. 아래는 Cluster 환경에서 스냅샷을 복구하는 테스트를 진행한 과정이다. 그래서 ElasticSearch 관련 내용이라기보다는 NFS 구성하는 방법에 대한 내용이 될 것이다.
결론부터 말하면 Local 모드와 다른 점은 스냅샷 리포지토리를 ES의 Node들이 공유가 가능해야 한다는 것이다. 사실 처음 생각하기에도, 각 Node에 스냅샷 파일들을 모두 저장하고 각각의 Node가 자신의 Local Storage에서 스냅샷을 불러오는 것은 비효율적이라는 느낌이 들었다.
참고 : 혹시 몰라서 각 Node마다 똑같은 경로에 스냅샷 파일을 저장하고 테스트를 해봤지만 이렇게 하면 각 Node에서 스냅샷에 접근이 안된다고 에러가 뜬다..
해야할 일은 아래와 같다.
1. elasticsearch.yml 파일에 스냅샷 리포지토리 경로 설정
2. Shared File System 생성
3. Snapshot API를 활용하여 복구
elasticsearch.yml 파일에서 스냅샷 리포지토리의 경로를 설정해주어야 한다. 마지막에 사용할 스냅샷 API에도 리포지토리의 경로에 대한 내용이 들어가긴 하지만 elasticsearch.yml 파일에 스냅샷 리포지토리의 경로가 없으면 에러가 뜬다.
파라미터의 이름은 path.repo이다. 설정한적이 없다면 아마 이 파라미터를 발견할 수 없을 것인데, 새로 만들어주고 경로를 입력하면된다.
path.repo: [<Snapshot Repository 경로>, <Snapshot Repository 경로2>, ..]
나는 NFS(Network File System)에 스냅샷을 저장해서 테스트를 했기 때문에 공유된 Directory의 경로를 입력해주었다.
Elasticsearch의 2개의 Node에 NFS을 구성해주었다. NFS Server는 Masternode가 있는 쪽에 설치해주었다.
먼저 apt를 update해주고
$ sudo apt update
nfs-kernel-server를 설치한다.
$ sudo apt install nfs-kernel-server
설치가 완료되었으면 nfs-server의 상태를 확인할 수 있다.
$ sudo systemctl status nfs-server
정상적으로 nfs-server가 구동되는 것을 확인한 후에 공유 용도로 쓸 Directory를 만들어 주었다. 권한과 소유권도 문제가 없도록 바꾸어주었다.
$ sudo chown nobody:nogroup <공유할 Directory>
$ sudo chmod -R 777 <공유할 Directory>
그 다음 공유할 Directory에 Client가 접근할 수 있도록 '/etc/exports' 파일을 수정해주어야 한다.
<공유할 디렉토리> <client-IP>(rw,sync,no_subtree_check)
여기서 rw는 read와 write를 허용한다는 의미이고, sync는 Disk에 파일이 쓰이기 전에 파일 접근을 막는 것을 의미한다.(허용하려면 async 옵션을 사용) 마지막으로 no_subtree_check는 subtree_check를 하지 않는다는 것을 뜻하는데 subtree_check는 NFS 서버가 Client로부터 접근되었을 때, 공유된 Directory에 접근되었는지를 확인하는 것이다.
참고 : subtree_check는 대부분의 사용사례에서 불필요하며 오히려 문제를 일으킬 가능성이 높다고 한다. https://www.linuxquestions.org/questions/linux-newbie-8/please-explain-me-subtree_check-814080/
/etc/exports 파일 수정이 완료되었으면 아래의 명령어를 입력해 Directory를 공유한다.
$ sudo exportfs -a
NFS Server가 구축이 되었으면 다른 서버에는 NFS Client가 있어야 한다.
nfs-kernel-server가 아닌 nfs-common으로 설치한다.
$ sudo apt update
$ sudo apt install nfs-common
설치가 완료되었으면 NFS Server를 원하는 Directory에 Mount한다.
$ sudo mount <nfs-server 주소>:<공유 Directory 경로> <Mount할 Directory 경로>
Mount까지 성공했으면 공유된 Directory에 파일을 하나 생성해보고 테스트를 할 수 있다.
공유 파일 시스템이 만들어졌으니 이제 스냅샷을 복구할 수 있다.
PUT /_snapshot/my_fs_backup
{
"type": "fs",
"settings": {
"location": "<공유 Directory Path>",
"compress": true
}
}
공유 파일 시스템을 쓰기 때문에 "type"이 "fs"(file system)이다.
참고 : "type"을 url로 하면 url을 통해서 스냅샷을 받아올 수도 있다. 일단 테스트는 NFS를 사용했지만 만약에 실제로 Elasticsearch Cluster를 운영한다면 NFS에 스냅샷을 저장하는 것은 굉장히 번거로울 것이다.
성공하면 Response로 acknowledge가 true로 반환된다.
참고(ES Official Guide) : https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-register-repository.html
하위~