ELK Stack 목차
- [ELK Stack] 1. ELK Stack 이란? (Beats, Logstash, Elasticsearch, Kibana)
- [ELK Stack] 2. Elasticsearch, Logstash, Kibana 설치 및 구성
- [ELK Stack] 3. Filebeat와 ELK Stack으로 Apache log 관리
- [ELK Stack] 4. Metricbeat로 System Monitoring
1. 환경 구성
ELK Stack으로 web 서버의 Apache log와 metric data를 분석하고 관리하는 환경을 구성해보려 한다.
우선 AWS EC2로 web 서버와 master 서버를 준비하였다.
web 서버에는 Filebeat와 Metricbeat를 설치하여 Apache log와 시스템 메트릭 data를 수집한다.
master 서버에는 Elasticsearch, Logstash, Kibana를 설치하여 web서버의 data를 집계한다.
2. JAVA 환경 설정
Elasticsearch 및 Logstash 실행을 위해 자바 1.8 이상의 버전을 설치해야 한다.
2.1 JAVA 설치
$ yum list java*jdk-devel
Loaded plugins: fastestmirror, langpacks
Available Packages
java-1.8.0-openjdk-devel.i686 1:1.8.0.275.b01-0.el7_9 updates
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.275.b01-0.el7_9 updates
java-11-openjdk-devel.i686 1:11.0.9.11-2.el7_9 updates
java-11-openjdk-devel.x86_64 1:11.0.9.11-2.el7_9 updates
$ yum -y install java-1.8.0-openjdk-devel.x86_64
$ java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64/jre/bin/java
2.2 JAVA 환경변수 설정
$ vi /etc/profile
# setting java
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
$ source /etc/profile
$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64
3. ElasticSearch / logstash / kibana 설치
RPM(yum)으로 설치하며 systemd를 사용한다.
3.1 Import the Elasticsearch GPG Key
공개 서명키 (public signing key) 설치
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
3.2 Installing from the RPM repository
먼저 최신 버전의 elasticsearch를 yum으로 설치하기 위해 /etc/yum.repos.d/ 디렉토리 아래에 elasticsearch.repo 파일을 만들고 아래와 같이 내용을 입력한다.
$ vi /etc/yum.repos.d/Elastic.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
파일을 추가한 후 yum명령을 이용해 Elasticsearch, Logstash, Kibana를 설치한다.
$ sudo yum -y install elasticsearch logstash kibana
$ yum list elasticsearch logstash kibana
3.3 ELK 환경 설정
3.3.1 jvm.options
Elasticsearch과 Logstash는 Java Runtime 가상머신 위에서 실행되는데 1gb의 힙 메모리가 기본으로 설정되어 있다. (7.0 기준) 원활한 환경을 위해 jvm.options 파일에서 아래 내용들을 수정한다.
# elasticsearch
$ vi /etc/elasticsearch/jvm.options
# -Xms1g
# -Xmx1g
-Xms2g
-Xmx2g
# logstash
$ vi /etc/logstash/jvm.options
# -Xms1g
# -Xmx1g
-Xms2g
-Xmx2g
(테스트용 master서버는 2Core/4GB라 logstash는 1g로 설정함)
3.3.2 elasticsearch.yml
elasticsearch 실행 환경에 대한 설정들은 대부분 elasticsearch.yml 파일에서 설정한다. YAML 파일이기 때문에 옵션을 설정할 때는 들여쓰기에 유의해야 한다.
vi /etc/elasticsearch/elasticsearch.yml
...
# -------------------- Cluster --------------------
cluster.name: suyeon-app
# -------------------- Node --------------------
node.name: suyeon.elktest.com
# -------------------- Paths --------------------
path.data: /ELK/elasticsearch # 별도 disk
path.logs: /ELK/log/elasticsearch # 별도 disk
# -------------------- Network --------------------
network.host: 0.0.0.0 # ANY
http.port: 9200
# -------------------- Discovery --------------------
discovery.seed_hosts: ["192.168.56.x", "127.0.0.1", "[::1]"] # my IP
cluster.initial_master_nodes: ["suyeon.elktest.com"]
node.master: true
cluster.name
: 클러스터 명 설정 (default는 elasticsearch이며 충돌을 방지하기 위해 반드시 고유한 이름으로 설정 필요)node.name
: elasticsearch 노드 명 설정path.data
: 색인된 데이터를 저장하는 경로 지정path.logs
: elasticsearch 실행 로그를 저장하는 경로 지정bootstrap.memory_lock
: Elasticsearch가 사용중인 힙메모리 영역을 다른 자바 프로그램이 간섭 못하도록 미리 점유하는 설정 (항상 true로 사용하는 것을 권장)network.host
: Elasticsearch가 실행되는 서버의 ip 주소 (default는 127.0.0.1(loopback)이며 0.0.0.0으로 설정 시 ANY로 통신이 가능)http.port
: Elasticsearch가 클라이언트와 통신하기 위한 http 포트를 설정 (default는 9200이며, 포트가 이미 사용 중인 경우 9200 ~ 9299 사이 값을 차례대로 사용)transport.port
: Elasticsearch 노드들 끼리 서로 통신하기 위한 tcp 포트를 설정 (default는 9300이며, 포트가 이미 사용 중인 경우 9300 ~ 9399 사이 값을 차례대로 사용)cluster.initial_master_nodes
: 클러스터가 최초 실행 될 때 명시된 노드들을 대상으로 마스터 노드를 선출node.master
: 마스터 후보(master eligible) 노드 여부를 설정
디스크 용량 및 성능 관리차원에서 로그파일 및 데이터파일을 별도로 분리 저장하여 관리하는 것이 좋다. 이를 위해 EBS를 새로 생성하여 마운트하였다.
yml 파일에 설정한 데로 data와 log 파일을 담을 디렉토리를 생성하고 권한을 설정해야 한다.
$ mkdir -p /ELK/elasticsearch
$ mkdir -p /ELK/log/elasticsearch
$ chown -R elasticsearch.elasticsearch /ELK
3.3.3 logstash.yml
logstash에 대한 설정 또한 logstash.yml 파일에서 설정한다.
$ vi /etc/logstash/logstash.yml
# -------------------- Data path --------------------
#path.data: /var/lib/logstash
path.data: /ELK/logstash
# -------------------- Data path --------------------
#path.logs: /var/log/logstash
path.logs: /ELK/log/logstash
pipeline.batch.size
: 개별 worker 스레드가 input에서 수집할 최대 이벤트 개수 설정. 일반적으로 배치크기가 클수록 효율적이지만 메모리 오버해드가 증가함. (default : 125)pipeline.batch.delay
: 크기가 작은 배치를 pipeline worker에게 발송하기 전 각 이벤트를 기다리는 시간 (default : 50ms)
logstash 또한 data와 log 디렉토리를 따로 관리하자.
$ mkdir -p /ELK/logstash
$ mkdir -p /ELK/log/logstash
$ chown -R logstash.logstash /ELK
3.3.4 kibana.yml
$ vi /etc/kibana/kibana.yml
#server.port: 5601
server.port: 5601
#server.host: "localhost"
server.host: "0.0.0.0"
#server.name: "your-hostname"
server.name: "ktds.elklab.com"
#elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.hosts: ["http://localhost:9200"] # or server IP
server.port
: kibana가 통신할 포트 설정 (Default : 5601)server.host
: 백엔드 서버의 host IP 지정 (Default는 "localhost"이며, 원격 사용자의 연결을 허용하려면 kibana 서버의 IP주소 또는 DNS 이름으로 설정server.name
: kibana 인스턴스 명 설정elasticsearch.hosts
: 모든 쿼리에 사용할 Elasticsearch 인스턴스의 url 설정 (설정된 모든 노드는 동일한 클러스터에 있어야 함)
3.4 Run ELK Service
Elasticsearch 서비스
$ sudo /bin/systemctl daemon-reload
# To configure Elasticsearch to start automatically when the system boots up, run the following commands
$ sudo chkconfig --add elasticsearch
$ sudo systemctl enable elasticsearch.service
# Elasticsearch can be started and stopped as follows
$ sudo systemctl start elasticsearch.service
$ sudo systemctl stop elasticsearch.service
logstash 서비스
$ sudo chkconfig --add logstash
$ sudo systemctl enable logstash.service
$ sudo systemctl start logstash.service
kibana 서비스
$ sudo chkconfig --add kibana
$ sudo systemctl enable kibana.service
$ sudo systemctl start kibana.service
3.5 상태 확인
elasticsearch
$ sudo systemctl status elasticsearch
$ ps-ef | grep elasticsearch
logstash
$ systemctl status logstash.service
$ ps -ef | grep logstash
kibana
$ systemctl status kibana.service
$ ps -ef | grep kibana
네트워크 상태 (port) 확인
$ netstat -nlp | grep 9200
$ netstat -nlp | grep 5601
3.6 방화벽 open
$ firewall-cmd --add-port=9200/tcp --permanent --zone=public
$ firewall-cmd --add-port=9300/tcp --permanent --zone=public
$ firewall-cmd --add-port=5443/udp --permanent --zone=public
$ firewall-cmd --add-port=5443/tcp --permanent --zone=public
$ firewall-cmd --add-port=5601/tcp --permanent --zone=public
$ firewall-cmd --reload
$ firewall-cmd --list-all
...
ports: 9200/tcp 9300/tcp 5443/udp 5443/tcp 5601/tcp
...
master 서버의 인바운드 규칙을 아래와 같이 설정하였다.
4. Checking ELK stack
4.1 Elasticsearch running 테스트
$ curl -X GET "localhost:9200/?pretty"
{
"name" : "Cp8oag6",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "AT69_T_DTp-1qgIJlatQqA",
"version" : {
"number" : "7.10.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "f27399d",
"build_date" : "2016-03-30T09:51:41.449Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "1.2.3",
"minimum_index_compatibility_version" : "1.2.3"
},
"tagline" : "You Know, for Search"
}
4.2 Elasticsearch web 접속 테스트
4.3 Kibana 접속 테스트