Elasticsearch

plans-img Enterprise 플랜에서 사용 가능

deployment-img Cloudself-hosted 배포판

이 기능은 레거시 Mattermost Enterprise Edition E20에서도 사용할 수 있습니다.

Elasticsearch은 최적화된 검색 성능으로 기업 규모의 배포를 제공하며 성능 저하 및 타임아웃을 방지합니다. 구현은 분산형, RESTful 검색 엔진인 Elasticsearch v7.x를 사용하여 클러스터 환경에서 매우 효율적인 데이터베이스 검색을 지원합니다 .

Important

  • 기본 Mattermost 데이터베이스 검색은 32 GB RAM 및 4 CPU를 갖춘 서버에서 약 200만 개의 게시물에서 성능 저하를 나타냅니다. 우리는 최적의 검색 성능을 위해 Elasticsearch를 사용하는 것을 권장합니다. Mattermost 서버의 게시물 수가 250만 개 이상이 예상된다면 300만 개에 도달하기 전에 최적의 검색 성능을 위해 Elasticsearch를 활성화하는 것을 권장합니다.

  • 500만 개를 넘는 게시물을 처리하는 경우에는 검색 및 언급에서 중대한 성능 문제(타임아웃과 같은)를 피하기 위해 Elasticsearch가 필요합니다.

  • 우리는 Mattermost 서버와 별도의 기계에 Elasticsearch를 설치하는 것을 강력히 권장합니다.

배포 가이드

Elasticsearch을 사용하면 게시 데이터의 색인을 생성하고 관리하여 대량의 데이터를 빠르게 거의 실시간으로 검색할 수 있습니다. 색인 과정은 Elasticsearch 서버를 설정하고 연결한 후 System Console에서 관리할 수 있습니다. 게시 색인은 Elasticsearch 서버에 저장되며 새로운 게시물이 작성될 때마다 지속적으로 업데이트됩니다. 기존 게시물을 색인하기 위해서는 전체 게시 데이터베이스의 대량 색인을 생성해야 합니다.

Elasticsearch 배포에는 다음 두 가지 단계가 포함됩니다: Elasticsearch 서버 설정하기Mattermost에서 Elasticsearch 구성하기 .

Elasticsearch 서버 설정하기

  1. 최신 릴리스인 Elasticsearch v7를 다운로드하고 설치하세요. 자세한 내용은 Elasticsearch 설치하기 설명서를 참조하세요.

  2. 다음 명령을 실행하여 시스템디 서비스에 Elasticsearch를 설정하세요:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
  1. 서버에서 다음 명령을 실행하여 Elasticsearch가 작동하는지 확인하세요:

curl localhost:9200
  1. 다음 명령을 실행하여 네트워크 인터페이스 이름을 가져오세요:

ip addr
  1. 다음 명령을 실행하여 Elasticsearch 구성 파일을 vi 편집기로 열고 편집하세요:

vi /etc/elasticsearch/elasticsearch.yml
  1. 이 파일에서 network.host 값을 _eth0_ 에서 네트워크 인터페이스 이름으로 대체하고 변경 사항을 저장하세요.

  2. 다음 명령을 실행하여 Elasticsearch를 재시작하세요:

sudo systemctl stop elasticsearch
sudo systemctl start elasticsearch
  1. 다음 명령을 실행하여 포트가 수신 대기 중인지 확인하세요:

netstat -plnt

9200번 및 9300번 포트 수신 대기 중인지 확인하세요. 이러한 포트가 서버의 IP 주소에서 수신 대기 중인지 확인하세요.

  1. Elasticsearch 디렉터리를 생성하고 적절한 권한을 부여하세요.

  2. 다음 명령을 실행하여 /usr/share/elasticsearch/plugins 디렉터리에 icu-analyzer 플러그인 을 설치하세요:

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
  1. 다음 명령을 실행하여 Mattermost에서 Elasticsearch로의 연결을 테스트하세요:

curl 172.31.80.220:9200

Mattermost에서 Elasticsearch 구성하기

이 단계를 따라 하여 Mattermost를 Elasticsearch 서버와의 연결을 설정하고 게시 색인을 생성하세요.

Tip

대규모 배포를 위한 추가 Elasticsearch 구성 설정은 config.json 파일에서 시스템 콘솔 외부에서 설정할 수 있습니다. 자세한 내용은 Elasticsearch 구성 설정 문서를 참조하세요.

  1. System Console > Environment > Elasticsearch 로 이동합니다.

  2. Elasticsearch 인덱싱 가능 상태true 로 설정하여 페이지의 다른 설정을 활성화하세요. 구성이 저장되면 데이터베이스에 새로 추가된 게시물이 자동으로 Elasticsearch 서버에 색인됩니다.

  3. Elasticsearch 서버 연결 세부 정보를 설정하세요:

  1. 이전에 설정한 Elasticsearch 서버의 서버 연결 주소 를 입력하세요.

  2. (선택 사항) Elasticsearch 서버에 액세스하는 데 사용되는 서버 사용자 이름 을 입력하세요. AWS Elasticsearch의 경우 이 필드를 비워 둡니다.

  3. (선택 사항) 사용자 이름과 관련된 서버 비밀번호 를 입력하세요. AWS Elasticsearch의 경우 이 필드를 비워 둡니다.

  4. 클러스터 스니핑 활성화 를 설정하세요(선택 사항). 스니핑은 클러스터의 모든 데이터 노드를 자동으로 찾아 연결합니다. AWS Elasticsearch의 경우 이 필드를 false 로 설정해야 합니다.

Tip

Mattermost v7.8부터는 기본 인증 자격 증명이나 이를 대체하기 위한 선택적 CA 및 클라이언트 인증 구성 설정을 사용할 수 있습니다. 자세한 내용은 Elasticsearch 구성 설정 문서를 참조하세요.

  1. 연결 테스트 를 선택한 다음 저장 을 선택하세요. 서버 연결에 성공하지 못하면 구성을 저장하거나 Elasticsearch로 검색할 수 없게됩니다.

  2. 색인 작성 을 선택하여 기존 게시물의 게시 색인을 작성하세요. 이 프로세스는 게시 데이터베이스의 크기 및 메시지 수에 따라 몇 시간까지 소요될 수 있습니다. 색인이 생성되는 동안 진행률 퍼센트가 표시됩니다. 다운 타임을 피하기 위해 검색 쿼리에 Elasticsearch 사용 가능false 로 설정하여 색인 프로세스 중에 데이터베이스 검색을 사용할 수 있도록 합니다.

Important

다음 단계에서 Elasticsearch를 활성화하기 전에 대량 색인을 완료하세요. 그렇지 않으면 검색 결과가 불완전해질 수 있습니다.

  1. 검색 쿼리에 Elasticsearch 사용 가능true 로 설정하고 자동 완성에 Elasticsearch 사용 가능true 로 설정하여 Elasticsearch를 활성화하세요.

  2. 구성 업데이트를 저장하고 Mattermost 서버를 다시 시작하세요.

Note

  • 대규모 배포를 위한 추가 고급 Elasticsearch 설정은 config.json 파일에서 시스템 콘솔 외부에서 구성할 수 있습니다. 자세한 내용은 Elasticsearch 구성 설정 문서를 참조하세요.

  • 게시물 수가 많은 배포(일반적으로 100만 개 이상)의 경우 재색인 진행률 퍼센트가 오랜 시간 99%로 유지될 수 있습니다. 색인할 데이터의 크기가 추정되며 대규모 데이터베이스에서는 추정치가 부정확해질 수 있습니다. 진행률 추정이 부정확한 경우가 있고 진행률 퍼센트가 완료 직전에 멈춘 것처럼 보일 수 있지만, 색인은 완료될 때까지 계속됩니다.

  • Mattermost Server v5.35로 업그레이드하기 전에 공유된 파일에 대한 검색 결과가 불완전할 수 있으며, mmctl 를 사용하여 추출 명령을 실행해야 합니다. 이 명령을 실행한 후 검색 색인을 다시 빌드해야 합니다. System Console > Environment > Elasticsearch > Bulk Indexing 으로 이동한 다음 지금 색인 작성 을 선택하여 이전 파일 내용을 포함한 검색 색인을 다시 빌드하세요.

  • 고속의 포스트 볼륨 배포를 위해서는, Mattermost LiveIndexingBatchSize 설정을 읽고 적절히 구성하는 것을 강력히 권장합니다.

제한 사항

  1. Elasticsearch는 검색 결과를 relevance(적절성) 유지하기 위해 표준 “stop words” 선택을 사용합니다. 다음 단어들로 검색된 결과들이 반환되지 않습니다: “a”, “an”, “and”, “are”, “as”, “at”, “be”, “but”, “by”, “for”, “if”, “in”, “into”, “is”, “it”, “no”, “not”, “of”, “on”, “or”, “such”, “that”, “the”, “their”, “then”, “there”, “these”, “they”, “this”, “to”, “was”, “will”, and “with”.

  2. 인용된 stop words를 검색하면, ( ticket ) 에서 검색된 단어보다 더 많은 결과가 반환됩니다.

  3. AWS Elasticsearch 구현은 검색 가능한 1000일 동안의 포스트 기록을 제한합니다.

  4. 검색 결과는 사용자의 팀 및 채널 멤버십으로 제한됩니다. 이는 Mattermost 서버에서 강제됩니다. 엔티티들은 Elasticsearch에 색인될 때 Mattermost에서 이러한 필터를 적용하여 검색 시 결과를 좁히기 때문에, Mattermost 서버가 모든 Elasticsearch 요청에 대해 결과를 좁힙니다.

자주 묻는 질문 (FAQ)

Elasticsearch를 사용해야 하나요?

Elasticsearch 엔진은 대형 엔터프라이즈 배포를 위해 설계되어 있어 클러스터 환경에서 매우 효율적인 데이터베이스 검색을 실행합니다. 기본 Mattermost 데이터베이스 검색은 데이터베이스 서버의 사양에 따라 약 250만 개의 포스트 부근에서 성능 저하가 나타납니다. Mattermost 서버가 250만 개 이상의 포스트를 예상할 경우, 최적의 검색 성능을 위해 Elasticsearch를 사용하는 것을 권장합니다.

Mattermost 서버와 동일한 기계에 Elasticsearch를 설치해야 하나요?

아니요. Mattermost 서버와는 다른 기계에 Elasticsearch를 설치하는 것을 강력히 권장합니다.

어떤 종류의 인덱스가 생성되나요?

Mattermost는 사용자, 채널 및 포스트의 세 가지 유형의 인덱스를 생성합니다. 사용자와 채널은 각각 하나의 인덱스를 가지고 있습니다. 포스트는 날짜별로 여러 개의 인덱스로 집계됩니다.

Elasticsearch 색인 작업을 일시 중지할 수 있나요?

네. Mattermost v6.7부터 Elasticsearch 색인 작업을 일시 중지할 수 있습니다. Elasticsearch 색인 작업이 진행 중인 동안 서버를 중지하면 작업이 보류 상태가 됩니다. 서버가 다시 시작되면 작업이 다시 시작됩니다. 시스템 관리자는 시스템 콘솔을 통해 색인 작업을 취소할 수 있습니다.

인덱스 롤오버 정책을 정의할 수 있나요?

AggregatePostsAfterDays 설정은 cutoff 값 정의합니다. 이 값 이전의 모든 포스트는 재색인되어 새로운 크고 더 큰 인덱스로 집계됩니다. 기본 설정은 365일입니다.

Elasticsearch와 함께 제공되는 새로운 검색 기능이 있나요?

현재의 Elasticsearch 구현은 데이터베이스 검색을 통해 현재 사용 가능한 검색 기능과 일치합니다. Mattermost 팀은 파일 이름 및 내용 검색, 날짜 필터, 연산자 및 수정자로 Elasticsearch 기능 세트를 확장하는 작업을 진행 중입니다.

내 파일들은 Elasticsearch에 저장되나요?

아니요, 파일과 첨부 파일은 저장되지 않습니다.

Elasticsearch 서버의 시스템 상태를 어떻게 모니터링하나요?

이 Prometheus 익스포터를 사용하여 Elasticsearch에 대한 다양한 메트릭 을 모니터링할 수 있습니다: justwatchcom/elasticsearch_exporter .

또한 Elasticsearch 성능 모니터링에 관한 기사 를 참조할 수 있습니다. 이 기사는 명시적으로 Prometheus에 작성되지 않았지만, Mattermost의 성능 모니터링 시스템에서 사용하며, 여러 가지 팁과 모베스트 프랙티스를 가지고 있습니다.

Elasticsearch로 어떤 형식의 데이터가 전송되나요?

Mattermost는 Elasticsearch와의 REST API를 통해 색인 및 쿼리하기 위해 JSON 메시지를 사용하여 통신합니다.

얼마나 자주 얼마만에 얼마나 많은 데이터가 Elasticsearch로 전송되나요?

메시지가 게시되거나 채널이 생성되거나 사용자가 변경될 때마다 (예를 들어, 이름 변경 등의 속성이 변경되거나 채널에 참여/나가기 때문일 수 있습니다), 해당 이벤트와 연결된 데이터가 Elasticsearch로 전송됩니다.

Elasticsearch를 통한 검색이 활성화되어 있으면 모든 검색이 쿼리를 생성합니다. 자동 완성이 활성화되어 있으면 메시지 작성 또는 사용자 검색과 관련된 각 사용자 또는 채널 자동 완성이 쿼리를 생성합니다.

Elasticsearch 작업이 실패했는지 어떻게 알 수 있나요?

Mattermost는 각 Elasticsearch 색인 작업의 상태를 시스템 콘솔 > 환경 > Elasticsearch 에서 제공합니다. 이곳에서 작업이 성공했는지 또는 실패했는지, 그리고 오류의 세부 정보를 볼 수 있습니다.

실패는 서버 로그에 반환됩니다. 오류 로그는 Failed job 문자열로 시작하고 job_id 키/값 쌍을 포함합니다. Elasticsearch 작업 실패는 worker 이름이 EnterpriseElasticsearchAggregatorEnterpriseElasticsearchIndexer 로 식별됩니다. 적절한 시스템에 맞게 이러한 실패를 프로그래밍적으로 질의하고 적절한 시스템에 통지하는 스크립트를 선택적으로 생성할 수 있습니다.

내 Elasticsearch 인덱스가 완료되지 않는다면, 어떻게 해야 하나요?

일시 중지된 Elasticsearch 색인 작업이 있다면, Elasticsearch 서버가 다시 시작된 것일 가능성이 높습니다. 만약 Elasticsearch 서버를 다시 시작한다면, 작업이 완료되도록 하기 위해 Mattermost도 다시 시작해야 합니다. Mattermost 서버를 다시 시작하여도 문제가 해결되지 않으면, Mattermost 지원팀에 문의하십시오.

Mattermost 서비스 계정에 필요한 권한

“최소한의 권한” 환경에서는 Elasticsearch 서비스 계정이 가지는 액세스를 제한하기 위해 서비스 계정 권한을 더 제약할 필요가 있을 수 있습니다. 다음 JSON은 Mattermost가 Elasticsearch와 올바르게 작동하기 위해 필요한 “최소한의 권한” 예제를 제공합니다:

{
  "cluster_permissions": [
    "cluster:monitor/*",
    "indices:admin/template/put",
    "indices:data/write/bulk"
  ],
  "index_permissions": [
    {
      "index_patterns": [
        "t-70907*"
      ],
      "allowed_actions": [
        "indices:admin/get",
        "indices:admin/create",
        "indices:admin/delete",
        "indices:admin/mapping/put",
        "indices:admin/mappings/fields/get*",
        "indices:data/read*",
        "indices:data/write*"
      ]
    }
  ]
}

이보다 더 간단하고 더 유연하며 견고한 위의 예제의 변형은:

{
  "cluster_permissions": [
    "cluster:monitor/*",
    "indices:admin/template/put",
    "indices:data/write/bulk"
  ],
  "index_permissions": [
    {
      "index_patterns": [
        "t-70907*"
      ],
      "allowed_actions": [
        "indices:*"
      ]
    }
  ]
}