ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • elasticsearch cluster and filebeat with kibana
    Tech/DS 2018. 3. 16. 17:38
    반응형


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

    반응형
Designed by Tistory.