Source Connector slow query로 인한 장애기
문제의 쿼리
- table.poll.interval.ms 설정된 주기마다 해당 쿼리를 실행
SELECT NULL AS table_cat, o.owner AS table_schem, o.object_name AS table_name, o.object_type AS table_type, NULL AS remarks FROM all_objects o WHERE o.owner LIKE :1 ESCAPE '/' AND o.object_name LIKE :2 ESCAPE '/' AND o.object_type IN ('TABLE', 'SYNONYM', 'VIEW') ORDER BY table_type, table_schem, table_name
TableMonitorThread
- TableMonitorThread는 해당 커넥터가 데이터를 로드하기 위한 데이터베이스의 테이블 목록(whitelist, blacklist)에 대한 변경 사항을 지속적으로 모니터링하는 쓰레드이다. 결국 Source Connector는 지속적으로 데이터를 가져오는 쓰레드 1개 + 테이블 목록 감시 쓰레드 1개로 2개의 쓰레드가 기본적으로 도는 원리다.https://github.com/confluentinc/kafka-connect-jdbc/blob/master/src/main/java/io/confluent/connect/jdbc/source/TableMonitorThread.java
- 해당 쿼리가 도는 것을 뒤늦게 알고 내부동작을 모르고 적용하는게 얼마나 한심한 짓인지 뒤늦게 깨달았다.
- 해당 SQL을 수행하는 것을 disable 하고 싶었지만 해당 옵션은 존재하지 않았다.
- table.poll.interval.ms 값을 무작정 엄청 큰 값으로 올려서 급한 불을 껏다.
- 근본적인 해결방안에 대한 고민을 시작했다.
binding parameter configuration으로 해결안
해당 slow query에 적절한 binding parameter를 대입하면 해결을 할 수 있지 않을까? 실제로 다른 사용자 중 한명은 query 옵션과 schema.pattern 옵션을 구현 의도와 다른 방법을 적용해 해당 문제를 해결하였다고 하는 사례가 있다. 아래와 같이 적용 시험 테스트를 해보니 문제를 해결할 수 있었다.
https://github.com/confluentinc/kafka-connect-jdbc/issues/346
- WHERE o.owner LIKE :1 ESCAPE '/'
"schema.pattern"
: "NO_HIT"
- AND o.object_name LIKE :2 ESCAPE '/'
"table.types"
: "NO_HIT"
- query 옵션에다가 SQL을 직접 입력
"query"
: "select * from 스키마.테이블"