Elasticsearch와 Mongodb 동기화하기
Mongodb + Elasticsearch로 구성된 프로젝트에서 데이터 동기화를 위해 설정했단 것들
오래전에 작성된 메모임을 감안
Monstache
Elasticsearch와 mongodb를 동기화하기 위해 몇가지 찾아본 것들을 먼저 나열해 보겠다.
이름 | 방식 | 비고 |
---|---|---|
Logstash & logstash-input-mongodb | insert데이터 동기화 | 수정/삭제도 동기화가 필요해서 제외 |
mongolastic | 배치방식 | java jar형태로 동작하는데 실시간성이 떨어짐 |
mongo-connector | ? | es v1.3 수준의 낮은버전만 지원 |
river-mongodb | ? | es v1.x 까지만 지원(리뉴얼 전 사용하던 것) |
monstache | query log방식 | 실시간, CUD도 가능하여 서비스에 적합하다 판단. |
표에서 보듯이 기존의 사용하던 river를 더이상 사용할 수 없게 되면서 monstache가 전체읽기/계속읽기/문서내용기반의 인덱스분리 등 다양한 기능을 지원하여 가장 적합한 솔루션이라고 판단했다.
실행
monstache <inline options>
# or
monstache -f <config toml file>
nohup ./monstache -f config.toml &
설정 자체도 설정 파일 내의 각 인스턴스 정보만 기입하면 되서 매우 심플한 편이다. monstache를 사용함으로서 mongodb에 저장된 커뮤니티 게시글을 es로 실시간 동기화하여, 검색이 필요한 항목만 별도로 es를 통한 검색으로 처리하는 식의 전략을 사용할 수 있었다.
요새는 개인적으로 느끼기엔 Mongodb의 인기가 시들시들해진 것 같은데 그당시에만 해도 떠오르는 샛별마냥 자주 사용됬던 것 같다. 만약 다시금 비슷한 서비스를 구축해야 한다면 RDB->MondoDB->ES의 구조가 아닌 RDB->ES 구조로 사용할 것 같다. ES가 단순 검색엔진 보단 저장소 역할도 충분히 수행하게 됐다고 판단이 되어서다.
아래는 관련해서 es를 구성하면서 설정했던 몇가지 항목들에 대한 메모다.
Analyzer 플러그인 설치
프록시 설정 ( 플러그인 다운 시 방화벽 문제 시)
export
ES_JAVA_OPTS="
-Dhttp.proxyHost=OTHER_HOST
-Dhttp.proxyPort=OTHER_PORT
-Dhttps.proxyHost=OTHER_HOST
-Dhttps.proxyPort=OTHER_PORT"
설치 아날라이저 목록
analysis-kuromoji # jp
analysis-nori # kr
analysis-smartcn # cn
그당시에 사용하던 아날라이저인데, 요새는 다른 아날라이저를 사용할수도 있다.
데이터 경로, 로그 경로 설정
설정 파일 중 elasticsearch.yml 내의 path.data, path.log 수정
예시)
path.data: /var/data
path.logs: /var/logs
가상메모리 설정 및 file descriptor
예시)
/etc/sysctl.conf
fs.file-max = 65536
vm.max_map_count = 262144
sudo sysctl -p #적용
/etc/security/limits.conf (추가)
{user} hard nofile 65536
{user} soft nofile 65536
/etc/pam.d/su (추가)
session required pam_limits.so
JVM 설정
설정 파일 중 jvm.options 내의 heap space 영역 수정
예시) - 보통 시스템 메모리의 50% 적용
-Xms16g
-Xmx16g
클러스터 이름 설정
설정 파일 중 elasticsearch.yml 내의 cluster.name 수정
예시) 유니크한 값
cluster.name: hello-my-cluster
지속성을 유지하기 위한 의미있는 노드 값 설정
설정 파일 중 elasticsearch.yml 내의 node.name 수정
예시) 의미있는 값
node.name: alphanode-1
접속 호스트 설정
설정 파일 중 elasticsearch.yml 내의 network.host 수정
예시) 외부접속 IP 설정
network.host: 0.0.0.0