RDB와 Elasticsearch 데이터를 동시에 관리한다는 것이 정말 쉽지 않았다.
Logstash를 알기 전까지는 말이다...
RDB와 Elastcisearch를 동시에 관리할 수 있는 환경을 만들어보자.
CREATE TABLE post_tb
(
post_idx SERIAL NOT NULL,
post_title varchar(32) NOT NULL,
post_contents varchar(32) NOT NULL,
updated_at timestamp DEFAULT NOW(),
created_at timestamp NOT NULL DEFAULT NOW(),
deleted_at timestamp ,
PRIMARY KEY (post_idx)
);
COMMENT ON TABLE post_tb IS '게시글 테이블';
간단한게 테이블 하나 만들었다.
꼭 언제 데이터가 변경된 순간을 기록하는 컬럼을 만들어야 한다.
LogStash가 Postgresql에 접근해서 데이터를 읽어와야한다. 그걸 도와주는 프로그램이다.
jar파일을 설치하였다면 logstash 폴더에 넣어주면 된다.
mv postgresql-42.6.0.jar /usr/share/logstash
input {
jdbc {
jdbc_connection_string => "jdbc:postgresql://{아이피}/{디비}"
jdbc_user => "{DB 사용자}"
jdbc_password => "{DB 사용자 비밀번호}"
jdbc_driver_library => "/usr/share/logstash/postgresql-42.6.0.jar"
jdbc_driver_class => "org.postgresql.Driver"
tracking_column => "{추적할 컬럼}" # 필자는 updated_at
tracking_column_type => "timestamp"
statement => "SELECT * FROM post_tb WHERE (updated_at > :sql_last_value AND updated_at < NOW()) ORDER BY updated_at ASC"
schedule => "* * * * *" # 1분 마다 실행
}
}
output {
elasticsearch {
hosts => ["{아이피:포트}"]
index => "{Elastcisearch 인덱스 이름}"
document_id => "%{[post_idx]}" # 만든 테이블의 P key Column 이름을 입력
# 아래 두개는 ES에 SSL인증서를 걸어 사용자와 비밀번호가 있어야만 접근 가능하게 해놔서 필요한 내용
user => "{Elasticsearch 사용자 이름}"
password => "{Elasticsearch 사용자 비밀번호}" #
}
stdout {} # 잘 들어가는지 보기 위함
}
SELECT * FROM post_tb
WHERE
(updated_at > :sql_last_value
AND
updated_at < NOW())
ORDER BY
updated_at ASC
자세한 내용은 여기서 보면 좋을 것 같다.
./bin/logstash -f logstash.conf
마지막으로 실행하면 끝!
매번 RDB와 ES데이터를 어떻게 동시에 관리해야 할 지 머리가 아팠다. 이렇게 동기화할 수 있다는 사실을 몰랐으니 당연히 애를 먹을 수 밖에 없었던 것 같다...
다만 이 방법도 생각해야할 부분이 꽤 있다. 매 번 LogStash가 PostgreSQL에 주기적으로 SELECT
문을 날려야하니 완벽한 실시간 Sync라고는 할 수 없다.
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.