사용자 도구

사이트 도구


search:elasticsearch

Elastic Search

최대 색인 수

  • Shard 한개(Lucene 인덱스 하나)는 최대 21억건 문서, 2740억건의 고유 term까지만 허용한다.
  • 따라서 데이터 증강량을 판별하여 이에 맞게 Sharding 수준을 정해야한다.

노드 구성

  • node.data=true/false : 실제 색인을 가지고 있는 데이터 노드가 될 수 있는지 여부
  • node.master=true/false : 마스터 노드가 될 수 있는지 여부
  • node.data=false, node.master=false 인 검색 클라이언트 전용노드를 만들어서, 검색 요청을 여기서 받은 뒤에 데이터 노드에 검색을 요청하는 것이 가능하다. 이렇게 하면 실제 색인을 가진 데이터 노드는 클라이언트로부터의 socket 연결을 위한 오버헤드와 메모리 사용량을 줄일 수 있게 된다.

Sharding Routing

Routing 강제

라우팅을 강제할 수 있다. 라우팅 옵션 없이는 인덱싱 불가.

"mappings": {
  "[indexname]": {
    "_routing": {
      "required": true
    }
  }
}

Cluster 관리

  • host:9200/_cluster/settings?pretty : Cluster 상태 조회

Docker로 띄우면서 Clustering 할 때

  • Docker로 ES를 띄울 경우 network 설정이 복잡해진다.
  • 가장 쉬운 해결책 : network.host=0.0.0.0으로 하고 docker 실행시 --net=host 옵션을 준다. 하지만 이 경우 보안상 등의 문제가 있을 수 있다고 함.
  • 더 좋은 방법은 docker 를 띄우는 HOST의 IP를 network.publish_host에 직접 바인딩해준다.
    # network.host는 삭제하고, bind_host는 아래와 같이. eth0 는 다른 interface 일 수 있음
    network.bind_host: _eth0:ipv4_ # 혹은 0.0.0.0 도 가능한지 확인할 것.
    
    # elasticsearch 실행시 network.publish_host를 인자로 넘기고,
    --network.publish_host $ES_PUBLISH_HOST
    
    # docker 실행시에 다음 명령으로 해당 Host 서버의 IP값을 넣어준다.
    docker run ... -e ES_PUBLISH_HOST=`hostname -I | awk '{print $1}'`
    
    # AWS EC2 인스턴스에서는 
    docker run ... -e ES_PUBLISH_HOST=`curl -s http://169.254.169.254/latest/meta-data/local-ipv4`

Docker로 띄울 때 옵션

Docker run 시에 다음 옵션을 추가해야 한다.

# JVM Heap Swap 방지 설정이 돼 있을 때 아래 옵션을 줘서 실행해야 한다. (bootstrap.mlockall: true)
# --cap-add=IPC_LOCK --ulimit memlock=-1:-1
docker run --cap-add=IPC_LOCK --ulimit memlock=-1:-1 ...
 
# 그렇지 않으면 다음과 같은 오류 발생하고 메모리 설정이 올바로 작동 안함
Unable to lock JVM Memory: error=12,reason=Cannot allocate memory
This can result in part of the JVM being swapped out.
Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
These can be adjusted by modifying /etc/security/limits.conf, for example: 
	# allow user 'someuser' mlockall
	coupang soft memlock unlimited
	coupang hard memlock unlimited
If you are logged in interactively, you will have to re-login for the new limits to take effect.

JVM Heap Dump를 떠야 할 때 대비해서 다음 옵션도 추가

--cap-add=SYS_PTRACE

환경변수

  • JAVA_OPTS : Java 기본 옵션들
  • ES_HEAP_SIZE : -Xmx, -Xms에 같은 값으로 들어감
  • ES_HEAP_NEWSIZE : -Xmn
  • ES_DIRECT_SIZE : -XX:MaxDirectMemorySize
  • ES_GC_OPTS : Java Garbage Collection 관련옵션
  • ES_GC_LOG_FILE : GC log 파일관련 옵션

최적화

  • index.refresh_interval: 시간s : 인덱스를 push 하는 시간이라고 보면 되는데 5s 형태로 준다. 길수록 CPU 점유율은 떨어지지만 검색에 안나오는 시간도 길어진다.
  • bootstrap.mlockall: true : Linux 등에서 ES의 메모리를 swapping 하지 않게 설정 등.
    • 불필요하게 많은 Shard는 메모리와 리소스를 현저히 낭비하게 만든다.
    • 메모리는 31GB 혹은 32bit Pointer가 될수 있는 max 값.
    • Shard 는 최대 30GB가 될 정도 수준으로 구성.(Replica 도 계산시 단일 Shard로 쳐서)

주의점

  • 한 클러스터에서는 모두 동일 JVM 버전을 사용해야한다. 안 그러면 직렬화가 달라서 문제가 발생할 수 있다.
  • 한 번 Version Upgrade 한 뒤 indexing을 하면 다시 Downgrade 할 수 없다. index를 백업 한 뒤에 업그레이드하라.

참조

search/elasticsearch.txt · 마지막으로 수정됨: 2017/02/09 08:43 저자 kwon37xi