파일 분석을 위해 엘라스틱 과 filebeat , kibana 를 사용하도록 한다.
spring boot 어플리케이션에서 발생하는 로그를 filebeat 로그 수집기를 통해 엘라스틱 으로 쌓은 후 kibana 를 통한 대시보드로 모니터링 하도록 한다.
최종적인 결과는 아래 그림과 같다.
# 파일 분석 시스템의 구성 설명
3 대의 물리적 머신에 엘라스틱서치를 클러스터링 하도록 한다. standby / active 로 구성 하기 위해 3대의 노드들 모두 master 설정을 하였다. master 노드들 도한 데이터를 저장 하도록 한다. 아래 설치 정보들은 모든 노드들에 공통으로 적용 한다. elasticsearch 의 jvm.option 설정은 하지 않았음. 시스템 퍼포먼스는 테스트 진행후 해도 되기때문에 나중에 하도록 한다. elasticsearch,kibana,logstash 등 기타 정보들에 대한 인증 설정을 위해 x-pack 을 적용한다. x-pack 은 모든 노드들의 elasticsearch,kibana,logstash 등 모든 제품들에 개별적으로 설치 해주어야 한다. (추후 기본으로 설치 된다고도 함) x-pack 적용시 이점은 클러스터링 상태 모니터링 및 각종 관리들을 kibana 웹기반으로 편리하게 관리 가능하다는것, 그리고 이외 +++ x-pack 은 라이센스가 있어야 사용가능함. x-pack 최초 설치시 한달 무료 적용 된다. x-pack basic license 는 무료이며, 1년단위로 라이센스를 적용해주어야 한다. 신청하면 이메일로 다운로드 링크를 받게 되며, 라이센스 적용은 공식 홈페이지에 자세히 나와있으므로 큰 무리 없이 적용 할 수있다. 현재 테스트하려는 시스템에서는 인증은 필요 없기때문에 설치 및 적용은 하지 않도록 한다. |
# 참고 및 시스템 정보
- 참고 http://kimjmin.net/2018/01/2018-01-setting-es-cluster-1/ - OS CentOS 7 - es version elasticsearch 6.x |
# 각 엘라스틱 서버이름을 변경하기 위해 시스템의 hostname 을 변경하도록 한다. (서버 1,2,3 모두 동일)
hostnamectl set-hostname es-data-1 hostnamectl set-hostname es-data-2 hostnamectl set-hostname es-data-3 >>>>> or vi /etc/sysconfig/network HOSTNAME=es-master |
# hostname 변경 적용을 위해 시스템을 재시작 하도록 한다.
reboot
# jdk 1.8 설치 (엘라스틱서치는 자바기반이므로 jdk 를 설치 해야함.)
yum install -y java-1.8.0-openjdk-devel.x86_64 |
# 엘라스틱 설치 (rpm 패키지로 설치하기 위해 아래 repo 생성 및 설치 - 서버 1,2,3 모두 동일)
vi /etc/yum.repos.d/elasticsearch.repo [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md |
yum -y install elasticsearch
# 엘라스틱 서치 설정 (서버 1,2,3 모두 동일 )
# 클러스터링 이름 설정 cluster.name: es-cluster # 해당 노드가 마스터가 되도록설정 node.master: true # 해당 노드에 데이터를 저장하도록 설정 (만약 마스터 역할만 할경우 false 로 설정) node.data: true # 해당 노드의 이름 (위에서 설정한 이름으로 할것이므로 시스템의 hostname 으로 설정) node.name: ${HOSTNAME} # 해당 노드에 접근하도록 하기 위한 설정 (ip or _local_, _global_ etc...) network.host: _site_ # 클러스터링 되어있는 노드들간의 유니캐스팅 하기 위해 각 노드들의 ip:port 설정 (내부아이피) discovery.zen.ping.unicast.hosts: ["10.10.10.1:9300","110.10.10.2:9300","10.10.10.3:9300"] |
*** jvm.options 를 비롯한 시스템 퍼포먼스를 위한 설정을 해야하지만 기본으로도 현재 시스템에서는 문제가 없으므로 패스 하도록 한다.
#엘라스틱 서치 구동 및 재시작시 자동 시작되도록 등록
systemctl enable elasticsearch
systemctl start elasticsearch
# 엘라스틱 서치 클러스터 상태 확인
http://10.10.10.1:9200/_cat/health?v&pretty
http://10.10.10.2:9200/_cat/health?v&pretty
http://10.10.10.3:9200/_cat/health?v&pretty
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1521187495 04:04:55 es-cluster green 3 3 85 42 0 0 0 0 - 100.0%
# 엘라스틱 서치 클러스터 노드 확인
http://10.10.10.1:9200/_cat/nodes?v&pretty
http://10.10.10.2:9200/_cat/nodes?v&pretty
http://10.10.10.3:9200/_cat/nodes?v&pretty
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.10.10.1 23 25 43 0.01 0.03 0.05 mdi * es-data-1
10.10.10.2 44 43 42 0.00 0.01 0.05 mdi - es-data-2
10.10.10.3 30 89 0 0.01 0.03 0.05 mdi - es-data-3
참고로 shards ,replica 설정은 index 설정시 해주면 된다.
#kibana 설치를 위해 repo 설정 후 설치하도록 한다.
#서버 1,2,3 모두 동일하게 설치해준다. (fail over 를 위해 )
vi /etc/yum.repos.d/kibana.repo
[kibana-6.x]
name=Kibana repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
#kibana 설치 및 시작 , 부팅시 자동 시작되도록 등록
yum -y install kibana
systemctl enable kibana
systemctl start kibana
# kibana 구성 설정 (서버 1,2,3 모두 동일)
vi /etc/kibana/kibana.yml
# 외부접근 포트 설정
server.port: 5601
server.host: "10.10.10.1" #서버 아이피
# elasticsearch 접근 url 지정
elasticsearch.url: "http://10.10.10.1:9200"
kibana 재시작
# logstash 설치 (여기서 logstash 사용은 하지 않는다 , 하지만 설치 방법을 기록하기위해 작성함)
vi /etc/yum.repos.d/logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
</pre>
yum -y install logstash
#부팅시 자동 시작하도록 logstash 등록
systemctl enable logstash
#logstash 시작
systemctl start logstash
<pre>
logstash 는 무겁기 때문에 앞으로 파일 로그 혹은 특정 시스템으로부터 로그를 받을경우 beat 를 사용하도록 한다.
beat를 각 시스템들에 agent 형식으로 설치 후 logstash 로 데이터를 전송하도록 설정한다.
beat는 가볍고 단독으로 설치 후 logstash 와 연동 할수있다.
#kibana 샘플 데이터 테스트 (공식 가이드 데이터를 기준으로 테스트함)
참고:
6.x 설치하였기때문에 6.0 튜토리얼 참고 하였으며, 5.x 버전은 한글번역이 되어있어서 참고함.
https://www.elastic.co/guide/en/kibana/6.0/tutorial-load-dataset.html
https://www.elastic.co/guide/kr/kibana/current/tutorial-visualizing.html
6.x 버전의 샘플 데이터를 가이드 대로 따라 함
#filebeat 설치
vi /etc/yum.repos.d/filebeat.repo
[filebeat-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
yum -y install filebeat
#filebeat 설정
vi /etc/filebeat/filebeat.yml
filebeat.prospectors:
#log파일 경로 설정은 패턴 설정으로도 가능함.
#공식 가이드에 잘 나와있으므로 경로 설정은 공식 가이드를 참고하도록 한다.
- type: log
enabled: true
paths:
- "log file path"
##### elasticsearch ##########
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["10.10.10.1:9200","10.10.10.2:9200","10.10.10.3:9200"]
setup.kibana:
host: "10.10.10.1:port"
host: "10.10.10.2:port"
host: "10.10.10.3:port"
#spring boot 프로젝트 생성
- maven project
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.elk</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<-- DateUtils 사용을 위해 추가함 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1초에 한번씩 로그를 쌓도록 한다.
#logback 설정
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/demo.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>labatory.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-4relative --- [ %thread{10} ] %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="info"/>
<logger name="org.hibernate" level="debug"/>
<root level="debug">
<appender-ref ref="FILE"/> <!-- File로 로그를 남기고자 할 때 사용 -->
</root>
</configuration>
#로그 발생하도록 코드 추가.
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Scheduled(fixedRate = 1000)
public void demo(){
System.out.println("XXX");
log.info("demo",DateUtils.addHours(new Date(),1).toString());
}
}
서비스를 실행 시키면 1초에 한번씩 로그를 쌓게 된다.
또한 filebeat 가 해당 파일을 읽어서 output 으로 elasticsearch 로 로그를 전송 하게 된다.
kibana 에서 indexpattern 추가 및 discover 에서 해당 index pattern 기반으로 로그들을 볼수 있게 된다.
filebeat 를 통해 elasticsearch 에 로그를 쌓게 되면 기본적으로 filebeat-버전명-날짜 패턴으로 생성 된다. (이부분도 설정 가능할까?)
엘라스틱에 생성된 index 들을 보기 위해서는 아래와같이 요청하면 볼수있게 된다.
http://10.10.10.1:9200/_cat/indices?v&pretty
http://10.10.10.2:9200/_cat/indices?v&pretty
http://10.10.10.3:9200/_cat/indices?v&pretty
여기까지 간단하게 엘라스틱 서치 클러스터링 및 파일 수집기인 filebeat 를 통해 로그를 수집한 후 kibana 로 모니터링 하기 이다.