# ES와 관계형 DB 비교
ES/관계형DB
Index/Database
Type/Table
Document/Row
Field/Column
Mapping/Schema
# CRUD에 있어서 ES와 관계형 DB 비교
POST/INSERT/CREATE
GET/SELECT/READ
PUT/UPDATE/UPDATE
DELETE/DELETE/DELETE
(즉 POST, GET만 다름)
# ES 실행
sudo service elasticsearch start
# ES에 존재하는 모든 index가져오기
curl -X GET 'localhost:9200/_cat/indices?v'
# ES에 새로운 index만들기
curl -X PUT 'localhost:9200/newindex?pretty' # ?pretty는 response를 예쁘게 보여주기 위한 옵션
# ES에 새로운 document만들기
curl -X PUT 'localhost:9200/newindex/info/1?pretty' -H 'Content-Type: application/json' -d '{"name":"SAMPLE"}'
*-index는 newindex, type은 info, id가 1인 document를 추가하는 예제
*-d는 --data-binary의 축약어로, 추가할 데이터를 받음
*-d에 들어갈 데이터는 반드시 double quote를 사용해야함 ""
*newindex라는 이름의 index가 없었으면 새로 만듦
*info라는 이름의 type이 없었으면 새로 만듦
*-id를 생략하면 임의의 문자열로 들어감, 즉 newindex/info/?pretty......형태로 쓰다면
*_source에 입력한 data가 박히게됨
# ES에 새로운 document만들기 from data.json file
curl -X PUT 'localhost:9200/newindex/info/1?pretty' -H 'Content-Type: application/json' -d @data.json
# ES에 한 index 내에 있는 모든 documents 조회
curl -X GET 'localhost:9200/newindex/_search?pretty'
# ES에 모든 index에 있는 모든 documents조회
curl -X GET 'localhost:9200/_all/_search?pretty'
# ES에 (index, type, id)를 이용하여 document조회
curl -X GET 'localhost:9200/index/type/id?pretty'
# ES에 (index, type, id)를 이용하여 document조회하는데, 특정 key만 조회
curl -X GET 'localhost:9200/index/type/id?pretty&filter_path=_source' # _source만 조회
curl -X GET 'localhost:9200/index/type/id?pretty&filter_path=_source.name # _source내 name만 조회
# ES에 (index, type, id)에 해당하는 document update
curl -X PUT 'localhost:9200/index/type/id?pretty' -H 'Content-Type: application/json" -d '{"name":"UPDATED_SAMPLE"}'
*-_source내 name의 값이 바뀌어 짐
*-_version이 +1됨
(_seq_no는 해당 index에서 operation이 발생한 횟수를 가리킴)
(_version은 해당 document를 update한 횟수를 가리킴)
(_primary_term, _seq_no, _version 3개를 통해 document를 uniquely identify가능)
# ES에 CRUD를 하는 파이썬 코드
mygit...
# Elasticsearch 시스템 구조에 대한 요약
-용어정리
-색인(indexing):데이터가 검색될 수 있는 구조로 변경하기 위해 원본 문서를 검색어 토큰들로 변환하여 저장하는 일련의 과정
-인덱스(Index, indices):색인 과정을 거친 결과물, 또는 색인된 데이터가 저장되는 저장소
-검색(search):인덱스에 들어있는 검색어 토큰들을 포함하고 있는 문서를 찾는 과정
-질의(query):사용자가 원하는 문서를 찾거나 집계 결과를 출력하기 위해 검색 시 입력하는 검색어 또는 검색 조건
-Elasticsearch는 대용량 데이터의 증가에 따른 scale out과 데이터 무결성을 유지하기 위한 클러스터링을 지원
-클러스터-노드(마스터, 마스터후보, 데이터)
-노드란 Elasticsearch에 저장소 단위
-하나의 index는 여러개의 노드에 분리되어 저장됨, 이 분리된 단위를 샤드(shard)라 함
-마스터 노드는 index의 metadata, 클러스터 상태, 샤드의 위치 등의 정보를 저장하는 역할, 클러스터마다 1개 존재
-마스터 후보 노드(master eligible node)는 현재 마스터 노드가 죽으면 마스터 노드 역할을 대행, 마스터 후보는 항시 마스터 노드와 정보를 공유하고 있기 때문에 가능
-데이터 노드가 샤드들을 저장
-먼저 생성된 샤드를 primary shard라 함, 복제본을 replica라 함(index를 생성할 때 별도 설정 하지 않으면 ES version 7.0이상부터는 샤드1개로 구성, 그 미만 버전은 5개의 shard로 구성)
-먼저 생성된 샤드라는 것이 index가 1개가 5개의 shard로 분리되고 각각 replica샤드가 생겨 총 10개 샤드면, 앞선 5개의 샤드들을 primary shards라 한다.
-만약 index가 5개의 shard로 구성되어 있다면, 각 샤드마다 복제본도 반드시 생기고, 여러 node에 골고루 분배되며 각 노드마다 다른 샤드(즉 1번 샤드와 1번 복제본이 한 노드에 있는 것을 막으며)가 들어가게 저장->이는 데이터 무결성을 위한 과정, 만약 하나의 노드가 유실이 된다면 그 노드에 존재하던 원본 샤드의 복제본은 다른 노드에서 원본 샤드로 승격되고 복제본을 새로이 만들어서 다른 노드에 분배, 만약 유실된 노드안에 복제본의 샤드가 있으면 다른 노드에 있던 원본 샤드를 통해 복제본을 만들어 분배)
-document에서 _primary_term은 해당 document를 포함하는 index가 저장된 여러 primary shard중 몇번째 shard에 document가 저장되어있는지를 가리킴
# Error
AuthorizationException(403, 'cluster_block_exception', 'blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];')
->
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d "{index.blocks.read_only_allow_delete":null}'
Disk의 용량이 95% 이상 찼을 때, ES는 자동적으로 read_only를 활성화하는데, 그것을 disable하게 해줘야한다.
참고자료:
'CS' 카테고리의 다른 글
(미완)[Algorithm]알고리즘의 유형, 알고리즘 문제의 유형 (0) | 2020.10.10 |
---|---|
[Python]Define functions(positional argument, keyword argument, *args, **kwargs, /, *) (0) | 2020.10.08 |
[Ubuntu]파일 찾기 자주 쓰는 명령어만 (0) | 2020.10.07 |
[python]Python 3.9로 upgrade하기 (0) | 2020.10.06 |
[SQL]Foreign key check란 (0) | 2020.10.06 |