본문 바로가기
CentOS 7

MongoDB를 집계하여 LogStash로 MySQL에 넣자

by 2세1의 행복한 개발 2020. 5. 11.
반응형

안녕하세요 오늘은

MongoDB에 로그를 쌓은 후에

해당 데이터를 집계한 후 LogStash로 MySQL에 데이터를 넣겠습니다

 

도커설치

https://devel-lee.tistory.com/4

 

[CentOS7] 도커 설치하기

앞으로 개발할 개발환경을 세팅하기 위하여 도커를 선택했습니다 여러 개발환경이 필요하기 때문에 서버적 부담이 있기 때문에 컨테이너를 통하여 하나의 서버로 개발하겠습니다 우선 aws ec2에

devel-lee.tistory.com

LogStash 설치

docker pull logstash로 이미지를 받으신 후

docker image ls로 생성된 이미지를 확인해주세요

docker run -it --rm docker.elastic.co/logstash/logstash:7.6.2 logstash -e 'input { stdin { } } output { stdout { } }'

정상적으로 설치되었나 확인입니다. 다른 설정파일을 수정하지 않고 바로 실행이 됩니다

약 1~2분정도 실행을 기다린 뒤

텍스트가 입력되면 바로 output을 줍니다

 

mongodb에서 데이터 가져오기

1. logstash-input-mongodb

2. JDBC Driver를 이용한 input

3. MongoDB -> file

 

처음에는 1,2번 쪽으로 생각을 했으나 

둘다 정식으로 지원하는 방법이 아니고 제한이 많아서 3번으로 선택했습니다

로그를 쌓다보면 부하가 걸리기 때문에 추천합니다

 

우선 여러가지 방법으로 file을 만들겠지만

저는 nodejs를 이용하여 짧은 코드로 파일을 만들었습니다

 

nodejs 설치

curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
yum -y install nodejs
node -v
npm install mongodb --save

nodejs를 설치한 후 mongoDB Client까지 설치했습니다

 

test.js

var mongodb = require("mongodb");

var client = mongodb.MongoClient;
var url = "mongodb://SERVERIP:27017/";

client.connect(url, function (err, client) {

    var db = client.db("test");
    var collection = db.collection("first");

    var query = {};

    var cursor = collection.find(query);

    cursor.forEach(
        function(doc) {

                console.log(JSON.stringify(doc));
        },
        function(err) {
            client.close();
        }
    );

});

우선 db에 접근하여 간단한 find로 json을 만드는 파일입니다

node /etc/nodejs/test.js > /etc/logstash/test.json

몽고의 테스트 데이터가 이렇게 생성된걸 확인하실 수 있습니다

위치는 크게 중요하지 않습니다

저는 etc아래 마음대로 생성했습니다

 

Logstash.conf

mkdir /etc/logstash로 폴더를 하나 만들어주세요

vi /etc/logstash/json.conf

 

mysql jar URL

https://dev.mysql.com/downloads/connector/j/

input {

        file {

                path => "/etc/logstash/test.json"
                start_position => "beginning"
                type => "json"
                file_completed_action => "log_and_delete"
                file_completed_log_path => "/etc/logstash/log/logs.log"
                ignore_older => 0
        }

}

filter {

        json {
                source => "message"
                target => "data"
        }


        split {
                field => "data"
        }

        mutate {
                add_field => {
                        "name" => "%{[data][name]}"
                }
        }

}


output {


        jdbc {
                driver_jar_path => "/etc/logstash/mysql-connector-java-5.1.49.jar"
                driver_class => "com.mysql.jdbc.Driver"
                connection_string => "jdbc:mysql://MYSQLSERVER:3306/test?user=USER&password=PWD"
                statement => [ "INSERT INTO output_table (name) VALUES(?)", "name" ]
        }

  stdout {

    codec => "rubydebug"

  }

}

vi로 편집하다보니까 공백이 좀 많습니다

json파일을 읽어서 mysql로 입력하는 conf파일입니다

 

docker run -it --rm -v "$PWD":/etc/logstash a logstash -f /etc/logstash/json.conf 

docker를 실행시켜서 정상적으로 데이터가 들어가는지 확인해주세요

 

이렇게 데이터가 잘 들어간것을 확인하실 수 있습니다

 

'CentOS 7' 카테고리의 다른 글

셀리눅스(selinux) 권한 설정하기  (0) 2020.09.25

댓글