May 25, 2025

[Project-ttrade] #6 Zookeeper - Python 리더 선출

[Project-ttrade] #6  Zookeeper - Python 리더 선출

python Kazoo

zookeeper를 사용하는 Python의 패키지는 kazoo 입니다.

pip install kazoo

사용하는 방법은 간단합니다.

from kazoo.client import KazooClient
from kazoo.recipe.election import Election
import time

# Zookeeper 서버 연결
zk = KazooClient(hosts='zk-cs.zookeeper.svc:2181')
zk.start()

election_path = "/ttrade/path"

zookeeper 서버에 연결하고 데이터를 저장할 Path (key) 를 정합니다.
이 Path를 가지고 중복된 Pod들이 서로의 정보를 공유합니다.

Leader의 일 선언

def work_as_leader():
    print("I am the leader now. Performing leader tasks...")
    # 여기에 리더가 해야 할 작업을 정의하세요.
    while True:
        # 작업을 수행하는 부분
        time.sleep(5)
        print("Leader is doing work...")

Leader가 할 일에 대해서 작성합니다. 지금은 leader가 5초마다 쉬면서 log를 찍습니다.

leader 선출 참여

try:
    election = Election(zk,election_path)
    print("Zookeeper Election")
    election.run(work_ad_leader)
except KeyboardInterrupt:
    print("Shutting down...")
finally:
    zk.stop()
    zk.close()

election = Election(zk,election_path) 로 리더 선출에 참여합니다.
election.run(work_as_leader) 로 리더가 되었을 경우 작업을 수행합니다.

선출 과정

가장 먼저 zookeeper의 Path에 지정하는 Pod의 정보들이 저장됩니다. 그리고 zookeeper에서 leader를 선출해서 함수를 실행하게 합니다.

선출된 leader는 할 일을 하고, 그 외의 pod들은 멈춰있습니다.
선출된 leader가 어떤 이유로 사라지거나 멈추게 되면 다른 즉시 다른 pod가 leader로 선출되어 실행됩니다.

프로젝트 내 사용

실시간으로 data를 가져와야 합니다. 거래소에서 socket으로 값을 가져와서 kafka에 저장하는 데, 모든 노드에서 연결해서 값을 가져오는 것보다는 kafka에 전달하는 노드는 1개만 하고, 장애가 났을 경우에만 다른 노드가 실행되게 한다.

Comments