-
Notifications
You must be signed in to change notification settings - Fork 28
Elasticsearch 도커에서 직접 설치로 구성 변경하기
October 30, 2021
- 구성
- EC2 3대로 구성, 서브넷은 PROLOG-a로 맞춤.
- 키바나는 별도 ec2로 구성
- 각 인스턴스는 t2.medium / ram 4gb / storage 30g
- 인스턴스 명 양식: Prolog-elk-es0{number}-prod / Prolog-elk-es0{number}-dev
- 내가 원하는 그림
-
보안그룹 추가 내역 dev까지 등록하고 나서는 9300에 대해서 모든 포트를 열어주었음..
-
보안그룹 관련 브라운께서 알려주신 방법
같은 보안그룹 내부에서는 포트를 다 뚫어주는 방법 포트를 9200~9300과 같이 설정해서 사용할 수도 있다.
- 인스턴스 정보
--- prod ---
prolog-elk-es01-prod
public: 52.78.179.83
prolog-elk-es02-prod
public: 52.78.36.28
prolog-elk-es03-prod
public: 13.125.25.250
--- dev ---
prolog-elk-es01-dev
public: 3.35.50.198
prolog-elk-es02-dev
public: 13.125.159.157
prolog-elk-es03-dev
public: 13.209.81.148
- 설치
https://elastic.co/downloads 에서 본인의 OS에 맞는 것을 다운로드 받으면 된다. elastic 7.X 이후 버전부터는 java가 포함되어있다고 함.
es
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.1-linux-x86_64.tar.gz
kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.15.1-linux-x86_64.tar.gz
logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.15.1-linux-x86_64.tar.gz
현재 logstash는 적용되어있지 않음.
- 압축 풀기
tar -xvzf
elk를 다운받을 때에는 버전을 맞춰서 다운받는 것이 좋다. 호환성 문제가 발생할 수 있음!
- 백그라운드에서 실행하기
bin/elasticsearch -d -p ELASTIC
# 여기서 ELASTIC은 PID임. 마음대로 변경 가능
cat ELASTIC
pkill -F ELASTIC
포함되어있어서 설치안하려 했지만.. JAVA_HOME이 Deprecated 될거라는 Warning을 보고 싶지 않았기 때문에 java11을 추가적으로 설치해주었다.
sudo apt update && sudo apt install openjdk-11-jdk -y
- 환경변수 설정
ES_JAVA_HOME 환경변수를 설정해주지 않아도 실행은 된다. 하지만 JAVA_HOME이 Deprecated 될거라는 Warning이 뜬다.
sudo vi /etc/profile
export ES_JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
source /etc/profile && source ~/.bashrc (이건 유저이름 설정때문)
- 메모리 스왑 비활성화
왜 비활성화해야할까?
* background스와핑이 일어나면 가상 메모리의 일부 내용을 디스크로 쓰기 위해 디스크의 일정 영역을 스왑 영역으로 만든다. 이 때 일어나는 동기화 작업에 의해 순간적으로 시스템 성능이 떨어지고 자칫 시스템 장애로 이어질 수 있다.
- why
엘라스틱 서치가 동작하는 데 필요한 메모리도 스와핑으로 인해 언제든 디스크로 스와핑될 수 있다. 스와핑이 발생할 경우 노드 안정성에 치명적이기 때문에 이를 최대한 피해야한다. 메모리를 많이 사용하는 es 특성 상 스와핑 작업에 의해 gc가 비정상적으로 오래 지속된다거나 노드의 응답이 느려질 수 있다.
es를 포함한 대부분의 분산 시스템에서는 전체적인 클러스터의 안정성을 해치는 것보다는 문제가 발생한 노드가 강제로 종료되어 클러스터 구성에서 제외되는 편이 훨씬 효율적이다. 따라서 스와핑을 피하는 것이 더 낫다.
sudo swapoff -a
- jvm.options
왜 물리 램의 50%를 jvm heap에 할당했을까?
엘라스틱서치 샤드는 내부에 루씬을 가지고 있으며 루씬은 세그먼트 생성 및 관리를 위해 커널 시스템 캐시를 최대한 많이 활용하고 있다. 실시간 검색을 지원하기 위해서는 루씬이 최대한 많은 시스템 캐시를 확보하도록 지원하는 것이 좋다. 따라서 물리적인 메모리의 50%는 운영체제가 자유롭게 사용하도록 할당하고 나머지 50%정도를 heap으로 할당하는 것이 적절하다.## Heap
## Set half of physical ram
-Xms2g
-Xmx2g
- elasticsearch.yml
es01
cluster.name: "prolog-cluster"
node.name: "node01"
network.host: ["_local_", "_site_"]
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["es02", "es03"]
cluster.initial_master_nodes: ["node01", "node02", "node03"]
bootstrap.memory_lock: true
xpack.license.self_generated.type: trial
xpack.monitoring.collection.enabled: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.path: certs/prolog-cluster.p12
xpack.security.transport.ssl.truststore.path: certs/prolog-cluster.p12
- /etc/hosts dev에도 동일하게 작업한다.
{privateIP} es01
{privateIP} es02
{privateIP} es03
- /etc/security/limits.conf
왜 제한을 해제해줘야할까?
특정 노드가 Too many open files 에러를 내며 장애를 발생하는 경우가 있다. 엘라스틱 서치에서 추가 리소스를 사용하기 위해 파일 형태로 운영체제에 리소스 할당을 요청했고, 프로세스의 ulimit 제한에 걸려 리소스 할당에 실패한 경우 해당 장애가 발생할 수 있다.- 첫번째 줄은 Max Open File 제한 해제
- 두번째, 세번째줄은 Memory Lock에 대해서 무제한 해제
ubuntu - nofile 65536
ubuntu soft memlock unlimited
ubuntu hard memlock unlimited
설정 후 sudo reboot을 통해 재부팅해주어야함.
- 변경 후 ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15620
max locked memory (kbytes, -l) unlimited (이전 65536)
max memory size (kbytes, -m) unlimited
open files (-n) 65536 (이전 1024)
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15620
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
- /etc/sysctl.conf
가상 메모리 확보를 위해 nmap 카운트를 늘려준다.
vm.max_map_count 설정
루씬은 내부적으로 자바에서 제공하는 NIO 기술을 활용한다. 이를 통해 OS 커널에서 제공하는 nmap 시스템콜을 직접 호출할 수 있으며 이를 통해 vm 없이 바로 커널 모드로 진입할 수 있어 높은 성능을 낼 수 있다. 따라서 루씬이 원활하게 동작하기 위해서는 가상 메모리 설정 중 nmap을 크게 변경해주는 것이 좋다. nmap 시스템콜을 내부적으로 많이 사용하기 때문이다.vm.max_map_count=262144
sudo sysctl -p 로 변경 저장
- 보안 설정
보안 관련 모든 사항 elk/elasticsearch-7.15.1 디렉토리 안에서 진행
모든 노드
라고 표시되어있는 것은 모든 노드에 다 해줘야하고, 아닌 것은 한 노드에서만 중점으로 진행해도 된다.
모든 노드
bin/elasticsearch-certutil ca
Please enter the desired output에는 그냥 엔터 누르고, 다음 password는 본인이 하고 싶은 password
config아래 certs라는 폴더를 만든다.
모든 노드
mkdir config/certs
p12 생성하기
./bin/elasticsearch-certutil cert \
--ca elastic-stack-ca.p12 \
--dns es01,es02,es03 \
--ip {private ip of es01},{private ip of es02},{private ip of es03} \
--out config/certs/prolog-cluster.p12
모든 노드
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
.p12 파일 로컬로 가져오기
scp -i {pem-key}.pem ubuntu@{public ip of node01}:/home/ubuntu/elk/elasticsearch-7.15.1/config/certs/prolog-cluster.p12 .
.p12 파일 node02와 node03으로 옮기기
scp -i {pem-key}.pem ./prolog-cluster.p12 ubuntu@{public ip of node02}:/home/ubuntu/elk/elasticsearch-7.15.1/config/certs/prolog-cluster.p12
scp -i brown-x100-key.pem ./prolog-cluster.p12 ubuntu@{public ip of node03}:/home/ubuntu/elk/elasticsearch-7.15.1/config/certs/prolog-cluster.p12
유저와 패스워드 지정
마스터 노드에 대해 한 곳만 진행해주면 모두 적용됨.
주의: running된 상태로 진행해야함.
bin/elasticsearch-setup-passwords interactive
- kib_system password를 기억하자.
보안설정 끝
- 노리 플러그인 설치하기
bin/elasticsearch-plugin install analysis-nori
플러그인 설치 후 elasticsearch 재부팅은 필수!
- 까묵을 우려로 실행방법도 적어둠
bin/elasticsearch -d -p PID
쉘 스크립트 만들까 하다가 명령어도 외울 겸 안만듦
es01만 외부로 뚫어두어서 확인하려면 es01을 활용해야한다.
curl -u {user}:{password} 52.78.179.83:9200
prolog-elk-kib01-prod
public: 13.125.159.249
prolog-elk-kib01-dev
public: 3.36.95.101
- 보안 설정
bin/kibana-keystore create
bin/kibana-keystore add elasticsearch.password
- config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
server.name: "prolog-kibana"
elasticsearch.hosts: ["http://{public ip of es01}:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: {password}
여기서 password는 위에서 bin/elasticsearch-setup-passwords interactive
명령 수행 시 입력했던 kib_system 패스워드이다.
- 실행
bin/kibana
데몬 실행을 하고 싶다면 여러 방법이 있겠지만 node.js를 활용하는 방법을 선택했다.
- nvm 설치하기
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
cat package.json에서 node 버전을 확인한다.
- 확인한 버전의 node.js 설치
nvm install 14.17.6
- pm2 설치
npm install pm2 -g
- 실행
pm2 start kibana-7.15.1-linux-x86_64/src/cli/cli.js --name kibana
username과 password는 bin/elasticsearch-setup-passwords interactive 시 지정해줬던 elastic user에 대한 password를 입력하면 된다.
- 키바나 대시보드: http://13.125.159.249:5601/app/dev_tools#/console
- 키바나 대시보드 for dev: http://3.36.95.101:5601/app/dev_tools#/console
- bash 별칭 지정: https://joanne.tistory.com/195
- jvm 옵션 설정: 엘라스틱 실무 가이드 도서
bin/elasticsearch 실행 시 cluster를 동일하게 설정해주었는데도 각각 새로운 노드로 생성이 되며, 로그 확인 시 id가 같아서 node를 추가할 수 없다는 예외가 뜨는 경우이다.
- 상황
여러대의 서버에 Node를 분산하여 처리하기 위해 한 서버에서 사용했던 Elasticsearch 폴더를 그대로 복사하여 Node Instance를 실행 시 위와 같은 이슈가 발생한다.
내용의 의미는 다른 node instance가 실행 되었는데, 같은 id를 가지고 있다는 의미! 해결 방법은 Elasticsearch 폴더 내에 있는 data 폴더의 내용을 삭제 후 모든 Node를 재시작하면 해결된다.