본문 바로가기
DS

elasticsearch cluster and filebeat with kibana

by ByteBridge 2018. 3. 16.
반응형


파일 분석을 위해 엘라스틱 과 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 로 모니터링 하기 이다.

반응형