Docker Compose로 CrateDB 클러스터 구성하기

choi·2025년 12월 29일

Docker Compose로 CrateDB 클러스터 구성하기: 핵심 설정 옵션분석

Docker Compose를 사용하여 3-Node CrateDB 클러스터를 구축할 때, 가장 중요한 것은 command 섹션의 설정값.

CrateDB는 Elasticsearch를 기반으로 하기 때문에 설정 방식이 유사하며
스플릿 브레인(Split-Brain) 방지와
데이터 무결성(Data Integrity)을 위해 아래 옵션들을 정확히 이해하고 설정해야함.

docker-compose.yml 설정 예시

  # CrateDB Node 1 (Seed / Master)
  crate-node1:
    image: crate:latest
    container_name: crate-node1
    ports:
      - "4200:4200"
      - "5432:5432"
    command: >
      crate
      -Cnetwork.host=_site_
      -Ccluster.name=crate-cluster
      -Cnode.name=crate-node1
      -Cdiscovery.seed_hosts=crate-node2,crate-node3
      -Ccluster.initial_master_nodes=crate-node1,crate-node2,crate-node3
      -Cgateway.expected_data_nodes=3
      -Cgateway.recover_after_data_nodes=2
    restart: always

  # CrateDB Node 2
  crate-node2:
    image: crate:latest
    container_name: crate-node2
    command: >
      crate
      -Cnetwork.host=_site_
      -Ccluster.name=crate-cluster
      -Cnode.name=crate-node2
      -Cdiscovery.seed_hosts=crate-node1,crate-node3
      -Ccluster.initial_master_nodes=crate-node1,crate-node2,crate-node3
      -Cgateway.expected_data_nodes=3
      -Cgateway.recover_after_data_nodes=2
    restart: always

  # CrateDB Node 3
  crate-node3:
    image: crate:latest
    container_name: crate-node3
    command: >
      crate
      -Cnetwork.host=_site_
      -Ccluster.name=crate-cluster
      -Cnode.name=crate-node3
      -Cdiscovery.seed_hosts=crate-node1,crate-node2
      -Ccluster.initial_master_nodes=crate-node1,crate-node2,crate-node3
      -Cgateway.expected_data_nodes=3
      -Cgateway.recover_after_data_nodes=2
    restart: always

1. 설정 주입 방식: -C

  • 문법: -C[키]=[값] (예: -Ccluster.name=my-cluster)
  • 설명: CrateDB 설정 파일(crate.yml) 수정 없이 실행 시점에 설정 주입
  • 비유: Java 애플리케이션의 -D 시스템 프로퍼티 주입과 동일 원리

2. 네트워크 및 식별 (Network & Identity)

-Cnetwork.host=_site_

  • 설명: CrateDB 특수 변수 _site_ 사용. 컨테이너의 사설 IP(Private IP) 자동 감지 및 바인딩
  • 목적: 동일 네트워크 내 다른 노드 간 통신 허용 (기본값 localhost는 외부 접근 불가)

-Ccluster.name=crate-cluster

  • 설명: 클러스터 고유 식별자 (팀 이름)
  • 주의: 클러스터 내 모든 노드의 값이 완벽하게 동일해야 함

-Cnode.name=crate-node1

  • 설명: 각 노드를 구분하는 고유 식별자
  • 목적: 장애 발생 시 로그 분석 및 문제 노드 식별

3. 디스커버리 및 마스터 선출 (Discovery)

-Cdiscovery.seed_hosts=crate-node2,crate-node3

  • 의미: 초기 연결 대상 목록 (친구 전화번호부)
  • 설명: 클러스터 시작 시 서로를 탐색(Discovery)하여 그룹을 형성하기 위한 피어(Peer) 주소

-Ccluster.initial_master_nodes=node1,node2,node3

  • 의미: 초기 마스터 선출 자격 노드 목록
  • 목적: 스플릿 브레인(Split-Brain) 방지 (네트워크 단절 시 마스터가 여러 개 생기는 현상 차단)

4. 데이터 안정성 및 복구 (Gateway & Recovery)

-Cgateway.expected_data_nodes=3

  • 의미: 데이터 복구 시작을 위한 최소 노드 수 (정원 확인)
  • 동작: 3개 노드가 모두 감지될 때까지 데이터 복구 대기
  • 목적: 성급한 데이터 이동 방지 및 데이터 정합성 보장

-Cgateway.recover_after_data_nodes=2

  • 의미: 서비스 활성화를 위한 최소 노드 수 (과반수)
  • 동작: 과반수(2개) 이상 연결 시 클러스터 활성화 및 서비스 시작
  • 효과: 일부 노드 장애 시에도 전체 서비스 중단 방지 (고가용성/HA)
profile
늦게나마 정신을 차리려고 하는 개발 뭐시기하는 사람

0개의 댓글