기본 콘텐츠로 건너뛰기

[ SOLR ] DataImport 에서 last_index_time 의 의미와 사용법

  Solr 의 Data Import 는 다양한 데이터 소스에서 데이터를 Solr 의 문서로 변환하여 Index를 구성하기 위한 도구로 Full / Delta Import 처리가 존재한다.
  • Full Import - 일반적으로 기존 문서들을 삭제 (Clean) 하고 새롭게 문서들을 구성하는데 사용한다.
  • Delta Import - 마지막으로 처리된 Full / Delta Import 시점 (last_index_time) 부터
    추가/변경/삭제 되 데이터를 처리하는데 사용한다. (Non clean)
  last_index_time 은 위 두가지 import 에서 유용하게 사용될 수 있다. 이제 의미를 알아 보도록 하자.

last_index_time 은 어떤 값일까?

  Solr 의 DataImportHandler (이하 DIH) 는 동작한 Import 작업에 대한 최종 설정 값 (last_index_time) 정보를 conf 경로에 “dataimport.properties” 라는 파일에 저장을 한다. 저장되는 단위는 db-data-config.xml 에 지정된 Entity 단위로 기록하게 된다. 그리고 entity와 상관없는 last_index_time 이 존재해서 동작한 시간을 추가로 기록하고 있다. 테스트 결과 delta-import 에서 이 값을 사용하는 것을 확인하였다. 아래는 실제 구성된 정보를 보여주는 것이다.
[ SolrHome / Core / conf / dataimport.properties 의 내용]
#Wed Dec 17 16:02:58 KST 2014
test.last_index_time=2014-12-17 15:51:59
test2.last_index_time=2014-12-17 15:59:24
last_index_time=2014-12-17 15:59:24
  여기서 중요한 것은 last_index_time 이라는 값 (timestamp) 이 어떤 값인지에 대한 것이다. 결론부터 이야기를 하자면 이전의 Full / Delta Import 가 시작된 시간을 의미한다. 이 값이 중요한 이유는 Delta-import 를 처리할 때 이 값을 이용해서 처리하기 때문이다. 예를 들어 현재 테스트하고 있는 Import 작업은 대략 4 ~ 5 분의 처리 시간을 가진다. 따라서 import 가 시작된 이후에도 데이터베이스의 대상 테이블의 데이터가 추가/수정/삭제가 될 수 있기 때문에 다음 Delta-import 처리 시에 누락되는 데이터가 없어야 하기 때문이다. 그리고 import 작업에서 실패가 발생하거나 처리할 데이터가 없는 경우는 last_index_time 은 변경되지 않는다. 즉, index 처리가 되지 않았기 때문에 시간 변동은 없다고 생각하면 된다.
  아래는 실제 Full-Import 가 동작하였을 때의 완료 출력 정보를 나타낸 것이다. (Solr Manager UI)
Solr Manager UI for last_index_time#1
  위의 그림에서 보면 “Full Dump Started” 라는 항목에 “2014-12-17 15:59:24” 라는 값을 확인할 수 있다. 위에서 확인했던 “dataimport.properties” 파일의 test2.last_index_time 을 확인해 보면 동일한 값이라는 것을 알 수 있다.
  이를 유추해 보면 Import 가 시작되는 시간을 다음 Import (Delta) 처리에서 사용할 수 있도록 저장하고 이를 이용하는 것이 된다. 물론 처리되는 과정에서 이미 반영된 변경 데이터가 존재할 수도 있다. (이 부분은 Data를 어떻게 읽어 오느냐에 따라서 다를 수 있다) 그러므로 다음 작업에서 변경된 데이터가 누락되는 것 보다는 중복으로 처리 (Solr 는 Delete and Insert 방식으로 동작한다) 되는 것이 데이터 정합성을 유지할 수 있는 방법이다.

Timestamp 포맷 문제

  위에서 last_index_time 의 의미를 확인했으니 실제 사용할 때의 문제를 알아 보도록 하자. Solr Server와 DB Server 간에 서로 다른 Timezone 이나 다른 포맷을 사용하고 있다면 문제가 발생할 수 있다. 이런 문제를 해결하기 위해서는 다음을 검토해 보아야 한다. (UTC Time 기준이라면…)
1. Solr 서버의 JVM 옵션에 Timezone 설정을 해주어야 한다.
-Duser.timezone="UTC"
2. Solr 서버에서 last_index_time 을 처리할 때 포맷 등의 정보를 설정한다.
<propertyWriter dateFormat="yyyy-MM-dd HH:mm:ss" type="SimplePropertiesWriter" directory="data" filename="my_dih.properties" locale="en_US" />
  • db-data-config.xml 파일에 옵션으로 설정이 가능하다. 지정되지 않았을 때는 기본 locale 과 directory 및 filename을 사용한다. SimplePropertiesWriter 는 SolrCloud 가 설정되지 않은 상태에서만 사용되고, SolrCloud 환경이라면 “ZKPropertiesWriter”를 사용해야 한다.
    • type - 속성을 출력할 수 있는 기능을 가진 클래스를 지정한다.
    • filename - SimplePropertiesWriter 에서 처리할 파일 명으로 지정하지 않으면 Request Handler (여기서는 dataimport) + “.properties” 라는 이름의 파일로 처리한다.
    • directory - SimplePropertiesWriter 에서 처리할 디렉토리로 지정하지 않으면 현재 구동중인 Core 폴더를 기준으로 “conf” 를 사용한다.
    • dateFormat - java.text.SimpleDateFormat 패턴으로 문자열로 처리할 포맷을 지정한다. 기본 값은 “yyyy-MM-dd HH:mm:ss” 이며 JDBC escape 문장으로는 {‘ts’ yyyy-MM-dd HH:mm:ss} 를 지정해야 한다.
    • locale - Solr 4.1 부터 적용되었으며 기존 버전과 다르게 ROOT Locale 을 사용한다. 즉 machine’s default locale 을 사용한다.
3. Import 처리할 대상 SQL 구문에서 상황에 맞도록 전달된 날짜 형식에 맞도록 Convert 작업을 처리한다.

댓글