Zookeeper, Storm, Kafka, Elasticsearch 클러스터 고가용성 구성
Zookeeper, Storm, Kafka, Elasticsearch 클러스터를 고가용성으로 구성하는 것은 데이터의 안정적인 수집, 처리, 저장을 보장하는 데 중요합니다. 각 구성 요소는 다음과 같은 역할을 합니다.
- Zookeeper: 분산 애플리케이션을 위한 중앙 집중형 서비스로, Kafka 및 Storm의 클러스터 관리에 사용됩니다.
- Kafka: 고성능 메시징 시스템으로, 데이터를 수집하여 Storm으로 전달합니다.
- Storm: 실시간 데이터 처리 시스템으로, 데이터를 처리한 후 Elasticsearch에 저장합니다.
- Elasticsearch: 분산 검색 및 분석 엔진으로, 최종 데이터를 저장하고 검색합니다.
1. Zookeeper 클러스터 구성
- 서버 준비: 최소 3대의 서버를 준비합니다.
- 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
- Zookeeper 시작: 각 서버에서 Zookeeper를 시작합니다.
zkServer.sh start
2. Kafka 클러스터 구성
- 서버 준비: 최소 3대의 서버를 준비합니다.
- Kafka 설치 및 설정
- 각 서버에 Kafka를 설치합니다.
server.properties
파일을 설정합니다.broker.id=0 log.dirs=/var/lib/kafka zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
- 각 서버에서
broker.id
값을 다르게 설정합니다.
- Kafka 시작: 각 서버에서 Kafka를 시작합니다.
kafka-server-start.sh /path/to/server.properties
3. Storm 클러스터 구성
- 서버 준비: 최소 3대의 서버를 준비합니다.
- Storm 설치 및 설정
- 각 서버에 Storm을 설치합니다.
storm.yaml
파일을 설정합니다.storm.zookeeper.servers: - "zookeeper1" - "zookeeper2" - "zookeeper3" nimbus.seeds: ["storm-nimbus"] supervisor.slots.ports: - 6700 - 6701 - 6702
- Storm 시작
- Nimbus 노드에서 Nimbus를 시작합니다.
storm nimbus
- Supervisor 노드에서 Supervisor를 시작합니다.
storm supervisor
- 각 노드에서 UI를 시작합니다.
storm ui
- Nimbus 노드에서 Nimbus를 시작합니다.
4. Elasticsearch 클러스터 구성
- 서버 준비: 최소 3대의 서버를 준비합니다.
- 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
값을 다르게 설정합니다.
- Elasticsearch 시작: 각 서버에서 Elasticsearch를 시작합니다.
systemctl start elasticsearch
데이터 흐름 구성
- 데이터 수집 (Kafka)
- 데이터는 Kafka로 수집됩니다. 프로듀서를 통해 Kafka 토픽에 데이터를 전송합니다.
kafka-console-producer.sh --broker-list kafka1:9092 --topic my-topic
- 데이터는 Kafka로 수집됩니다. 프로듀서를 통해 Kafka 토픽에 데이터를 전송합니다.
- 데이터 처리 (Storm)
- Kafka 스파웃을 사용하여 Kafka에서 데이터를 읽고, 이를 Storm 톱롤로지로 전달합니다.
- Storm 볼트를 사용하여 데이터를 처리한 후 Elasticsearch로 전송합니다.
- 데이터 저장 (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
- Leader 장애 발생 시: Follower 중 하나가 자동으로 Leader가 됩니다.
- 새로운 Leader 선출 과정: Zab 프로토콜에 따라 선출됩니다.
Kafka
- Leader 장애 발생 시: Zookeeper가 새로운 Leader를 선출합니다.
- 새로운 Leader 선출 과정: 해당 파티션의 Replica 중 하나가 Leader로 전환됩니다.
Storm
- Nimbus 장애 발생 시: 새로운 Nimbus를 수동으로 시작해야 합니다.
- Nimbus 페일오버 구성: 페일오버 솔루션을 통해 두 개 이상의 Nimbus 노드를 준비하고 Zookeeper를 사용하여 장애 시 페일오버를 구성할 수 있습니다.
Elasticsearch
- Master 노드 장애 발생 시: 나머지 Master 후보 노드들이 새로운 Master를 선출합니다.
- 새로운 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 노드 장애 처리
- 장애 발생 시: Leader 노드가 장애가 발생하면, Follower 노드들 중 하나가 자동으로 새로운 Leader로 선출됩니다.
- 새로운 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 노드 장애 처리
- 장애 발생 시: Leader 브로커가 장애가 발생하면, Zookeeper가 새로운 Leader를 자동으로 선출합니다.
- 새로운 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 노드 장애 처리
- 장애 발생 시: Nimbus가 장애가 발생하면, 새로운 Nimbus를 수동으로 시작해야 합니다.
- 새로운 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 노드 장애 처리
- 장애 발생 시: Master 노드가 장애가 발생하면, 나머지 Master 후보 노드들이 새로운 Master를 자동으로 선출합니다.
- 새로운 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 노드 장애 시 적절한 대응을 할 수 있습니다.