안녕하세요~! 오늘은 Elasticsearch 백업/복원에 대해서 설명하도록 하겠습니다.
엘라스틱서치 버전 : 7.12.0
확인 : Multi-search Head
요건:
현 서버에서 백업서버로 백업파일 옮길때의 방법과 궁금증
2개의 서버에 각각 마스터가 할당이 되어있기때문에 한개의 서버에서 백업을 실행하고 복원서버에 넣는경우
어떠한 일이 벌어지는지에 대한 궁금증
먼저 기존에서 쓰고 있던 IP 43,46에 파일을 백업을 시켜 201서버로 옮기려고합니다.
다른 서버인 201 서버에 마스터 그리고 M/D 형태로 만들었습니다.
각각의 백업 리포지토리를 생산해 주었습니다. 동일한 이름으로 되어있어서 좀더 이해하기 편할거같습니다.
일단 43/46 서버를 백업해보려고합니다.
백업 방법 순서 : 1) 리포지토리 생성 --> 2) 스냅샷 생성 --> 3) 생성한 스냅샷 복원
위에 순서에서 201 서버로 보내려면 추가 작업이 필요합니다.
추가된 백업 방법 순서 : 1) 리포지토리 생성 --> 2) 스냅샷 생성 --> 3) 리포지토리 생성된 경로에서 파일 tar 로 압축
--> 4) scp 이용 서버간 파일 보내기 5) 201서버에서 압축풀고 리포지토리 생성 6) 43/46서버에서 생성된 스냅샷 이름으로 복원
위에 6가지 step으로 진행하겠습니다.
1. 먼저 43/46서버에서 리포지토리 생성을 합니다.
curl -X PUT "본인경로:본인포트번호/_snapshot/생성할리포지토리이름" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"compress": true,
"location": "/home/nurier/es7-1/backup/BackupFile"
}
}
'
location에는 실제로 백업파일이 들어갈 경로를 적어주셔야합니다.
또한 엘라스틱서치에서는 type으로 파일시스템 (fs) 외에 아마존,마소,하둡 파일시스템 저장장소를 택할수도있습니다.
스냅샷이 생성 되어있는지 확인 할수 있는 코드
curl -XGET '본인경로:본인포트/_snapshot/_all?pretty
2. 스냅샷을 생성합니다.
curl -X PUT "본인경로:본인포트/_snapshot/생성된리포지토리이름/스냅샷이름?wait_for_completion=true&pretty" -H 'Content-Type: application/json' -d'
{
"indices": "nacf_2023.02.24",
"ignore_unavailable": true,
"include_global_state": false
}
'
indices 에는 백업할 인덱스의 이름을 적습니다. * 표시로 모든 인덱스를 넣어주실수도 있습니다.
include_global_state 는 Elasticsearch가 스냅샷 또는 복원과 함께 글로벌 클러스터 상태를 포함해야 하느지
여부를 결정합니다.
ignore_unavailable이 ture 되어있고 인덱스가 없으면 스냅샷 요청이 실패합니다.
큐레이터는 존재하는 인덱스만 찾아야 하므로 이는 자주 문제가 되지 않습니다.
3-4. 생성된 리포지토리 tar로 압축하고 다른 서버로 보내기
기존에 백업파일이 없다는 가정하에 원하는 파일만 백업했고 보내는 형태입니다. 혹여나 다른 백업파일들이 존재하고 그 안에 원하는 값만 압축해서 scp 를 사용해서 다른 서버로 보내고 싶으시면 백업리포지토리 경로를 추가하여서 다른곳에 백업을 하시는 방법을 권해드립니다.
백업리포지토리 추가는 config/elasticsearch.yml에서 path.repo : 경로에 ,기준으로 추가하시면 추가가 됩니다.
tar로 압축하기 명령어
최종 경로 BackupFile을 backup.tar이름으로 압축하려고할때
tar -cvf backup.tar BackupFile
tar로 압축 풀기
201서버에서 파일을받았을때 압축풀기
tar -xvf backup.tar
scp로 다른 서버로 보내는 방법 user이름은 파일을 받을 원격서버 id@원격서버주소:/~받은파일경로/
scp -r /경로~/파일이름 user이름@127.0.0.1:/파일받을 경로/
혹시 전송시간이 길어지거나 파일 전송이 끝나기전에 자리를 비울경우 nohup 명령을 같이 써주면 전송중에 로그아웃을 해도
전송이 끊기지 않습니다.
nohup scp -rpc ./* 서버IP@원격주소:/파일 받을 경로
5. 201서버에서 백업 리포지토리를 생성해줍니다.
curl -X PUT "본인경로:본인포트번호/_snapshot/생성할리포지토리이름" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"compress": true,
"location": "/home/nurier/es7-1/backup/BackupFile"
}
}
'
리포지토리 생성되었는지 확인
curl -XGET '본인경로:본인포트/_snapshot/_all?pretty
6.
1) 201서버에서 43/46서버에서 받은 tar 파일을 풀어줍니다.
2) 그 후 리포지토리를 생성해줍니다.
3) 43번서버에서 만든 스냅샷 이름을 똑같이 사용하여 복원을 해줍니다.
curl -XPOST "http://192.168.0.201:9210/_snapshot/bp/43번과동일한스냅샷이름/_restore" -H 'Content-Type: application/json' -d'
{
"indices": "*",
"ignore_unavailable": true,
"include_global_state": false
}'
복구를 할때의 문제점이 있습니다. 201서버에서 현재 존재하는 인덱스의 명의 이름과 43서버에서 복구할때 가지고 있던 인덱스의 이름이 같다면 충돌로 복구가 되지 않습니다 이러한 상황일때는 재인덱싱을 통해서 인덱스의 이름을 변경후에 다시 진행해줘야합니다.
또한 43번과 46번 서버의 그림을 보시면 샤드의 분배가 2개 1개씩 되어있는것을 보실수있습니다.
그래서 43번과 46번의 압축된 파일을 201서버에 풀고 난후 샤드의 개수가 더 많은 서버의 스냅샷 이름으로
저는 복구를 하였습니다.
그렇게 했더니 데이터수가 다 복구 되었습니다. 만약 46번의 서버에 샤드수가 2개 인 상황에서 46번 서버만 복구할경우 총 데이터 수의 2/3만 복구 되는것을 보실수 있을겁니다.
그래서 저는 처음부터 복구를 할때 2개의 파일을 푼 후 리포지토리를 생성 후 샤드 수를 더 많이 배분 받은 46번서버의 스냅샷이름으로 복구합니다. 43번서버로 복구를 하게되면
이러한 오류 구문을 받게됩니다.
(해당 오류 메시지는 스냅샷을 복구하는 동안 인덱스의 일부 데이터가 누락되었거나 손상되었다는 것을 나타냅니다. 이 경우, 스냅샷을 복구할 수 없습니다.)
2개 서버의 파일을 한곳에 넣어 복구를 하게되면
잘 복구가 되는것을 보실수 있습니다. 아마도 43서버에서는 불안정한 파일이 백업되어서 저런 오류가 나오는거같습니다.
'Elasticsearch' 카테고리의 다른 글
Elasticsearch - node repurpose tool to clean up (0) | 2023.02.27 |
---|---|
elasticsearch 클러스터간 검색 (0) | 2023.02.25 |
엘라스틱서치 - BULK (0) | 2022.10.06 |
엘라스틱서치의 기본요소 (0) | 2022.10.05 |
엘라스틱서치 - 분석기 (0) | 2022.09.26 |