Computer >> 컴퓨터 >  >> 프로그래밍 >> 데이터베이스

로드 밸런서 없이 여러 Elasticsearch 클라이언트 노드에 연결하는 방법

2017년 11월 10일 ObjectRocket.com/blog에 처음 게시된 글입니다.

로드 밸런서 없이 여러 Elasticsearch 클라이언트 노드에 연결하는 방법

Rackspace ObjectRocket for Elasticsearch® 클러스터는 기본적으로 여러 개의 클라이언트 노드를 제공합니다. 그런데 고객들로부터 자주 접하는 질문이 하나 있습니다. 바로 "모든 클라이언트 노드에 연결하기 위해 로드 밸런서를 왜 제공하지 않는가?"라는 것입니다.

설정 관점에 따라 단일 노드에 대한 단일 연결을 클러스터 전체의 장애 지점(SPOF)으로 볼 수도 있습니다. 실제로 로드 밸런서는 연결 풀을 관리하는 데 효과적인 도구가 될 수 있습니다. 하지만 Elasticsearch는 처음부터 로드 밸런서 없이 동작하도록 설계되었습니다. 이 글에서는 제공되는 모든 클라이언트 노드를 활용하는 방법을 자세히 살펴보겠습니다.

Python 설정 예시

먼저 Python® 설정부터 확인해 보겠습니다:

from elasticsearch import Elasticsearch
import certifi

es = Elasticsearch(['dc-port-0.es.objectrocket.com', 'dc-port-1.es.objectrocket.com', 'dc-port-2.es.objectrocket.com', 'dc-port-3.es.objectrocket.com'],
    http_auth=('YOUR_USERNAME', 'YOUR_PASSWORD'),
    port=12345,
    use_ssl=True,
    verify_certs=True,
    ca_certs=certifi.where(),
)

위 코드의 첫 번째 인자에서 알 수 있듯이, Elasticsearch 클라이언트는 호스트 목록(list)을 입력값으로 받습니다. 즉, 클라이언트가 내부적으로 여러 노드에 분산 연결하고 장애 발생 시 자동으로 다른 노드로 전환(failover)하므로, 별도의 로드 밸런서가 필요하지 않습니다.

Beats와 같은 다른 도구들도 설정 방식이 유사합니다. 다음은 Beats 설정 스크립트의 예입니다:

output:
elasticsearch:
  hosts: ["https://dc-port-0.es.objectrocket.com:port", "https://dfw-port-1.es.objectrocket.com:port", "https://dfw-port-2.es.objectrocket.com:port", "https://dfw-port-3.es.objectrocket.com:port"]

  # HTTP basic auth
  username: "YOUR_USERNAME"
  password: "YOUR_PASSWORD"

대부분의 Elasticsearch 도구와 클라이언트 라이브러리는 다중 호스트 설정을 지원합니다. 더욱 편리하게 사용하실 수 있도록 ObjectRocket UI에는 Python®, Ruby, C#, Java®, JavaScript®, Go, Logstash, Beats용 연결 코드 스니펫이 미리 준비되어 있습니다. 사용 중인 기술을 선택한 후, 호스트명이 이미 채워져 있는 스니펫을 복사해 붙여넣기만 하면 됩니다.

로드 밸런서 없이 여러 Elasticsearch 클라이언트 노드에 연결하는 방법

다중 호스트를 지원하지 않는 애플리케이션을 위한 대안

일부 애플리케이션은 호스트 목록을 받지 못하고 단일 호스트만 허용합니다. 대표적인 예가 Kibana®입니다. 이런 경우에도 몇 가지 대안으로 문제를 해결할 수 있습니다.

1. 애플리케이션의 각 부분을 서로 다른 클라이언트 노드에 연결

미션 크리티컬(mission-critical)하지 않은 용도의 애플리케이션이라면 단일 클라이언트 노드에 연결해도 충분합니다. 요청량이 극단적으로 많지 않은 한, 하나의 클라이언트 노드로도 부하를 감당할 수 있습니다. 이런 유형의 애플리케이션이 여러 개 있다면, 각각을 서로 다른 클라이언트 노드에 연결함으로써 자연스럽게 부하를 분산시킬 수 있습니다.

2. 로컬에서 로드 밸런싱 구성

클라이언트나 애플리케이션이 다중 호스트를 지원하지 않으면서 클라이언트 연결의 이중화(redundancy)까지 필요한 드문 경우에는, 로컬 환경에서 로드 밸런싱을 직접 구성할 수 있습니다. nginx®, HAProxy® 등의 도구를 활용하거나, Domain Name System(DNS)에 Elasticsearch 클라이언트 노드 간 라운드 로빈(round-robin) 방식으로 순환하는 로컬 호스트명을 설정하는 방법도 있습니다. 이런 구성이 꼭 필요한 사례는 많지 않지만, 필요할 때 활용할 수 있는 검증된 해결책입니다.

결론

거의 모든 상황에서 호스트 목록만 제공하면 클라이언트가 자동으로 부하 분산을 처리해 주므로 별도의 로드 밸런서는 불필요합니다. 다만 예외적인 상황에서는 위에서 소개한 것처럼 로컬 로드 밸런싱으로 대응할 수 있습니다.

Rackspace DBA Services에 대해 더 자세히 알아보세요.

피드백 탭을 통해 의견을 남기거나 질문을 보내실 수 있으며, Sales Chat 버튼을 클릭해 지금 바로 상담을 시작하실 수도 있습니다.