Elasticsearch 모범 사례 및 지속적인 성능 향상

Elasticsearch 모범 사례 및 지속적인 성능 향상

2022-06-03 last update

7 minutes reading Elastic Search
이 글에서 우리는 최선의 실천과 사용Elasticsearch을 시도하고 그 안에 데이터를 입력할 때 피해야 할 사항을 수집할 것이다.이렇게 하면 우리가 이 우수한 검색엔진을 사용하기 전에, 우리는 우리가 주의해야 할 모든 것을 알게 될 것이다.

Elasticsearch 모범 사례


우리는 Elasticsearch가 따르는 최선의 실천을 사용하기 시작할 것이다. 그리고 우리가 이 요점을 피할 때, 그것이 어떤 문제를 일으킬 것인가.시작합시다.

항상 ES 매핑 정의


ES가 분명히 할 수 있는 일은 비치지 않은 상태에서 일하는 것이다.따라서 ES 인덱스에 JSON 데이터를 제공하기 시작하면 데이터 필드를 훑어보고 적절한 맵을 만듭니다.이것은 ES가 데이터 형식 자체를 선택하고 있기 때문에 직접적이고 간단한 것 같다.데이터에 따라 특정 데이터 형식의 필드가 필요할 수 있습니다.
예를 들어, 다음 문서에 대한 색인을 작성한다고 가정합니다.
{
"id" : 1,
"title" : "Install ElasticSearch on Ubuntu",
"link" : "https://.com/install-elasticsearch-ubuntu/",
"date" : "2018-03-25"
}
이렇게 하면 Elasticsearch는 "date"필드를 "date"형식으로 표시합니다.그러나 다음 문서에 대한 색인을 작성할 때
{
"id" : 1,
"title" : "ES Best Practices and Performance",
"date" : "Pending"
}
이번에는 날짜 필드의 형식이 변경되었습니다. ES에서 오류가 발생하고 문서에 대한 색인을 허용하지 않습니다.작업을 단순화하기 위해 일부 문서를 인덱스하고 ES 인덱스 필드를 보고 다음 URL에서 맵을 가져올 수 있습니다.
GET /index_name/doc_type/_mapping
이렇게 하면 완전한 맵을 구축할 필요가 없습니다.

생산 표지


ES 부팅의 기본 클러스터 이름은 elasticsearch입니다.클러스터에 여러 노드가 있을 때는 명명 플래그가 가능한 한 일치하도록 유지하는 것이 좋습니다. 예를 들어
cluster.name: app_es_production
node.name: app_es_node_001
이외에도 노드의 복구 설정도 중요하다.그룹 중의 일부 노드가 고장으로 인해 다시 시작되고 일부 노드는 다른 노드 다음에 다시 시작된다고 가정합니다.모든 노드 간의 데이터가 일치하도록 하기 위해서, 우리는 모든 집단이 일치하는 상태를 유지하기 위해 일치성 프로그램을 실행해야 한다.
gateway.recover_after_nodes: 10
클러스터에 얼마나 많은 노드가 존재하는지 미리 알려주고 복구 시간이 얼마나 걸릴지 알려주는 것도 도움이 됩니다.
gateway.expected_nodes: 20
gateway.recover_after_time: 7m
정확한 구성을 사용하면 복구에 단 1분이 소요될 수 있으며 어느 회사든 많은 비용을 절약할 수 있습니다.

용량 할당


데이터가 얼마나 많은 공간을 차지하는지, 그리고 데이터가 Elasticsearch로 유입되는 속도를 이해하는 것은 매우 중요하다. 왜냐하면 이것은 각 노드와 주 노드를 집단화하는 데 필요한 RAM 양을 결정하기 때문이다.
물론 구체적인 지도 방침으로 필요한 숫자를 실현하지는 않지만, 우리는 몇 가지 절차를 취해 우리에게 좋은 아이디어를 제공할 수 있다.그 중 하나는 시뮬레이션 용례이다.ES 클러스터를 생성하여 운영 설정에 필요한 거의 동일한 데이터 속도를 제공합니다.큰 시작점과 작은 규모의 개념도 당신이 얼마나 많은 공간을 필요로 하는지 확인하는 데 도움을 줄 수 있다.

대형 템플릿


색인에 대한 대형 템플릿을 정의할 때, 항상 여러 노드의 동기화 템플릿과 관련된 문제가 발생합니다.데이터 모델이 변경될 때마다 템플릿을 재정의해야 합니다.템플릿의 동적성을 유지하는 것이 더 좋은 생각이다.동적 템플릿은 앞에서 정의한 맵과 새 필드에 따라 필드 맵을 자동으로 업데이트합니다.템플릿을 최대한 작게 유지하면 대체할 수 없습니다.

2 Ubuntu 서버에서 mlockall 사용


Linux는 새 페이지에 메모리가 필요할 때 스왑 프로세스를 사용합니다.스왑은 메모리보다 디스크가 느리기 때문에 속도가 느려집니다.ES 설정의 mlockall 속성은 현재 이 페이지가 필요하지 않아도 ES에서 메모리를 교환하지 말라고 알려 줍니다.이 속성은 YAML 파일에서 설정할 수 있습니다.
bootstrap.mlockall: true
ES v5에서x+ 버전, 이 속성은 다음과 같이 변경되었습니다.
bootstrap.memory_lock: true
이 속성을 사용하려면 -DXmx 옵션 또는 ES\u heap\u SIZE를 사용하여 ES에 충분한 메모리를 제공해야 합니다.

매핑 업데이트 최소화


ES 클러스터에서 매핑 업데이트 요청을 보낼 때마다 클러스터의 성능이 저하됩니다.이 점을 제어하지 못하고 맵을 업데이트하려는 경우 ES YAML 구성 파일의 속성을 사용할 수 있습니다.
indices.cluster.send_refresh_mapping: false
모델 업데이트 요청이 주 노드의 마운트 대기열에 있고 노드에 오래된 맵이 있는 데이터를 보낼 때, 나중에 모든 노드에 업데이트 요청을 보내야 합니다.이것은 일을 느리게 할 것이다.상술한 속성을false로 설정했을 때, 이것은 맵에 대한 업데이트가 진행되고 노드에 업데이트 요청을 보내지 않는다는 것을 의미합니다.이것은 정기적으로 맵을 대량으로 변경할 때만 유용합니다.

최적화된 스레드 풀


ES 노드에는 노드 내의 스레드 관리 방식을 개선하기 위해 많은 스레드 탱크가 있습니다.그러나 모든 스레드가 처리할 수 있는 데이터 양에는 제한이 있다.이 값을 추적하려면 ES 속성을 사용할 수 있습니다.
threadpool.bulk.queue_size: 2000
이것은 요청을 처리할 수 있는 라인이 없을 때 노드에서 줄을 서서 실행을 기다릴 수 있는 절분의 요청 수를 알려 줍니다.작업 수가 이 값보다 높으면 RemoteTransportException을 받을 수 있습니다.이 값이 높을수록 노드 기계에 필요한 퇴적 공간량이 많아지고 JVM 퇴적도 소모된다.이 이상이 발생하지 않도록 코드를 준비해야 합니다.

결론


이 수업에서 우리는 사람들이 범하는 흔하고 흔하지 않은 실수를 피하여 Elasticsearch의 성능을 향상시키는 방법을 연구했다.우리에 관한 글을 더 많이 읽으세요.