elasticsearch 7.3 설치하기






elasticsearch 7.3 설치하기 





이 포스팅에는 주기적으로 elasticsearch 설치하기 포스팅이 올라온다. 

가끔씩 검색 엔진 사용할 일이 있는데 그때마자 버전이 몇 개씩이나 올라가 있어서 결국 새로 설치하기 때문이다;;


일단 7 버전의 주요 변화는 한국어 형태분석기가 내장되었다고 하면서 

기존에 썼던 은전 한잎 플러그인이 더이상 호환이 안된다고 한다. 



그럼 일단 다운로드 받아서 실행해보자. 


버전별로 다운로드 받기 

https://www.elastic.co/kr/downloads/past-releases


문서 : https://www.elastic.co/guide/en/elasticsearch/reference/7.3/targz.html






wget "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.2-linux-x86_64.tar.gz"



tar zxvf elasticsearch-7.3.2-linux-x86_64.tar.gz






 wget "https://artifacts.elastic.co/downloads/kibana/kibana-7.3.2-linux-x86_64.tar.gz"


  tar zxvf kibana-7.3.2-linux-x86_64.tar.gz





jvm.options


#-Xms1g

#-Xmx1g


-Xms10g

-Xmx10g



./elasticsearch 를 실행시키자 아래와 같은 오류가 나온다. 

이번엔 설정 방법도 달라졌나보다;;



[2019-09-30T20:12:48,973][INFO ][o.e.b.BootstrapChecks    ] bound or publishing to a non-loopback address, enforcing bootstrap checks

ERROR: [1] bootstrap checks failed

[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured




discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes 셋 중에 하나는 세팅하라고 해서

가이드 문서를 따라 seed_hosts 를 아래와 같이 설정해봤다. 


discovery.seed_hosts: ["127.0.0.1", "[::1]"]



그렇지만 이제 warning 메세지가 ㅠㅠ



[2019-09-30T20:39:00,499][WARN ][o.e.c.c.ClusterFormationFailureHelper] [dd] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and [cluster.initial_master_nodes] is empty on this node: have discovered [{dd}{FI-RklyNRN-xTlMDTDBgSA}{m592KpzdSTiLMt9RkycrdA}{ ... ; discovery will continue using [127.0.0.1:9300, [::1]:9300] from hosts providers and  .... {121.78.145.40}{121.78.145.40:9300}{dim}{ml.machine_memory=135097606144, xpack.installed=true, ml.max_open_jobs=20}] from last-known cluster state; node term 0, last-accepted version 0 in term 0


결국 검색해서 initial_master_nodes 까지 설정한 후에야 제대로 시작할 수 있었다. 


참고: https://linuxacademy.com/community/show/36639-elasticsearch-yml-changes-70/




node.name: master1

discovery.seed_hosts: ["127.0.0.1", "[::1]"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["서버ip"]


참고: https://linuxacademy.com/community/show/36639-elasticsearch-yml-changes-70/


# curl 'localhost:9200'

{

  "name" : "master1",

  "cluster_name" : "elasticsearch",

  "cluster_uuid" : "EgSc9q3mSC2URKZWBZC4FQ",

  "version" : {

    "number" : "7.3.2",

    "build_flavor" : "default",

    "build_type" : "tar",

    "build_hash" : "1c1faf1",

    "build_date" : "2019-09-06T14:40:30.409026Z",

    "build_snapshot" : false,

    "lucene_version" : "8.1.0",

    "minimum_wire_compatibility_version" : "6.8.0",

    "minimum_index_compatibility_version" : "6.0.0-beta1"

  },

  "tagline" : "You Know, for Search"

}





참고 : 

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/discovery-settings.html


nori : 


https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori-tokenizer.html#analysis-nori-tokenizer

https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori.html



elasticsearch - high disk watermark exceeded on one or more nodes, rerouting shards




어느날 elasticsearch 로그를 보고 있는데 아래와 같은 로그가 찍히고 있었다. 




[2016-08-02 00:42:52,125][INFO ][cluster.routing.allocation.decider] [Fateball] high disk watermark exceeded on one or more nodes, rerouting shards

[2016-08-02 00:43:22,125][WARN ][cluster.routing.allocation.decider] [Fateball] high disk watermark [90%] exceeded on [Fateball] free: 33gb[7%], shards will be relocated away from this node




elasticsearch는 shard를 node에 배치할 때 (재배치 포함) 디스크 여유 공간을 검사하는데 

그 때 미리 정해놓은 여유공간이 부족하면 이 node에 더이상 새 shard 를 배치하고 않고 위와 같은 경고 메세지를 찍는다고 한다. 


이 기준을 watermark(수위)라고 표시 하는데 low 와 high로 따로 설정할 수 있다. 

홍수가  났을 때 low watermark 부터 넘어가고 high watermark에 도달하는 것을 생각하면 된다. 


참고로 low disk watermark 에러 메세지 


[2017-08-14T15:45:31,688][INFO ][o.e.c.r.a.DiskThresholdMonitor] [BydL6N7] low disk watermark [85%] exceeded on [BydL6N7iRhu4YisM75Lirw][BydL6N7][/home/elasticsearch-5.1.1/data/nodes/0] free: 59.2gb[14.9%], replicas will not be assigned to this node


참고로 low watermark 기본 설정은 85%, high watermark 기본 설정은 90%이다. 

즉 서버 디스크가 90% 차있는 상황 OTL 


이런 경고가 뜨면 상황에 따라 설정을 변경하거나 node를 늘리거나 디스크를 정리하라고 가이드 하고 있는데 

일단 디스크를 정리해야 겠다 -_-; 


참고로 설정 변경 방법은 아래와 같다.



PUT /_cluster/settings

{

  "transient": {

    "cluster.routing.allocation.disk.watermark.low": "80%",

    "cluster.routing.allocation.disk.watermark.high": "50gb",

    "cluster.info.update.interval": "1m"

  }

}





참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html


 https://books.google.co.kr/books?id=oV4dDAAAQBAJ&pg=PA191&lpg=PA191&dq=high+disk+watermark+exceeded+on+one+or+more+nodes&source=bl&ots=NO8bB2bcR2&sig=cq17f8TFQ6W43cXLuyZQNoDyYpE&hl=ko&sa=X&ved=0ahUKEwi27NHg_KHOAhULl5QKHYKsAWw4HhDoAQghMAE#v=onepage&q=high%20disk%20watermark%20exceeded%20on%20one%20or%20more%20nodes&f=false




elasticsearch - shard 개수와 replica 개수 정하기

엘라스틱 서치 권장 사항 저장용



https://www.elastic.co/guide/en/elasticsearch/guide/current/scale.html


https://www.elastic.co/guide/en/elasticsearch/guide/current/shard-scale.html


https://www.elastic.co/guide/en/elasticsearch/guide/current/overallocation.html


PUT /my_index
{
  "settings": {
    "number_of_shards":   2, 
    "number_of_replicas": 0
  }
}


This time, when we add a second node, Elasticsearch will automatically move one shard from the first node to the second node, as depicted in Figure 50, “An index with two shards can take advantage of a second node”. Once the relocation has finished, each shard will have access to twice the computing power that it had before.


A new index in Elasticsearch is allotted five primary shards by default. That means that we can spread that index out over a maximum of five nodes, with one shard on each node. That’s a lot of capacity, and it happens without you having to think about  it all.


https://www.elastic.co/guide/en/elasticsearch/guide/current/kagillion-shards.html

A shard is not free. Remember:

  • A shard is a Lucene index under the covers, which uses file handles, memory, and CPU cycles.
  • Every search request needs to hit a copy of every shard in the index. That’s fine if every shard is sitting on a different node, but not if many shards have to compete for the same resources.
  • Term statistics, used to calculate relevance, are per shard. Having a small amount of data in many shards leads to poor relevance.



https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html



Replication is important for two primary reasons:

  • It provides high availability in case a shard/node fails. For this reason, it is important to note that a replica shard is never allocated on the same node as the original/primary shard that it was copied from.
  • It allows you to scale out your search volume/throughput since searches can be executed on all replicas in parallel.

To summarize, each index can be split into multiple shards. An index can also be replicated zero (meaning no replicas) or more times. Once replicated, each index will have primary shards (the original shards that were replicated from) and replica shards (the copies of the primary shards). The number of shards and replicas can be defined per index at the time the index is created. After the index is created, you may change the number of replicas dynamically anytime but you cannot change the number shards after-the-fact.



https://www.elastic.co/guide/en/elasticsearch/guide/current/replica-shards.html


However, replica shards can serve read requests. If, as is often the case, your index is search heavy, you can increase search performance by increasing the number of replicas, but only if you also add extra hardware.

Let’s return to our example of an index with two primary shards. We increased capacity of the index by adding a second node. Adding more nodes would not help us to add indexing capacity, but we could take advantage of the extra hardware at search time by increasing the number of replicas:



elasticsearch 2.3 - server ip 주소에 Connection refused 에러





localhost:port에는 접속이 되면서 ip address:port로는 접속이 되지 않는 이슈 발생 





# curl real_IP_Address:9200

curl: (7) Failed to connect to real_IP_Address port 9200: Connection refused

# curl localhost:9200

{

  "name" : "Wrath",

  "cluster_name" : "****",

  "version" : {

    "number" : "2.3.2",

    "build_hash" : "****",

    "build_timestamp" : "2016-04-21T16:03:47Z",

    "build_snapshot" : false,

    "lucene_version" : "5.5.0"

  },

  "tagline" : "You Know, for Search"

}



elasticsearch.yml에서 network.host를 아래와 같이 수정하면 문제 해결.


network.host: 0.0.0.0




참고: http://stackoverflow.com/questions/31677563/connection-refused-error-on-elastic-search





elasticsearch 시작하기 - slowlog 사용하기






엘라스틱 검색에서 실제 쿼리로 들어온 질의를 보고 싶으면 

아래와 같이 con/elasticsearch.yml에 slowlog설정을 한다. 


로그 레벨 별로 로그를 남길 응답 속도의 기준을 설정할 수 있다. 

로그 레벨은 warn, info, debug, trace로 정의 되어 있다. 





index.search.slowlog.threshold.query.warn: 10s

index.search.slowlog.threshold.query.info: 5s

index.search.slowlog.threshold.query.debug: 2s

index.search.slowlog.threshold.query.trace: 500ms


index.search.slowlog.threshold.fetch.warn: 1s

index.search.slowlog.threshold.fetch.info: 800ms

index.search.slowlog.threshold.fetch.debug: 500ms

index.search.slowlog.threshold.fetch.trace: 200ms





로그 레벨과 상관없이 모든 입력을 다 보고 싶기 때문에 아래와 같이 기준을 0으로 설정하였다. 




index.search.slowlog.threshold.query.warn: 0s

index.search.slowlog.threshold.query.info: 0s

index.search.slowlog.threshold.query.debug: 0s

index.search.slowlog.threshold.query.trace: 0ms


index.search.slowlog.threshold.fetch.warn: 0s

index.search.slowlog.threshold.fetch.info: 0ms

index.search.slowlog.threshold.fetch.debug: 0ms

index.search.slowlog.threshold.fetch.trace: 0ms





참고: https://www.elastic.co/guide/en/elasticsearch/reference/2.3/index-modules-slowlog.html#search-slow-log






리눅스에 kibana 4.1.2 설치하기






elasticsearch도 설치했으니 이제 키바나 4.1.2을 설치하려고 한다. 

키바나 4.1 버전은 elasticsearch 1.4.4 를 포함한 이 후 버전에서만 사용할 수 있으니 참고하자. 



키바나 다운로드 사이트 바로가기 





운영체제에 맞게 LINUX 64-BIT 나 32-BIT를 클릭한다. 

연결된 다운로드 사이트에서 나오는 url을 wget으로 받은후 압축을 푼다.



# wget https://download.elastic.co/kibana/kibana/kibana-4.1.2-linux-x64.tar.gz

--2015-10-15 18:10:30--  https://download.elastic.co/kibana/kibana/kibana-4.1.2-linux-x64.tar.gz

Resolving download.elastic.co... 23.21.139.229, 50.16.192.199, 184.73.241.51, ...

Connecting to download.elastic.co|23.21.139.229|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 11787239 (11M) [application/octet-stream]

Saving to: `kibana-4.1.2-linux-x64.tar.gz'


100%[==========================================================================>] 11,787,239  2.38M/s   in 5.6s


#tar zxfv kibana-4.1.2-linux-x64.tar.gz






./conf/kibana.yml을 열어 필요하면 설정을 수정한다. 

elasticsearch의 hostname과 port 및 키바나의 port 번호를 여기서 설정할 수 있다. 



# Kibana is served by a back end server. This controls which port to use.

port: 5601


# The host to bind the server to.

host: "0.0.0.0"


# The Elasticsearch instance to use for all your queries.

elasticsearch_url: "http://localhost:9200"





bin/kibana를 실행한다. 



# ./kibana

{"name":"Kibana","hostname":"q..","pid":17380,"level":30,"msg":"No existing kibana index found","time":"2015-10-15T10:24:46.640Z","v":0}

{"name":"Kibana","hostname":"q..","pid":17380,"level":30,"msg":"Listening on 0.0.0.0:5601","time":"2015-10-15T10:24:46.645Z","v":0}




이렇게 실행할 경우 터미널 창이 종료되면 kibana실행도 종료가 된다. 

ssh 세션이 끝나도 남아있도록 하려면 아래와 같이 실행하도록 한다. 



sh kibana-4.1.2-linux-x64/bin/kibana >> /var/log/kibana.log(or /dev/null) &




마지막으로 웹브라우저에서 http://yourhost:5601(또는 입력한 키바나 포트번호)를 입력하여 

아래와 같은 설정화면이 뜨는지 확인해본다.  




다음 포스팅에서는 키바나 설정을 해보겠다. 







elasticsearch - mapping 확인하기






엘라스틱 검색에서 현재 mapping을 확인하고 변경하는 방법을 정리해보았다. 


현재 mapping 확인하기


- web browser에서 확인하기 


http://(localhost or ip):(port)/indexname/_mapping/typename/


예시 ) 


http://localhost:9200/test/_mapping/companyname1/


- linux 에서 확인하기 


curl -XGET 'http://(localhost or ip):(port)/indexname/_mapping/typename?pretty'


예시) 

curl -XGET 'http://125.456.789.01:9200/test/_mapping?pretty'


- 리눅스에서 현재 mapping을 json 파일로 저장하기 

curl -XGET 'http://125.456.789.01:9200/test/_mapping/companyname1?pretty' > current_mapping.json


예시) mapping 저장 결과 


{

  "test" : {

    "mappings" : {

      "companyname1" : {

        "properties" : {

          " 분기경상이익" : {

            "type" : "string"

          }, 

        ...

        "news_line" : {

            "type" : "string"

          },

    }
}





참고: 


https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-cjk-bigram-tokenfilter.html


https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html



elasticsearch - failed to delete index




엘라스틱검색을 하면서 전체 인덱스를 아래와 같이 삭제하였는데 

이상하게 head plugin에는 일부 인덱스들이 남아있다. 



curl -XDELETE localhost:9200/_all

{"acknowledged":true}



로그를 확인해보니 아래와 같이 30초 타임아웃에 걸려서 인덱스 삭제를 실패했다는 메세지가 있다. 



[2015-07-23 19:59:15,769][DEBUG][action.admin.indices.delete] [Illyana Rasputin] [2014-10-31] failed to delete index

org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException: failed to process cluster event (delete-index [2014-10-31]) within 30s

at org.elasticsearch.cluster.service.InternalClusterService$2$1.run(InternalClusterService.java:278)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)





검색해보니 timeout 시간을 늘리면 된다고 한다. 

다만 인덱스를 삭제하는데 3초 이상이 걸리는것은 클러스터가 오버로드를 보여주는 것이라 주의가 필요할 것 같다. 



I know this is a late reply, but in case anyone else sees this:


Curator timed out its connection after waiting for 30 seconds.  You can increase the value with --timeout should something like this happen to you.


Truthfully, though, a delete operation that takes longer than even 3 seconds is indicative of an overloaded cluster.



이번엔 설정도 변경 안 하고 그냥 한번더 delete 명령어를 실행하니 남아있는 인덱스들도 깨끗이 사라졌다. 

같은 문제가 반복되면 최적화 문제를 생각해봐야겠다. 


그리고 삭제가 다 안되었는데도 삭제 성공 메세지가 나오는 것은 문제인 것 같아 확인해보니

이미 등록되어 오픈되어 있는 이슈인 듯하다. 



진행중 이슈: https://github.com/elastic/elasticsearch/issues/7295


참조: http://elasticsearch-users.115913.n3.nabble.com/Failed-to-delete-index-using-curator-td4059905.html





윈도우 서버 2012에 엘라스틱검색 1.6 설치하기




ElasticSearch는 Java 기반의 애플리케이션으로 

별도의 설치 과정 없이 곧바로 실행가능한 검색 프로그램이다. 


윈도우 서버 2012에서 엘라스틱검색 1.6을 설치해보겠다


0. 설치 전 준비 

엘라스틱 검색을 사용하기 위해서는 서버에 최소 Java 7 버전 이상이 설치되어 있어야 한다. 
공식 홈페이지에서는 Oracle JDK version 1.8.0_25 버전 이상을 설치하는것을 추천하고 있다. 

현재 서버의 자바 버전과 JAVA_HOME 환경 변수 설정을 확인하고 문제 없으면 설치를 진행한다. 


C:\Users\Administrator>java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)







1. 엘라스틱 검색 파일 다운로드 하기 


elasticsearch version : 1.6.0

다운로드 : https://www.elastic.co/thank-you?url=https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.6.0.zip



다운로드 받은 파일을 원하는 장소에 압축을 푼다. 

bin폴더에는 실행 스크립트들이 있다.  




2.  기본 설정하기 


bin 폴더에 있는 배치 스크립트에서 엘라스틱 서치에서 사용하는 heap memory에 대한 설정값을 변경한다

ES_MIN_MEM(기본값 256m)는 메모리 최소 사이즈 설정 변수이고 

ES_MAX_MEM(기본값 1g)은 최대 메모리 설정변수인데 

두 값 다 최근 서버 사양에 비해 낮으므로 서버의 가용 메모리의 반정도를 설정해 둔다. 


수정해할 할 스크립트와 내용은 아래와 같다. 


- elasticsearch.in.bat 


if "%ES_MIN_MEM%" == "" (

set ES_MIN_MEM=256m

)


if "%ES_MAX_MEM%" == "" (

set ES_MAX_MEM=1g

)


이 부분을 본인이 원하는 메모리 사이즈로 수정해주면 된다 



if "%ES_MIN_MEM%" == "" (

set ES_MIN_MEM=4g

)


if "%ES_MAX_MEM%" == "" (

set ES_MAX_MEM=4g

)


- service.bat 

if "%ES_MIN_MEM%" == "" set ES_MIN_MEM=256m
if "%ES_MAX_MEM%" == "" set ES_MAX_MEM=1g

이 부분 역시 수정해둔다. 

if "%ES_MIN_MEM%" == "" set ES_MIN_MEM=4g
if "%ES_MAX_MEM%" == "" set ES_MAX_MEM=4g




3. 플러그인 설치하기 

참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-plugins.html#_plugins

기본적으로 사용하는 head와 bigdesk 플로그인을 설치한다. 
설치 방법은 간단하다. command 창에서 아래와 같이 입력하면 자동으로 설치가 된다. 


bin/plugin --install mobz/elasticsearch-head 
bin/plugin --install lukas-vlcek/bigdesk




head/bigdesk plugin 설치 화면 


D:\es\elasticsearch-1.6.0>bin\plugin --verbose --install mobz/elasticsearch-head

-> Installing mobz/elasticsearch-head...
Trying https://github.com/mobz/elasticsearch-head/archive/master.zip...
Downloading ....................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..........................................................................DONE
Installed mobz/elasticsearch-head into D:\es\elasticsearch-1.6.0\plugins\head 
Identified as a _site plugin, moving to _site structure ...
Installed mobz/elasticsearch-head into D:\es\elasticsearch-1.6.0\plugins\head\_site


D:\es\elasticsearch-1.6.0>bin\plugin --install lukas-vlcek/bigdesk
-> Installing lukas-vlcek/bigdesk...
Trying https://github.com/lukas-vlcek/bigdesk/archive/master.zip...
Downloading ....................................................................
................................................................................
................................................................................
.....................DONE
Installed lukas-vlcek/bigdesk into D:\es\elasticsearch-1.6.0\plugins\bigdesk
Identified as a _site plugin, moving to _site structure ...






4. elasticsearch 실행하기 


elasticsearch를 실행하는 방법은 두가지가 있다. 



 - elasticsearch.bat 으로 실행 


elasticsearch.bat 을 실행하면 elasticsearch.in.bat에 저장된 환경변수들을 읽어오면서 

엘라스틱검색이 실행이 된다. 


- service.bat 으로 실행


elasticsearch를 background job으로 돌리거나 서버 시작시 자동으로 elasticsearch를 실행하기 위해서

elasticsearch를 서비스로 실행하려면 service 배치파일을 이용하면 된다. 


참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-service-win.html




elasticsearch 서비스로 설치하고 시작하기 





D:\es\elasticsearch-1.6.0\bin>service

Usage: service.bat install|remove|start|stop|manager [SERVICE_ID]



D:\es\elasticsearch-1.6.0\bin>service install

Installing service      :  "elasticsearch-service-x64"

Using JAVA_HOME (64-bit):  "C:\Program Files\Java\jdk1.8.0_25"

The service 'elasticsearch-service-x64' has been installed.



D:\es\elasticsearch-1.6.0\bin>service start
The service 'elasticsearch-service-x64' has been started




서비스 manager 실행하기 


service manager를 command 창에 입력하면 

아래와 같이 관리창이 실행된다. 







5.  설치 확인 


브라우저에서 http://localhost:9200/ 로 접속하여 확인 합니다.




정상적으로 설치된 것을 확인 할 수 있습니다. 



plugin도 정상적으로 설치되었는지 확인해본다. 




http://localhost:9200/_plugin/head/ 


https://localhost:9200/_plugin/bigdesk/









마지막으로 cluster와 node정보도 브라우저에서 아래와 같이 확인 가능하다. 


Cluster 정보 확인


http://localhost:9200/_cluster/health?pretty=true


Node 정보 확인


http://localhost:9200/_nodes?pretty=true

http://localhost:9200/_nodes/settings?pretty=true










엘라스틱검색 에러 - java.lang.OutOfMemoryError: Java heap space



참고: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/heap-sizing.html

 



엘라스틱서치를 사용하면서 가장 많이 보는 에러중에 하나가 Java heap space 에러이다.

아래는 로그 파일에서 확인할 수 있는 Java heap space 에러 메세지이다. 


 

[Eel] Caught exception while handling client http traffic, closing connection 
  2 java.lang.OutOfMemoryError: Java heap space
  3     at org.elasticsearch.common.netty.buffer.HeapChannelBuffer.<init>(HeapChannelBuffer.java:42)
  4     at org.elasticsearch.common.netty.buffer.BigEndianHeapChannelBuffer.<init>(BigEndianHeapChannelBuffer.java:34)
  5     at org.elasticsearch.common.netty.buffer.ChannelBuffers.buffer(ChannelBuffers.java:134)
  6     at org.elasticsearch.common.netty.buffer.HeapChannelBufferFactory.getBuffer(HeapChannelBufferFactory.java:68)
  7     at org.elasticsearch.common.netty.buffer.CompositeChannelBuffer.copy(CompositeChannelBuffer.java:568)
  8     at org.elasticsearch.common.netty.buffer.AbstractChannelBuffer.copy(AbstractChannelBuffer.java:523)
  9     at org.elasticsearch.common.netty.handler.codec.http.HttpChunkAggregator.appendToCumulation(HttpChunkAggregator.java:208)
 10     at org.elasticsearch.common.netty.handler.codec.http.HttpChunkAggregator.messageReceived(HttpChunkAggregator.java:175)
 11     at org.elasticsearch.common.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
 12     at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
 13     at org.elasticsearch.common.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
 14    

 


위와같은 에러가 발생하면 엘라스틱검색이 사용하고 있는 메모리 사이즈를 확인한다. 

 

 

# ps afx | grep elastic
18177 pts/0    S+     0:00                      \_ grep elastic
19926 ?        Sl    90:40 /usr/lib/jvm/jdk1.7.0_45/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly XX:+HeapDumpOnOutOfMemoryError -Delasticsearch




기본 설정이었던 최대 메모리가 1기가로 설정되어 있어 

메모리가 작아 에러가 생긴 것이다. 


  top을 쳐서 가용 메모리를 확인한다.


 

top - 17:51:15 up 129 days,  8:41,  1 user,  load average: 0.18, 0.07, 0.02
Tasks: 186 total,   1 running, 185 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.1%sy,  0.0%ni, 97.1%id,  0.1%wa,  0.0%hi,  2.4%si,  0.0%st
Mem:   2058540k total,  1931404k used,   127136k free,   126036k buffers
Swap:  1048568k total,   262252k used,   786316k free,   569492k cached

 


보통 가용 메모리의 반을 엘라스틱검색에 설정하는데 

지금 사용하는 리눅스 가상서버의 전체 가용 메모리가 2기가밖에 되지 않아 

더이상 메모리를 늘려도 조금 더 사용하면 또 메모리 에러날 것 같다. 


그냥 윈도우 서버에 다시 깔아서 해야할 듯 ㅠㅠ



 참고로  메모리 설정 방법 변경 방법은 간단하다. 

아래와 같이 시작 스트립트를 하나 만들어서 ES_HEAP_SIZE 환경 변수를 설정하고 

엘라스틱서치를 시작하면 된다.  

 

 

 

#!/bin/bash

export ES_HEAP_SIZE=4g
./elasticsearch -Des.max-open-files=true -d