> For the complete documentation index, see [llms.txt](https://esbook.kimjmin.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://esbook.kimjmin.net/02-install/2.2/2.2.1-download-install.md).

# 2.2.1 다운로드 설치 및 실행

&#x20; Elasticsearch 실행을 위해서는 자바1.8 이상의 버전이 설치되어 있어야 하며 JAVA\_HOME 환경변수가 잡혀있어야 합니다. 각 버전별로 필요한 자바 버전은 <https://www.elastic.co/support/matrix#matrix_jvm> 페이지에서 확인이 가능합니다.

{% hint style="info" %}
Elasticsearch 7.0 버전 부터는 기본 배포판에 open-jdk 가 포함되어 있어 따로 Java를 설치 해 주지 않아도 됩니다. 대신 운영체제에 맞게 배포판을 받아야 합니다.
{% endhint %}

&#x20; 먼저 zip / tar.gz 배포판 설치 방법을 알아보겠습니다. 우선은 Linux / MacOS 기준으로 설명 드리겠습니다. 다운로드 한 파일의 압축을 푼 경로로 이동해서 bin/elasticsearch를 실행 해 보면 콘솔에서 다음과 같이 실행이 됩니다. 윈도우 운영체제의 경우 bin\elasticsearch.bat 를 실행하면 됩니다.

{% code title="Elasticsearch 실행 화면" %}

```bash
$ bin/elasticsearch
[2019-08-26T07:52:09,090][INFO ][o.e.e.NodeEnvironment    ] [Jongminui-MacBook-Pro.local] using [1] data paths, mounts [[/ (/dev/disk1s1)]], net usable_space [89.1gb], net total_space [465.6gb], types [apfs]
[2019-08-26T07:52:09,106][INFO ][o.e.e.NodeEnvironment    ] [Jongminui-MacBook-Pro.local] heap size [989.8mb], compressed ordinary object pointers [true]
[2019-08-26T07:52:09,169][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] node name [Jongminui-MacBook-Pro.local], node ID [RDBLYDInSxmMV1PEVit_pQ], cluster name [elasticsearch]
[2019-08-26T07:52:09,169][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] version[7.3.0], pid[38788], build[default/tar/de777fa/2019-07-24T18:30:11.767338Z], OS[Mac OS X/10.14.6/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_151/25.151-b12]
[2019-08-26T07:52:09,170][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] JVM home [/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre]
[2019-08-26T07:52:09,170][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -Des.networkaddress.cache.ttl=60, -Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-785170093085857996, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Dio.netty.allocator.type=unpooled, -XX:MaxDirectMemorySize=536870912, -Des.path.home=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0, -Des.path.conf=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/config, -Des.distribution.flavor=default, -Des.distribution.type=tar, -Des.bundled_jdk=true]
[2019-08-26T07:52:11,000][INFO ][o.e.p.PluginsService     ] [Jongminui-MacBook-Pro.local] loaded module [aggs-matrix-stats]
[2019-08-26T07:52:11,000][INFO ][o.e.p.PluginsService     ] [Jongminui-MacBook-Pro.local] loaded module [analysis-common]
[2019-08-26T07:52:11,000][INFO ][o.e.p.PluginsService     ] [Jongminui-MacBook-Pro.local] loaded module [data-frame]
...
```

{% endcode %}

&#x20; 이제 Elasticsearch의 설치와 실행이 끝났습니다. (정말입니다!) 위 실행 화면을 보면 \[Jongminui-MacBook-Pro.local] 라는 이름으로 Elasticsearch의 노드가 실행 된 것을 볼 수 있습니다. 노드 이름은 직접 지정이 가능하며 지정하지 않았다면 7.0 버전 부터는 호스트명으로 생성되고 5.x, 6.x 버전에서는 노드 프로세스의 UUID의 첫 7자 알파벳으로 지정됩니다. Elasticsearch 2.x 이전 버전에서느 실행을 시키면 노드명이 \[Iron Man] 같은 아메리카코믹의 슈퍼영웅 이름으로 랜덤하게 생성 되었는데 저작권 문제 때문에 5.x 이상 부터는 디폴트 네임으로 사용이 불가능하게 되었습니다.

&#x20; Elasticsearch를 실행할 때 추가적으로 -d, -p 옵션을 사용할 수 있습니다.

* -**d** : Elasticsearch를 백그라운 데몬으로 실행합니다.
* **-p <파일명>** : Elasticsearch 프로세스 ID를 지정한 파일에 저장합니다. 실행이 종료되면 저장된 파일은 자동으로 삭제됩니다.

### -d : 백그라운드 실행

&#x20; **-d** 옵션을 추가해서 Elasticsearch를 실행해보면 화면에 아무런 반응 없이 명령 수행이 끝나게 되고, 실행 중인 Elasticsearch의 실행 로그는 logs 디렉토리 아래에 <클러스터명>.log 파일에서 확인이 가능합니다. 아무런 설정을 하지 않았다면 기본적으로 logs/elasticsearch.log 에 저장됩니다.

&#x20; 백그라운드로 실행한 후 ps -ef | grep elasticsearch 명령으로 실행 중인 프로세스를 검색하면 Elasticsearch가 실행되고 있음을 확인할 수 있습니다.

{% code title="ps 명령으로 백그라운드로 실행중인 Elasticsearch프로세스 검색" %}

```bash
$ bin/elasticsearch -d

$ ps -ef | grep elasticsearch
  501 38850     1   0  8:00AM ttys000    0:36.58 /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Dio.netty.allocator.type=unpooled -XX:MaxDirectMemorySize=536870912 -Des.path.home=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0 -Des.path.conf=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/config -Des.distribution.flavor=default -Des.distribution.type=tar -Des.bundled_jdk=true -cp /Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
  501 38857 38850   0  8:00AM ttys000    0:00.03 /Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/modules/x-pack-ml/platform/darwin-x86_64/bin/controller
  501 38864 38857   0  8:00AM ttys000    0:00.52 ./autodetect --jobid=multiple --bucketspan=900 --lengthEncodedInput --maxAnomalyRecords=500 --timefield=@timestamp --persistInterval=12869 --maxQuantileInterval=23669 --limitconfig=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/limitconfig2644434340400277937.conf --quantilesState=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/multiple_quantiles_557343876454452728180.json --deleteStateFiles --fieldconfig=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/fieldconfig1365288688663343555.conf --logPipe=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/autodetect_multiple_log_38850 --input=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/autodetect_multiple_input_38850 --inputIsPipe --output=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/autodetect_multiple_output_38850 --outputIsPipe --restore=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/autodetect_multiple_restore_38850 --restoreIsPipe --persist=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7812365538420855556/autodetect_multiple_persist_38850 --persistIsPipe
  501 38867 38460   0  8:00AM ttys000    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn elasticsearch
  
$ head logs/elasticsearch.log
[2019-08-26T07:52:09,090][INFO ][o.e.e.NodeEnvironment    ] [Jongminui-MacBook-Pro.local] using [1] data paths, mounts [[/ (/dev/disk1s1)]], net usable_space [89.1gb], net total_space [465.6gb], types [apfs]
[2019-08-26T07:52:09,106][INFO ][o.e.e.NodeEnvironment    ] [Jongminui-MacBook-Pro.local] heap size [989.8mb], compressed ordinary object pointers [true]
[2019-08-26T07:52:09,169][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] node name [Jongminui-MacBook-Pro.local], node ID [RDBLYDInSxmMV1PEVit_pQ], cluster name [elasticsearch]
[2019-08-26T07:52:09,169][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] version[7.3.0], pid[38788], build[default/tar/de777fa/2019-07-24T18:30:11.767338Z], OS[Mac OS X/10.14.6/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_151/25.151-b12]
[2019-08-26T07:52:09,170][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] JVM home [/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre]
[2019-08-26T07:52:09,170][INFO ][o.e.n.Node               ] [Jongminui-MacBook-Pro.local] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -Des.networkaddress.cache.ttl=60, -Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-785170093085857996, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Dio.netty.allocator.type=unpooled, -XX:MaxDirectMemorySize=536870912, -Des.path.home=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0, -Des.path.conf=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/config, -Des.distribution.flavor=default, -Des.distribution.type=tar, -Des.bundled_jdk=true]  
```

{% endcode %}

&#x20; 백그라운드로 실행 중인 Elasticsearch 프로세스를 종료하려면 kill 명령을 사용해야 합니다. 위에서 현재 실행되고 있는 엘라스틱서치의 프로세스 ID는 38850 입니다. **kill 38850** 명령으로 엘라스틱서치를 종료하고 다시 프로세스를 확인하면 프로세스가 종료된 것을 확인할 수 있습니다.

{% code title="kill 명령으로 엘라스틱서치 프로세스 종료" %}

```
$ kill 38850

$ ps -ef | grep elasticsearch
  501 38901 38460   0  8:03AM ttys000    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn elasticsearch
```

{% endcode %}

### -p : 프로세스 ID 파일로 저장

&#x20; **-p <파일명>** 옵션을 추가해 실행된 Elasticsearch 프로세스 ID를 특정 파일에 저장할 수 있습니다. es.pid라는 파일에 실행된 Elasticsearch 프로세스 ID를 저장해 보겠습니다. 명령을 실행한 뒤 es.pid 파일의 내용을 확인하고 실행 중인 프로세스와 비교해 보겠습니다.

{% code title="-p 옵션으로 es.pid 파일에 프로세스 ID 저장" %}

```bash
$ bin/elasticsearch -d -p es.pid

$ ls
LICENSE.txt    README.textile config         es.pid         lib            modules
NOTICE.txt     bin            data           jdk            logs           plugins

$ cat es.pid
39060

$ ps -ef | grep elasticsearch
  501 39060     1   0  8:07AM ttys000    0:39.02 /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-7723664224795657363 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Dio.netty.allocator.type=unpooled -XX:MaxDirectMemorySize=536870912 -Des.path.home=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0 -Des.path.conf=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/config -Des.distribution.flavor=default -Des.distribution.type=tar -Des.bundled_jdk=true -cp /Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/lib/* org.elasticsearch.bootstrap.Elasticsearch -d -p es.pid
...
```

{% endcode %}

&#x20; 위에서 es.pid 에 저장된 내용과 실행중인 프로세스 ID 모두 **39060**인 것을 확인할 수 있습니다. 프로세스 ID가 저장된 es.pid 파일은 실행 중인 Elasticsearch 프로세스를 종료하면 자동으로 삭제됩니다. 이제 이 옵션을 활용해서 Elasticsearch를 데몬으로 실행하는 start.sh 파일과 stop.sh 파일을 만들어 보겠습니다. 각 파일의 내용은 다음과 같이 합니다.

{% tabs %}
{% tab title="\<start.sh> 파일의 내용" %}

```
bin/elasticsearch -d -p es.pid
```

{% endtab %}

{% tab title="\<stop.sh> 파일의 내용" %}

```
kill `cat es.pid`
```

{% endtab %}
{% endtabs %}

&#x20; 위 파일들을 Elasticsearch 홈 경로에 저장하고 실행할 수 있도록 권한을 755로 변경합니다.

{% code title="start.sh, stop.sh 파일 생성 및 실행 권한 부여" %}

```bash
$ echo 'bin/elasticsearch -d -p es.pid' > start.sh

$ echo 'kill `cat es.pid`' > stop.sh

$ chmod 755 start.sh stop.sh
```

{% endcode %}

&#x20; 이제 start.sh를 실행해 Elasticsearch 프로세스가 실행된 것을 확인하고, 다시 stop.sh을 실행해 Elasticsearch 프로세스를 종료 해 보겠습니다.

{% code title="start.sh, stop.sh로 Elasticsearch 실행 및 종료" %}

```bash
$ ./start.sh

$ ps -ef | grep elasticsearch
  501 39259     1   0  8:18AM ttys000    0:09.14 /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/var/folders/0d/m7m670h13pz3lvr9xjz07zk80000gn/T/elasticsearch-5569881625664576635 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Dio.netty.allocator.type=unpooled -XX:MaxDirectMemorySize=536870912 -Des.path.home=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0 -Des.path.conf=/Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/config -Des.distribution.flavor=default -Des.distribution.type=tar -Des.bundled_jdk=true -cp /Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/lib/* org.elasticsearch.bootstrap.Elasticsearch -d -p es.pid
  501 39267 39259   0  8:18AM ttys000    0:00.02 /Users/kimjmin/elastic/getStart/elasticsearch-7.3.0/modules/x-pack-ml/platform/darwin-x86_64/bin/controller
  501 39269 38460   0  8:18AM ttys000    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn elasticsearch

$ ls
LICENSE.txt    README.textile config         es.pid         lib            modules        start.sh
NOTICE.txt     bin            data           jdk            logs           plugins        stop.sh

$ ./stop.sh

$ ps -ef | grep elasticsearch
  501 39291 38460   0  8:19AM ttys000    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn elasticsearch

$ ls
LICENSE.txt    README.textile config         jdk            logs           plugins        stop.sh
NOTICE.txt     bin            data           lib            modules        start.sh
```

{% endcode %}

**start.sh** 명령으로 Elasticsearch 가 백그라운드로 실행되었고, **ls** 명령으로 `es.pid` 파일이 생성된 것을 확인할 수 있습니다. 다시 **stop.sh** 명령으로 Elasticsearch 를 종료 한 뒤에는 `es.pid` 파일이 삭제된 것을 확인할 수 있습니다.
