RDB - ES 데이터 동기화 하기

민경찬·2023년 8월 17일
0

백엔드

목록 보기
13/20
post-thumbnail

RDB와 Elasticsearch 데이터를 동시에 관리한다는 것이 정말 쉽지 않았다.

Logstash를 알기 전까지는 말이다...

RDB와 Elastcisearch를 동시에 관리할 수 있는 환경을 만들어보자.



Psql 테이블 만들기

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 '게시글 테이블';

간단한게 테이블 하나 만들었다.

꼭 언제 데이터가 변경된 순간을 기록하는 컬럼을 만들어야 한다.

JDBC설치하기

LogStash가 Postgresql에 접근해서 데이터를 읽어와야한다. 그걸 도와주는 프로그램이다.

https://jdbc.postgresql.org/download/

jar파일을 설치하였다면 logstash 폴더에 넣어주면 된다.

mv postgresql-42.6.0.jar /usr/share/logstash

3. 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 {} # 잘 들어가는지 보기 위함
}

4. Query 살펴보기

SELECT * FROM post_tb 
	WHERE 
    	(updated_at > :sql_last_value 
    AND 
    	updated_at < NOW()) 
	ORDER BY 
    	updated_at ASC
  1. sql_last_value
    • JDBC가 지원해주는 기능으로 마지막 sql 값을 가져올 수 있다. 콜론을 붙여 JDBC에서 지원하는 기능임을 명시해주어야 한다. ( 그렇지 않으면 일반 문자열 취급한다. )
  2. updated_at > :sql_last_value
    • 모든 값을 매번 다 가져오면 RDB도 ES도 힘들다. 수정된 값임을 명시해주어 Logstash가 편하게 추적할 수 있도록 도와주어야 한다.

https://www.elastic.co/kr/blog/how-to-keep-elasticsearch-synchronized-with-a-relational-database-using-logstash

자세한 내용은 여기서 보면 좋을 것 같다.

5. 실행

./bin/logstash -f logstash.conf

마지막으로 실행하면 끝!


결론


매번 RDB와 ES데이터를 어떻게 동시에 관리해야 할 지 머리가 아팠다. 이렇게 동기화할 수 있다는 사실을 몰랐으니 당연히 애를 먹을 수 밖에 없었던 것 같다...

다만 이 방법도 생각해야할 부분이 꽤 있다. 매 번 LogStash가 PostgreSQL에 주기적으로 SELECT문을 날려야하니 완벽한 실시간 Sync라고는 할 수 없다.




참고

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

개발자로서 배울 점이 많은 글이었습니다. 감사합니다.

답글 달기