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 를 사용해서 다른 서버로 보내고 싶으시면 백업리포지토리 경로를 추가하여서 다른곳에 백업을 하시는 방법을 권해드립니다.
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@원격주소:/파일 받을 경로
엘라스틱서치에서는 crud 형태로 데이터 값을 하나하나 도큐먼트의 넣는 방식보다 bulk로 한번에 요청하는 것이 효율적입니다.
bulk API는 도큐먼트 읽기는 지원하지 않고 도큐먼트 생성/수정/삭제만 지원합니다.
bulk 데이터 삭제는 한줄로 작성하고 나머지 작업들은 두줄로 작성이 됩니다. 각 줄 사이에는 쉼표 등 별도의 구분자가 없고 라인 사이 공백을 허용하지 않는다 또한 JSON 문법 처럼 보이지만 복수의 JSON 구조를 줄바꿈 문자열로 구분하는 NDJSON형태입니다. json과 비슷하지만 문법이 조금 다르니 라인이나 쉼표 사용에 주의해야합니다.
벌크 데이터를 파일 형태로 만들어서 적용하는 방법도 있다 실제 현업에서는 파일로 만들어서 사용하는 방식이 더 실용적입니다. (키바나 콘솔에서는 파일 불러오기를 할 수 없습니다)
REST API 는 REpresentational State Transfer 의 약자로 웹(HTTP)의 장점을 이용해 리소스를 주고받는 형태이며, REST API는 REST 기반으로 API를 서비스하는 것을 의미합니다. 메소드와 경로가 합쳐진 형태이고 4가지 메소드를 표현할수 있습니다.
POST GET PUT DELETE (CRUD)라고도 흔히 알고 있습니다. 다시 말하면 네 가지 메소드 타입을 가지고 리소소의 CRUD(생성/읽기/수정/삭제) 작업을 진행하고 URI 는 리소스를 명시하는 방법입니다. 즉 URI로 리소스를 정의하고 메소드와 함꼐 서버에 요청하고 응답을 받는 구조입니다.
인덱스와 도큐먼트
엘라스틱서치에서는 인덱스와 도큐먼트가 매우 중요합니다. 그 이유인즉슨, 인덱스는 도큐먼트를 저장하는 논리적 구분자이고, 도큐먼트는 실제 데이터를 저장하는 단위를 뜻합니다. 대부분 ELK를 이용해 시스템을 개발하면 하나의 클러스터를 사용하며, 클러스터 내부는 데이터의 성격에 따라 여러 개의 인덱스를 생성합니다.
도큐먼트
데이터가 저장되는 기본 단위로 JSON 형태입니다.
하나의 도큐먼트는 여러 필드(field)와 값(value)를 갖습니다.
관계형 데이터베이스와 엘라스틱서치의 데이터 저장 방식을 비교 하여 좀 더 이해하기 쉽게 설명해 드리겠습니다.
일단 기본적으로 MySQL 에서 데이터를 생성하고 저장하는 방식은 이러합니다.
테이블을 생성하고 쿼리문을 이용해 데이터를 저장합니다.
하지만 JSON 형식의 도큐먼트 파일은
{
"name":"mateo",
"age":25,
"gender":"female"
}
즉 위 name,age,gender를 필드라고 하고 : 뒤에 것을 값이라고 합니다. 엘라스틱서치에서는 매핑을 통해서 데이터의 타입을 지정할 수 있습니다. 7버전 이후로는 MySQL과 달라졌습니다 하지만 처음 접하는 분들을 위해 조금 쉽게 설명하고자 인용을 했습니다.
MySQL
ELK
테이블
인덱스
레코드
도큐먼트
컬럼
필드
스키마
매핑
인덱스
인덱스는 도큐먼트를 저장하는 논리적 단위로, 관계형 데이터베이스의 테이블과 유사한 개념입니다.
하나의 인덱스에 여러개의 도큐먼트들을 가지는 구조 형태 입니다.
동일한 인덱스 안에 도큐먼트는 동일한 스키마를 가집니다.
인덱스 이름에는 영어 소문자,/,\,*,?,",<,>,|,#, 공백 쉼표 등을 제외한 특수문자를 사용할수 있고 255바이트를 넘을 순 없습니다.
스키마에 따라 그룹핑을 달리합니다. 일반적으로 스키마에 따라 인덱스를 구분을 합니다.
예를 들어)
회원 정보 도큐먼트와 장바구니 도큐먼트는 성격이 다르기 때문에 데이터 스키마도 다릅니다.
회원 정보에는 나이 이름 번호 등이 들어가지만 장바구니에는 상품명 상품세일 날짜 등이 들어가기 때문입니다.
인덱스는 용량이나 숫자 제한없이 도큐먼트를 가질수 있지만 검색시 처리 속도가 현저히 느려져서 성능이 나빠집니다.
그래서 하나의 약속 처럼 엘라스틱에서는 용량을 제한을 둡니다. 기본적으로 특정 도큐먼트 개수에 도달하거나 특정 용량을 넘어서면 인덱스를 분리합니다.( 혹은 날짜 년도, 특정 주기를 통해 분리 삭제 합니다. )
도큐먼트 CRUD
ELK 에 도큐먼트를 저장하고 읽어오고 수정하고 삭제 하기에 대해 알아보도록하자.
되게 간단합니다. PUT index1 GET index1 DELETE index1 의 입력를 해주면 생성하고 가져오고 삭제시켜줍니다.
도큐먼트의 생성 : 도큐먼트는 하나의 인덱스를 무조건 포함 시켜야합니다.
도큐먼트를 인덱스에 포함 시키는것을 인덱싱이라고 합니다.
도큐먼트 인덱싱할때 타입을 지정하지 않아도 자동으로 엘라스틱서치에서 자동으로 타입을 지정해줍니다.
또한 인덱스에 새로운 도큐먼트를 인덱싱할 수 있다.
PUT index1/_doc/2
{
"name":"jane",
"country":"korea"
}
여기서는 나라 라는 이름의 필드를 추가하였습니다.
기존에 있던 다른 필드는 사용하지 않았습니다(age,gender) 그래도 큰 문제는 없습니다.
float으로 저장한것을 text로 저장해도 float로 다시 타입변환을 하여 저장해줍니다.
예) 숫자 필드에 문자열이 입력되면 숫자로 변환을 시도합니다 .
정수 필드에 소수가 입력되면 소수점 아래 자리를 무시합니다.
도큐먼트 읽기/수정/삭제
도큐먼트를 읽는 방법은 크게 도큐먼트 아이디를 이용해 조회 하는 방법과 쿼리DSL이라는 엘라스틱서치가 제공하는 쿼리문을 이용하여 검색할수 있습니다.
아이디를 이용하는 방법 : GET index2/_doc/1
쿼리문을 이용한 방법 : GET index2/_search
수정 방법:PUT index2/_doc/1 안에 필드 값(value)를 변경해주면 값이 변경 됩니다.
그저 도큐먼트를 인덱싱 하는 과정에서 같은 도큐먼트 아이디가 있으면 덮어쓰기 형식입니다.
update API를 사용하여 도큐먼트를 업데이트 할 수 있습니다.
PUT index2/_update/1
{
"doc":{
"name":"eom"
}
}
_update 라는 에드포인트를 추가해 특정 필드의 값만 업데이트 할 수 있습니다.
ELK에서 수정 작업은 비용이 많이 드는 작업이라서 추천하지 않습니다.
도큐먼트 삭제 : DELETE index2/_doc/2 하시면 index2 인덱스에서 아이디 2인 도큐먼트가 삭제됩니다. 서치를 통해 인덱스의 전체 도큐먼트를 파악한 후 삭제 하셔도 괜찮습니다. 별개로 수정과 마찬가지로 삭제 또한 비용이 많이 들어가는 작업입니다. 사용 시에 주의해야 한다.
토큰(Token)과 용어(term)라는 단어는 엘라스틱에서 많이 사용 될 단어이자 헷갈릴수 있는 단어 이다보니, 여기서 짧게나마 용어를 정의하고 넘어가자.
예를 들어서 'noodle hot' 라는 문자열이 분석기를 거쳐서 인덱스에 저장된다고 가정할때, 분석기는 먼저 캐릭터 필터를 통해 원문에 불필요한 문자들을 제거한다(The, a, you)등등.... 이 과정에선 문자열 자체가 분리가 되지는 않는다.
토크나이저를 통해서 문자열이 필터링 되고 이때, 짤린 단어들은 토큰이라고 지칭한다('noodle','hot'). 이러한 토큰들은 복수의 토큰 필터를 거치며 정제되는데, 정제 후 최종으로 역인덱스에 저장되는 상태의 토큰들을 용어(term)이라고한다. (인덱스안에 2개의 다른 단어로 존재하게된다.)
토큰은 분석기 내부에서 일시적으로 존재하는 상태이고, 인덱싱되어 있는 단위, 또 검색에 사용되는 단위는 모두 용어라고 할 수 있다.
분석기 구성
구성요소
설명
캐릭터 필터
입력받은 문자열을 변경하거나 불필요한 문자들을 제거한다.
토크나이저
문자열을 토큰으로 분리한다. 분리할 때 토큰의 순서나 시작, 끝 위치도 기록한다.
토큰 필터
분리된 토큰들의 필터 작업을 한다. 대소문자 구분, 형태소 분석 등의 작업이 가능하다.
캐릭터 필터 : 문자열의 전처리 작업
토크나이저 : 문자열을 토큰으로 분리
토큰 필터 : 분리된 문자열의 단어들이 필터를 거쳐 최종적으로 용어가 된다.
예) [가위 바위 보] 를 통해서 필터링하고 토크나이저를 하면 [가위][바위][보] 로 필터가 되어 인덱싱 되어 검색에 활용하게된다. 가위를 입력해도 [가위 바위 보] 를 출력 할 수 있다.
역인덱싱이란?
역 인덱싱이란 무엇일까? - 문자열을 토큰화하고 이를 인덱싱하는데 이 것을 역 인덱싱이라고 부릅니다.
많이 쓰이는 단어들을 선별해 그 단어가 몇 페이지에 나와 있는지 알려주는 것을 색인이라고 한다.
주로 책에 맨 뒷 페이지에 나와있는 경우가 많다.
문서가 분석기를 거치면서 역인뎅싱 되고 있다. 분석기는 여러 필터와 토크나이저르 이뤄져 있는데 여기서는 스탠다느 토크나이저와 스톱필터, 소문자 변경필터, 스테이머 필터가 조홥된 분석기를 사용했다.
예를 들면 digital 이라고 치면 2,4,8의 문서에서 값을 찾아올수 있다.
분석기 API
엘라스틱 서치는 필터와 토크나이저를 테스트해볼 수 있는 analyze라는 이름의 REST API를 제공하고있다.
엘라스틱서치는 다양한 분석기를 제공합니다. 자주 사용되는 분석기는 standard,simple,whitespace,stop 이 있습니다.
분석기
설명
standard
특별한 설정이 없으면 엘라스틱서치가 기본적으로 사용하는 분석기이다. 영문법을 기준으로 한 스탠다드 토크나이저와 소문자 변경필터, 스톱필터가 포함되어 있다. [the,10, most,loving,dog,breeds]
simple
문자만 토근화한다. 공백 숫자,하이픈(-)이나 작은따옴표(')같은 문자는 토큰화하지 않는다. [the,most,loving,dog,breeds]
whitespace
공백을 기준으로 구분하여 토큰화한다. [The,10,most,loving,dog,breeds]
stop
simple 분석기와 비슷하지만 스톱 필터가 포함되어 있다. 스톱 필터의 의해 'the'가 제거 된다. [most,loving,dog,breeds]
토크나이저
앞서 분석기는 반드시 하나의 토크나이저를 포함해야 한다고 설명했스빈다. 토크나이저는 문자열을 분히해 토큰화하는 역할을 합니다, 반드시 포함돼야 하기 때문에 형태에 맞는 토크나이저 선택이 가장 중요합니다.
대표적인 토크나이저를 알아보자.
토크나이저
설명
standard
스댄다드 분석기가 사용하는 토크나이저로, 특별한 설정이 없으면 기본 토크나이저로 사용된다. 쉼표나 점 같은 기호를 제거하며 텍스트 기반으로 토큰화한다.
lowercase
텍스트기반으로 토큰화하며 모든 문자를 소문자로 변경해 토큰화한다
ngram
원문으로부터 b개의 연속된 글자 단위를 모두 토큰화한다. 예를들어 '엘라스틱서치' 를 [엘라,라스.스틱,틱서,서치]와 같이 연속된 두 글자를 모두 추출합니다. 사실상 원문으로부터 검색할 수있는 거의 모든 조합을 얻어낼수 있기 때문에 정밀한 부분 검색에 감정이 있지만, 토크나이징을 수행한 n개 이하의 글자 수로는 검색이 불가능하며 모든 조합을 추출하기 때문에 저정공간을 많이 차지 한다는 단점이 있다.