사실 leader election 하면 웬지 Aapche Zookeeper나 etcd만 생각나고 어디에 써먹어야 할지 애매하게 다가올 수도 있다. 오늘 일하면서 동료와 함게 이야기 하던 중 손쉽게 써먹을 수 있지 않을까 싶어 기록으로 남긴다. 만약 아래에 나오는 요구사항과 비슷한 경우가 있다면 꼭 활용해보기 바란다.
예를 들어 batch가 돌아가는 서버가 있다고 하자. 이 batch는 무조건 돌아야 되기도 하고 고가용성을 생각해보았을 때 VM 2대로 돌린다고 가정하자. 다른 코드로 VM 2대에 배포할 수는 없으니 같은 코드를 배포하여 사용한다고 했을 때 고민이 생긴다. 같은 시간대에 batch가 동시에 돌면 안되는데 어떻게 하지??
요구사항을 정리하면 아래와 같다.
leader로 선출된 VM이 작업을 하고 나머지는 leader가 아니니 작업을 안하면 된다.
우리는 Azure를 사용하고 있기에 Azure에서 가장 손쉽게 활용할 수 있는 Azure Storage Account 의 구성 중 blob storage를 활용할 것이다.
blob의 lease 상태값은 5가지가 있다.
위의 5가지 상태값 중, 아래의 3개를 사용하는 것이 보편적인 leader election 과정에 포함된다.
위 3가지 상태 값이 있다는 것을 기억하고 아래의 개념만 추가해주면 완성이다.
먼저 VM 2대다 lease id를 수령받는 코드를 특정시간에 돌아가게 한다. 2대중 한대만 받게 될 것이고 그 VM이 leader가 된다. leader VM은 batch를 돌리며 만약 60초안에 다 못돌릴 시에는 특정시간 마다 renew를 하게 한다. leader가 되지 못한 VM은 5~10초 간격으로 계속 blob의 status를 확인하는 요청을 해야한다. 혹여나 expired로 떨어지면 바로 leader로서 lease id를 가져온 후 작업을 시작해야한다. leader가 되지 못한 VM들이 계속 확인하며 해당 blob이 available로 변한게 확인 되었다면 해당 시간대에 돌아야하는 batchs는 성공적으로 돌아갔다고 판단하고 다음 batch 시간대를 기다린다. 아래와 같은 순서로 정리할 수 있다.
여러가지 알고리즘들이 있지만 아래의 알고리즘들을 고려해보자.
blob storage를 활용해서 간단한 소수의 유닛들간의 leader를 선출해보았지만 조금 더 큰 cluster라면 바로 위 알고리즘들을 고려해보자.