코알못

[로그 수집] 파이프 라인을 만들어 보자! 본문

BIG DATA

[로그 수집] 파이프 라인을 만들어 보자!

코린이s 2022. 2. 13. 18:58
728x90

로그를 저장소인 S3에 저장하여 EMR 에서 활용할 것이다.

이를 위해서 로그를 아래 아키텍쳐와 같이 구성하는 실습을 진행해본다!

모두 버전은 7.6.0로 맞추었으며, mac 관련 설치 파일을 이용하였으니 맞는 os로 설치 해야 한다.
=================== java =================== 

logstash 의 경우 실행시 java 설치 필요하다는 오류 발생

could not find java; set JAVA_HOME or ensure java is in PATH

// 설치 가능한 버전 확인

$ yum list *java*jdk*
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Available Packages
java-1.7.0-openjdk.x86_64                                       1:1.7.0.261-2.6.22.2.amzn2.0.2                    amzn2-core
java-1.7.0-openjdk-accessibility.x86_64                         1:1.7.0.261-2.6.22.2.amzn2.0.2                    amzn2-core
java-1.7.0-openjdk-demo.x86_64                                  1:1.7.0.261-2.6.22.2.amzn2.0.2                    amzn2-core
java-1.7.0-openjdk-devel.x86_64                                 1:1.7.0.261-2.6.22.2.amzn2.0.2                    amzn2-core
java-1.7.0-openjdk-headless.x86_64                              1:1.7.0.261-2.6.22.2.amzn2.0.2                    amzn2-core
java-1.7.0-openjdk-javadoc.noarch                               1:1.7.0.261-2.6.22.2.amzn2.0.2                    amzn2-core
java-1.7.0-openjdk-src.x86_64                                   1:1.7.0.261-2.6.22.2.amzn2.0.2                    amzn2-core
java-1.8.0-openjdk.x86_64                                       1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-accessibility.x86_64                         1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-accessibility-debug.x86_64                   1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-debug.x86_64                                 1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-demo.x86_64                                  1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-demo-debug.x86_64                            1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-devel.x86_64                                 1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-devel-debug.x86_64                           1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-headless.x86_64                              1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-headless-debug.x86_64                        1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-javadoc.noarch                               1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-javadoc-debug.noarch                         1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-javadoc-zip.noarch                           1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-javadoc-zip-debug.noarch                     1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-src.x86_64                                   1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core
java-1.8.0-openjdk-src-debug.x86_64                             1:1.8.0.312.b07-1.amzn2.0.2                       amzn2-core

// 설치

$ sudo yum install java-1.8.0-openjdk.x86_64

Complete!

// 확인

$ java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

=================== logstash =================== 

- 다운
- 사이트 : https://www.elastic.co/kr/downloads/past-releases#logstash

$ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.6.0.tar.gz
$ tar -xvf logstash-7.6.0.tar.gz
$ cd logstash-7.6.0



- 실행

$ bin/logstash -e '
> input { stdin {} }
> output { stdout {} }'
bye
{
          "host" => "ktm-c387.intra.musiccity.co.kr",
       "message" => "bye",
    "@timestamp" => 2022-02-10T03:18:31.265Z,
      "@version" => "1"
}
hohoho
{
          "host" => "ktm-c387.intra.musiccity.co.kr",
       "message" => "hohoho",
    "@timestamp" => 2022-02-10T03:18:43.333Z,
      "@version" => "1"
}


- 설정 파일 생성후 실행
vi conf/logstash.conf

input{
    stdin{}
}
output{
    stdout{}
}

 

$ bin/logstash -f config/logstash.conf
test
/Users/hongyoolee/document/10.es/logstash/logstash-7.6.0/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
      "@version" => "1",
          "host" => "ktm-c387.intra.musiccity.co.kr",
    "@timestamp" => 2022-02-10T04:46:13.480Z,
       "message" => "test"
}
hihi
{
      "@version" => "1",
          "host" => "ktm-c387.intra.musiccity.co.kr",
    "@timestamp" => 2022-02-10T04:46:16.171Z,
       "message" => "hihi"
}

- 설정 파일 수정후 실행
vi conf/logstash.conf

input {
beats {
port => 5044
host => "0.0.0.0"
}
}
output {
stdout{
codec => dots
}
elasticsearch{
hosts => "0.0.0.0"
index => "servicelog-%{+yyyy.MM.dd}"
}
}

// 실행

bin/logstash -f config/logstash.conf

 

// 로그

[2022-02-12T00:37:34,883][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
.....

// 키바나

- 설정 파일 수정후 실행 

vi conf/logstash.conf

input {
    beats {
        port => 5044
        host => "0.0.0.0"
    }
}
output { 
    stdout{
        codec => dots
    }
    elasticsearch{
        hosts => "0.0.0.0"
        index => "servicelog-%{+yyyy.MM.dd}"
    }
    kafka {
        bootstrap_servers => "kafka-01:9092,kafka-02:9092,kafka-03:9092"
        codec => json
        topic_id => "logstash-test"
      }
}

// logstash console 로그

[2022-02-13T01:30:08,063][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
.....

// elastic search 데이터 확인 (kibana)

// kafka 확인 (s3에 데이터 저장됐는지 확인)

// 실시간으로 데이터 추가

$ echo "{'name':'test'}" >> service.log


=================== elastic search =================== 

- 다운로드 사이트 : https://www.elastic.co/kr/downloads/past-releases#elasticsearch

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.0-darwin-x86_64.tar.gz
$ tar -xvf elasticsearch-7.6.0-darwin-x86_64.tar.gz
$ cd elasticsearch-7.6.0-darwin-x86_64


- 실행

$ bin/elasticsearch


=================== kibana =================== 
- 다운 사이트 : https://www.elastic.co/kr/downloads/past-releases#kibana

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.6.0-darwin-x86_64.tar.gz
$ tar -xvf kibana-7.6.0-darwin-x86_64.tar.gz
$ cd kibana-7.6.0-darwin-x86_64


- 실행 

$ bin/kibana


- UI
http://localhost:5601

=================== filebeat =================== 
- 현재 버전 : filebeat-7.6.0
- 사이트 : https://www.elastic.co/kr/downloads/past-releases#filebeat
- 다운 

$ wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.0-darwin-x86_64.tar.gz
$ tar -xvf filebeat-7.6.0-darwin-x86_64.tar.gz
$ cd filebeat-7.6.0-darwin-x86_64

- 실행 

$ ./filebeat

=================== kafka =================== 

- kafka 셋팅은 아래 참고

2022.01.17 - [BIG DATA] - [AWS] EC2를 이용한 KAFKA 클러스터 구축

2022.01.17 - [BIG DATA] - [AWS] EC2를 이용한 KAFKA Connect 구축

// 셋팅 변경

- 오류 :  If you are trying to deserialize plain JSON data, set schemas.enable=false in your converter configuration

- 해결 : connect 설정 (worker.properties) 변경

value.converter.schemas.enable=false

// 파일 생성 (testdata.json)

{"name":"ddong"}
{"name":"fofo"}

// topic 생성 및 위 파일 쓰기

# producer
/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-console-producer.sh --topic logstash-test --bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092 < testdata.json

// 명령어

# kafka topic check
/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-topics.sh --list --bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092

# consumer 
/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-console-consumer.sh --topic logstash-test --from-beginning --bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092

# delete topic
/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-topics.sh --bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092 --delete --topic logstash-test

// 토픽을 읽어 s3에 전달된 데이터 저장

- API : http://kafka-01:8083/connectors

- request data :

{
    "name": "logstash-test",
    "config": {
        "connector.class": "io.confluent.connect.s3.S3SinkConnector",
        "format.class": "io.confluent.connect.s3.format.json.JsonFormat",
        "storage.class": "io.confluent.connect.s3.storage.S3Storage",
        "topics.regex" : "logstash-test",
        "flush.size": 1,
        "s3.bucket.name": "emr-hong",
        "s3.region": "ap-northeast-2",
        "topics.dir": "data/topics",
        "locale": "ko_KR",
        "timezone": "Asia/Seoul"
    }
}

// 오류 확인

- API : http://kafka-01:8083/connectors/logstash-test/status

- response

{
    "name": "logstash-test",
    "connector": {
        "state": "RUNNING",
        "worker_id": "172.31.50.142:8083"
    },
    "tasks": [
        {
            "id": 0,
            "state": "RUNNING",
            "worker_id": "172.31.50.142:8083"
        }
    ],
    "type": "sink"
}

// s3 데이터 확인

데이터 하나 읽어보면 정상적으로 넘어왔다.

<참고>

1. logstash, filebeat 의 data 경로를 지워야 처음 부터 데이터 전송을 한다.

2. elastic search 실행시 아래와 같은 오류 발생

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release

- 해결 : es 의 jvm 메모리 설정을 기존보다 작게 변경 (컴퓨터 사양에 맞게 설정)

vi conf/jvm.options
-Xms108m
-Xmx108m

3. kibana, elastic search 외부에서 접근이 안될시

- 해결 : 방화벽 확인(kibana 서버 inbound port 가 source ip에 대해 허용 되어 있는지 확인) or kibane config 수정

// kibana config

- server.host 를 0.0.0.0 으로 수정

$ vi config/kibana.yml
# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5601

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "0.0.0.0"

// elastic search config 

- network.host 를 0.0.0.0 으로 수정

vi config/elasticsearch.yml
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
http.port: 9200

4. elastic search error

// error

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

//해결

$ sudo vi /etc/sysctl.conf
vm.max_map_count = 262144
:wq!

 

//error

the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

// 해결

$ vi config/elasticsearch.yml
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
728x90
Comments