Lucene의 버전이 빠르게 업그레이드 되면서, 이전 로그에 대한 마이그레이션 이슈가 발생합니다.
기본적으로는 로그 검색 관련한 부분과 통계를 위한 부분으로 나눠서 처리 방식이 달라집니다.
다음은 3.x의 인덱스와 4.x의 인덱스에서 5.x로의 업그레이드 시에 고려할 사항을 정리해 봅니다.
(테스트 버전: 3.5, 4.9, 5.2)
1) 4.x -> 5.x로 업그레이드하기
* 검색 : lucene-backward-codecs.jar 포함시 별도 수정 없이 정상적으로 이전 버전으로 로그도 검색이 가능합니다.
단, 성능에 대한 이슈 경고가 있으므로 성능이 중요한 경우에는 별도의 테스트가 필요합니다.
* 통계 : 4.x 대의 인덱스인 경우, 그룹핑을 위하여 다음과 같은 하위호환 처리가 별도로 필요합니다.
<테스트 코드>
Map<String, UninvertingReader.Type> uninvertMap = new HashMap<>();
uninvertMap.put("ip", UninvertingReader.Type.SORTED); // 필요한 필드에 대하여 해당 코드 필요함.
IndexReader reader = UninvertingReader.wrap(DirectoryReader.open(FSDirectory.open(Paths.get(indexPath))), uninvertMap);
2) 3.x -> 5.x 업그레이드하기
* 검색 : 3.x 인덱스를 5.x 버전을 사용하여 index open 시에 IndexFormatTooOldException 오류가 발생합니다.
이 경우에는 Lucene에서 제공되는 Upgrader 를 사용하여 upgrade해야 합니다.
단, 5.3의 indexUpgrader 사용시에는 동일한 오류가 발생하므로, 4.x로 업그레이드 후에 다시 5.x로 업그레이드 해야 합니다.
<테스트 코드>
Directory dir = NIOFSDirectory.open(dirPath);
IndexUpgrader indexUpgrader = new IndexUpgrader(dir);
indexUpgrader.upgrade();
* 통계 : 3.x의 로그에 대하여 5.x에서는 group by 관련 기능에 대한 하위호환을 지원하지 않습니다.
즉, 관련 로그를 4.x로 업그레이드 후에 1)번 방법으로 통계를 내거나, 아예 전체를 재인덱싱 해야 합니다.
* 업그레이드 속도 (초당 10,000 로그 기준)
- 기존 3.x 구조의 1분 인덱스 업그레이드 시간: 4초 (local 기준), 1일 업그레이드 예상 시간 = 4초 * 60분 * 24시간 = 5,760초 (96분)
- 전체 재인덱싱 시간 (Thread-4개, 1일) : 4,113초 (69분)
3) 테스트 결과 정리
* 4.x -> 5.x 업그레이드는 약간의 하위호환 코드 추가를 통해서 처리가 가능함. (단, 성능 제약 있음)
* 3.x -> 5.x 업그레이드는 3.x -> 4.x로 업그레이드 한 후에, 또다시 5.x 하위호환 처리나 업그레이드 해야함.
* 3.x 버전의 경우에는 lucene에서 제공되는 Upgrader 속도 대비하여 재인덱싱 하는 것이 효율적으로 판단됨.
* 단, 재인덱싱 시간 및 리소스 사용이 요구되므로 실사용 적용에 대해서는 신중한 검토와 다양한 테스트가 필요함.
- From Joshua(2016.09.26)
'Programming > Lucene' 카테고리의 다른 글
[Lucene] Index Merge 중 에러 (0) | 2015.06.03 |
---|---|
[Lucene] 3.5에서 4.9로 업그레이드 시 고려사항 (0) | 2014.09.29 |
댓글