여러개의 클러스터를 묶어서 검색하고자 할때 예전에는 Tribe Node를 사용했지만, Elasticsearch 5.3 부터는 Cross Cluster Search 기능의 사용이 가능합니다.
Tribe Node와 비교하여 Cross Cluster Search 가 갖는 장점들은 다음과 같습니다.
- 클러스터간의 버전이 달라도 됩니다. 이는 5.X 버전과 6.X 버전을 묶어서 검색할 수 있습니다.
- 같은 이름의 인덱스도 중복해서 검색이 가능합니다.
- Cluster State 정보를 전부 업데이트 할 필요가 없어 마스터 노드의 부하가 적습니다.
ES 5.6.4 클러스터의 데이터를 6.0.0 클러스터에서 검색해 보겠습니다. 두 클러스터 모두 로컬호스트에서 각자 다른 포트로 실행시킨다고 가정 하고 6.0.0 에서 5.6.4에 있는 metricbeat 인덱스를 검색을 해 보도록 하겠습니다.
각 클러스터의 config/elasticsearch.yml
파일을 다음과 같이 설정을 해 줍니다.
es-5.6.4 설정
cluster.name: es-5
http.port: 9201
transport.tcp.port: 9301
es-6.0.0 설정
cluster.name: es-6
http.port: 9202
transport.tcp.port: 9302
search:
remote:
cluster_one:
seeds: 127.0.0.1:9301
es-6.0.0 에서 es-5.6.4 로 검색하는 경우 es-6.0.0 설정 파일만 위와 같이 설정 하면 검색은 가능합니다. 검색은 다음과 같이 하게 됩니다.
GET /cluster_one:metricbeat/_search
{
"query": {
"match_all": {}
}
}
원격 클러스터와 현재 클러스터의 인덱스를 같이 묶어서 검색도 가능합니다.
GET /cluster_one:metricbeat,metricbeat/_search
{
"query": {
"match_all": {}
}
}
그럼 Cross Cluster Search 로 불가능한 기능은 무엇이 있을까요? 결론부터 이야기하자면 _search 외의 대부분 API는 동작을 하지 않습니다.
GET 을 이용한 단일 문서의 접근도 오류가 납니다.
GET /cluster_one:metricbeat/docs/AWAQ3bycH8X78-aeS7-b
위와 같이 실행하면 아래와 같이 index_not_found_exception
오류가 납니다.
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index",
"resource.type": "index_expression",
"resource.id": "cluster_one:metricbeat",
"index_uuid": "_na_",
"index": "cluster_one:metricbeat"
}
],
"type": "index_not_found_exception",
"reason": "no such index",
"resource.type": "index_expression",
"resource.id": "cluster_one:metricbeat",
"index_uuid": "_na_",
"index": "cluster_one:metricbeat"
},
"status": 404
}
당연히 원격 클러스터 인덱스에 대한 _mapping
, _setting
같은 옵션도 동작하지 않습니다. 모두 동일하게 index_not_found_exception
오류가 납니다.
GET /cluster_one:metricbeat/_mappings
Cross Cluster Search 는 여러 클러스터의 상태를 직접 관리하지 않고 원격 클러스터 데이터를 검색하는 기능만을 제공하기 때문에 쉽고 안전하게 사용이 가능합니다.