소개 대표 사이트 카테고리 커뮤니티 페이지 만들기
본문 바로가기
서버구축 (WEB,DB)

Zookeeper, Storm, Kafka, Elasticsearch 클러스터 고가용성 구성

by 날으는물고기 2024. 10. 23.

Zookeeper, Storm, Kafka, Elasticsearch 클러스터 고가용성 구성

728x90

High Availability Architectures and Best Practices - Evidian

Zookeeper, Storm, Kafka, Elasticsearch 클러스터를 고가용성으로 구성하는 것은 데이터의 안정적인 수집, 처리, 저장을 보장하는 데 중요합니다. 각 구성 요소는 다음과 같은 역할을 합니다.

  • Zookeeper: 분산 애플리케이션을 위한 중앙 집중형 서비스로, Kafka 및 Storm의 클러스터 관리에 사용됩니다.
  • Kafka: 고성능 메시징 시스템으로, 데이터를 수집하여 Storm으로 전달합니다.
  • Storm: 실시간 데이터 처리 시스템으로, 데이터를 처리한 후 Elasticsearch에 저장합니다.
  • Elasticsearch: 분산 검색 및 분석 엔진으로, 최종 데이터를 저장하고 검색합니다.

1. Zookeeper 클러스터 구성

  1. 서버 준비: 최소 3대의 서버를 준비합니다.
  2. Zookeeper 설치 및 설정
    • 각 서버에 Zookeeper를 설치합니다.
    • zoo.cfg 파일을 설정합니다.
      tickTime=2000
      dataDir=/var/lib/zookeeper
      clientPort=2181
      initLimit=5
      syncLimit=2
      server.1=zookeeper1:2888:3888
      server.2=zookeeper2:2888:3888
      server.3=zookeeper3:2888:3888
  3. Zookeeper 시작: 각 서버에서 Zookeeper를 시작합니다.
    zkServer.sh start

2. Kafka 클러스터 구성

  1. 서버 준비: 최소 3대의 서버를 준비합니다.
  2. Kafka 설치 및 설정
    • 각 서버에 Kafka를 설치합니다.
    • server.properties 파일을 설정합니다.
      broker.id=0
      log.dirs=/var/lib/kafka
      zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
    • 각 서버에서 broker.id 값을 다르게 설정합니다.
  3. Kafka 시작: 각 서버에서 Kafka를 시작합니다.
    kafka-server-start.sh /path/to/server.properties

3. Storm 클러스터 구성

  1. 서버 준비: 최소 3대의 서버를 준비합니다.
  2. Storm 설치 및 설정
    • 각 서버에 Storm을 설치합니다.
    • storm.yaml 파일을 설정합니다.
      storm.zookeeper.servers:
          - "zookeeper1"
          - "zookeeper2"
          - "zookeeper3"
      nimbus.seeds: ["storm-nimbus"]
      supervisor.slots.ports:
          - 6700
          - 6701
          - 6702
  3. Storm 시작
    • Nimbus 노드에서 Nimbus를 시작합니다.
      storm nimbus
    • Supervisor 노드에서 Supervisor를 시작합니다.
      storm supervisor
    • 각 노드에서 UI를 시작합니다.
      storm ui

4. Elasticsearch 클러스터 구성

  1. 서버 준비: 최소 3대의 서버를 준비합니다.
  2. Elasticsearch 설치 및 설정
    • 각 서버에 Elasticsearch를 설치합니다.
    • elasticsearch.yml 파일을 설정합니다.
      cluster.name: my-cluster
      node.name: node-1
      network.host: 0.0.0.0
      discovery.seed_hosts:
          - "es-node1"
          - "es-node2"
          - "es-node3"
      cluster.initial_master_nodes:
          - "node-1"
          - "node-2"
          - "node-3"
    • 각 서버에서 node.name 값을 다르게 설정합니다.
  3. Elasticsearch 시작: 각 서버에서 Elasticsearch를 시작합니다.
    systemctl start elasticsearch

데이터 흐름 구성

  1. 데이터 수집 (Kafka)
    • 데이터는 Kafka로 수집됩니다. 프로듀서를 통해 Kafka 토픽에 데이터를 전송합니다.
      kafka-console-producer.sh --broker-list kafka1:9092 --topic my-topic
  2. 데이터 처리 (Storm)
    • Kafka 스파웃을 사용하여 Kafka에서 데이터를 읽고, 이를 Storm 톱롤로지로 전달합니다.
    • Storm 볼트를 사용하여 데이터를 처리한 후 Elasticsearch로 전송합니다.
  3. 데이터 저장 (Elasticsearch)
    • Storm에서 처리된 데이터를 Elasticsearch에 저장합니다.
    • elasticsearch-hadoop와 같은 커넥터를 사용하여 Storm과 Elasticsearch를 연동합니다.
      // 예시: Storm Bolt에서 Elasticsearch로 데이터 전송
      public class ElasticsearchBolt extends BaseRichBolt {
          private TransportClient client;
      
          @Override
          public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
              Settings settings = Settings.builder().put("cluster.name", "my-cluster").build();
              client = new PreBuiltTransportClient(settings)
                  .addTransportAddress(new TransportAddress(InetAddress.getByName("es-node1"), 9300));
          }
      
          @Override
          public void execute(Tuple tuple) {
              String data = tuple.getStringByField("data");
              IndexResponse response = client.prepareIndex("my-index", "_doc")
                  .setSource(jsonBuilder().startObject().field("data", data).endObject())
                  .get();
          }
      
          @Override
          public void cleanup() {
              client.close();
          }
      }

고가용성을 위한 팁

  • Zookeeper: 홀수 개의 서버로 구성하여 마스터 선출에 안정성을 높입니다.
  • Kafka: 파티션을 여러 브로커에 분산하고, 복제팩터를 설정하여 브로커 장애 시에도 데이터 손실을 방지합니다.
  • Storm: 여러 노드에 Supervisor를 설치하여 노드 장애 시에도 작업을 지속할 수 있도록 합니다.
  • Elasticsearch: 샤드를 여러 노드에 분산하고, 복제 샤드를 설정하여 데이터 손실을 방지합니다.

 

이러한 구성 요소와 설정을 통해 고가용성 클러스터를 구축하고 안정적으로 데이터를 처리할 수 있습니다. 추가적으로 Master/Slave 구조의 개념과 각 구성 요소에서의 적용 방법입니다.

1. Zookeeper

  • Master/Slave 개념: Zookeeper에서는 Master/Slave 개념이 아니라 Leader/Follower 개념이 사용됩니다.
  • Master 지정 방법: Zookeeper 클러스터는 Leader 선출을 위해 Zab(또는 Zookeeper Atomic Broadcast) 프로토콜을 사용합니다. 설정 파일 (zoo.cfg)에서 클러스터 서버를 지정하면, Zookeeper는 자동으로 Leader를 선출합니다.
  • Master 장애 대응 방법: Leader 노드가 장애가 발생하면, 나머지 Follower 노드들이 새로운 Leader를 선출합니다. 자동으로 이루어지며 추가적인 설정이 필요하지 않습니다.
# zoo.cfg 예시
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888

2. Kafka

  • Master/Slave 개념: Kafka에서는 Master/Slave 개념이 아니라 Leader/Replica 개념이 사용됩니다.
  • Master 지정 방법: 각 파티션은 여러 브로커에 분산되어 저장되며, 각 파티션에는 Leader 브로커와 Replica 브로커가 있습니다. Leader는 파티션의 데이터를 읽고 쓸 수 있으며, Replica는 Leader의 데이터를 복제합니다.
  • Master 장애 대응 방법: Leader 브로커가 장애가 발생하면, Zookeeper를 통해 새로운 Leader가 자동으로 선출됩니다.
# server.properties 예시
broker.id=0
log.dirs=/var/lib/kafka
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181

3. Storm

  • Master/Slave 개념: Storm에서는 Master/Slave 개념이 Nimbus와 Supervisor로 나뉩니다.
  • Master 지정 방법: Nimbus는 클러스터의 Master 노드로, 작업을 할당하고 클러스터를 관리합니다. Supervisor는 Slave 노드로, Nimbus가 할당한 작업을 실행합니다.
  • Master 장애 대응 방법: Nimbus가 장애가 발생하면, 다른 Nimbus 노드를 통해 클러스터를 복구해야 합니다. Storm은 고가용성을 위해 다중 Nimbus 구성을 지원하지 않습니다. 따라서, Nimbus 노드의 고가용성을 위해 Zookeeper를 사용한 페일오버 솔루션을 구성하는 것이 일반적입니다.
# storm.yaml 예시
storm.zookeeper.servers:
    - "zookeeper1"
    - "zookeeper2"
    - "zookeeper3"
nimbus.seeds: ["storm-nimbus"]
supervisor.slots.ports:
    - 6700
    - 6701
    - 6702

4. Elasticsearch

  • Master/Slave 개념: Elasticsearch에서는 Master/Slave 개념이 Master/Data 노드로 나뉩니다.
  • Master 지정 방법: Master 노드는 클러스터 상태를 관리하고, Data 노드는 데이터를 저장하고 검색합니다. elasticsearch.yml 설정 파일에서 노드 역할을 지정할 수 있습니다.
  • Master 장애 대응 방법: Master 노드가 장애가 발생하면, 나머지 Master 노드 후보들이 새로운 Master를 선출합니다. 이를 위해 클러스터 초기 설정 시 최소 마스터 노드를 지정합니다.
# elasticsearch.yml 예시
cluster.name: my-cluster
node.name: node-1
node.master: true
node.data: false
network.host: 0.0.0.0
discovery.seed_hosts:
    - "es-node1"
    - "es-node2"
    - "es-node3"
cluster.initial_master_nodes:
    - "node-1"
    - "node-2"
    - "node-3"

마스터 장애 대응

Zookeeper

  1. Leader 장애 발생 시: Follower 중 하나가 자동으로 Leader가 됩니다.
  2. 새로운 Leader 선출 과정: Zab 프로토콜에 따라 선출됩니다.

Kafka

  1. Leader 장애 발생 시: Zookeeper가 새로운 Leader를 선출합니다.
  2. 새로운 Leader 선출 과정: 해당 파티션의 Replica 중 하나가 Leader로 전환됩니다.

Storm

  1. Nimbus 장애 발생 시: 새로운 Nimbus를 수동으로 시작해야 합니다.
  2. Nimbus 페일오버 구성: 페일오버 솔루션을 통해 두 개 이상의 Nimbus 노드를 준비하고 Zookeeper를 사용하여 장애 시 페일오버를 구성할 수 있습니다.

Elasticsearch

  1. Master 노드 장애 발생 시: 나머지 Master 후보 노드들이 새로운 Master를 선출합니다.
  2. 새로운 Master 선출 과정: discovery.zen.minimum_master_nodes 설정에 따라 선출됩니다.
    # elasticsearch.yml 추가 설정
    discovery.zen.minimum_master_nodes: 2
  • Zookeeper: 자동 Leader 선출
  • Kafka: 자동 Leader 선출
  • Storm: 수동 Nimbus 페일오버 필요
  • Elasticsearch: 자동 Master 노드 선출

 

이렇게 각 구성 요소의 Master/Slave 구조와 장애 대응 방법을 이해하고 설정하면 고가용성 클러스터를 효과적으로 운영할 수 있습니다. 자동으로 Master 노드가 선정되는 구성 요소와 그렇지 않은 경우 대부분의 분산 시스템에서는 고가용성을 위해 Master 노드의 자동 선출 메커니즘을 제공합니다. 그러나 설정과 운영에 따라 수동 개입이 필요한 경우도 있습니다. 각 구성 요소에서의 Master 노드 선정 방법입니다.

1. Zookeeper

  • 자동 선정: Zookeeper는 Leader/Follower 구조를 사용하며, Leader는 자동으로 선출됩니다. Zookeeper는 Zab(Zookeeper Atomic Broadcast) 프로토콜을 통해 Leader를 선출하며, 설정 파일에서 지정된 서버 목록 중에서 하나를 Leader로 선택합니다.

2. Kafka

  • 자동 선정: Kafka에서는 각 파티션에 대해 Leader 브로커가 있으며, 이는 자동으로 선출됩니다. 만약 현재 Leader 브로커에 장애가 발생하면, Zookeeper를 통해 파티션의 Replica 중 하나가 새로운 Leader로 자동 전환됩니다.

3. Storm

  • 수동 선정: Storm의 Nimbus는 Master 역할을 하지만, Storm 자체는 고가용성을 위해 다중 Nimbus 구성을 자동으로 지원하지 않습니다. 따라서, Nimbus의 장애 시 수동으로 새로운 Nimbus를 시작하고 설정해야 합니다. Zookeeper와 같은 외부 도구를 사용하여 페일오버를 설정할 수 있습니다.

4. Elasticsearch

  • 자동 선정: Elasticsearch는 Master/Data 노드 구조를 사용하며, Master 노드는 클러스터의 관리 작업을 수행합니다. elasticsearch.yml 파일에서 Master 후보 노드를 지정하면, Master 노드가 장애가 발생했을 때 나머지 후보 노드들 중에서 새로운 Master를 자동으로 선출합니다.
    # elasticsearch.yml 예시
    cluster.name: my-cluster
    node.name: node-1
    node.master: true
    node.data: false
    network.host: 0.0.0.0
    discovery.seed_hosts:
        - "es-node1"
        - "es-node2"
        - "es-node3"
    cluster.initial_master_nodes:
        - "node-1"
        - "node-2"
        - "node-3"
    discovery.zen.minimum_master_nodes: 2
  • 자동으로 Master 노드가 선정되는 구성 요소
    • Zookeeper: Leader 자동 선출
    • Kafka: 파티션 Leader 자동 선출
    • Elasticsearch: Master 노드 자동 선출
  • 수동으로 관리가 필요한 구성 요소
    • Storm: Nimbus 노드는 자동 선출되지 않으며, 장애 발생 시 수동으로 페일오버 구성 필요

 

각 시스템에서 Master 노드가 자동으로 선정되는지 여부를 알고, 이를 설정하는 방법을 이해하는 것은 클러스터의 고가용성을 유지하는 데 중요합니다. 수동으로 노드를 구분하고 관리하는 방법과 Master 개념의 노드가 장애 발생 시 처리하는 각 시스템별 방법입니다.

1. Zookeeper

Zookeeper는 Leader와 Follower 노드를 자동으로 선출합니다. 수동으로 특정 노드를 Leader로 지정할 수는 없지만, 설정 파일을 통해 노드 구성을 지정할 수 있습니다.

# zoo.cfg 예시
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888

Master 노드 장애 처리

  1. 장애 발생 시: Leader 노드가 장애가 발생하면, Follower 노드들 중 하나가 자동으로 새로운 Leader로 선출됩니다.
  2. 새로운 Leader 확인: zkCli.sh 클라이언트를 사용하여 현재 Leader를 확인할 수 있습니다.
    echo stat | nc zookeeper1 2181

2. Kafka

Kafka에서는 server.properties 파일을 통해 각 브로커를 설정합니다. 특정 파티션의 Leader를 수동으로 지정할 수는 없습니다.

# server.properties 예시
broker.id=0
log.dirs=/var/lib/kafka
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181

Master 노드 장애 처리

  1. 장애 발생 시: Leader 브로커가 장애가 발생하면, Zookeeper가 새로운 Leader를 자동으로 선출합니다.
  2. 새로운 Leader 확인: kafka-topics.sh 스크립트를 사용하여 각 파티션의 Leader를 확인할 수 있습니다.
    kafka-topics.sh --describe --topic <topic_name> --zookeeper zookeeper1:2181

3. Storm

Storm에서는 Nimbus와 Supervisor 노드를 설정 파일을 통해 수동으로 구분합니다.

# storm.yaml 예시
storm.zookeeper.servers:
    - "zookeeper1"
    - "zookeeper2"
    - "zookeeper3"
nimbus.seeds: ["storm-nimbus"]
supervisor.slots.ports:
    - 6700
    - 6701
    - 6702

Master 노드 장애 처리

  1. 장애 발생 시: Nimbus가 장애가 발생하면, 새로운 Nimbus를 수동으로 시작해야 합니다.
  2. 새로운 Nimbus 시작: 다른 서버에서 Nimbus를 시작하고 storm.yaml 파일을 업데이트합니다.
    storm nimbus

4. Elasticsearch

Elasticsearch는 elasticsearch.yml 파일을 통해 노드를 Master 또는 Data 노드로 구분합니다.

# elasticsearch.yml 예시
node.master: true
node.data: false
network.host: 0.0.0.0
discovery.seed_hosts:
    - "es-node1"
    - "es-node2"
    - "es-node3"
cluster.initial_master_nodes:
    - "node-1"
    - "node-2"
    - "node-3"

Master 노드 장애 처리

  1. 장애 발생 시: Master 노드가 장애가 발생하면, 나머지 Master 후보 노드들이 새로운 Master를 자동으로 선출합니다.
  2. 새로운 Master 확인: curl 명령어를 사용하여 클러스터 상태를 확인할 수 있습니다.
    curl -X GET "es-node1:9200/_cluster/health?pretty"

예시

Zookeeper

# zoo.cfg
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888
  • 장애 처리: Follower 중 하나가 자동으로 Leader로 선출됩니다.

Kafka

# server.properties
broker.id=0
log.dirs=/var/lib/kafka
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
  • 장애 처리: 새로운 Leader가 자동으로 선출됩니다.

Storm

# storm.yaml
storm.zookeeper.servers:
    - "zookeeper1"
    - "zookeeper2"
    - "zookeeper3"
nimbus.seeds: ["storm-nimbus"]
supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
  • 장애 처리: 수동으로 새로운 Nimbus를 시작합니다.

Elasticsearch

# elasticsearch.yml
node.master: true
node.data: false
network.host: 0.0.0.0
discovery.seed_hosts:
    - "es-node1"
    - "es-node2"
    - "es-node3"
cluster.initial_master_nodes:
    - "node-1"
    - "node-2"
    - "node-3"
  • 장애 처리: 새로운 Master가 자동으로 선출됩니다.

 

이러한 구성을 통해 각 시스템의 고가용성을 유지하고, Master 노드 장애 시 적절한 대응을 할 수 있습니다.

728x90
그리드형(광고전용)

댓글