맨 처음에 분산락에 관심을 갖게 된 이유는 소프트웨어 아키텍처 스터디를 진행하면서 였다. 다양한 아키텍처에 대해서 토론을 하면서 단연 가장 트렌디하고 대중적인 아키텍처인 MSA를 자주 언급하게 되었다. 그런데 MSA를 이야기할 때마다 꼭 빠지지 않고 니오는 주제가 바로 분산락이었다. 팀에서 분산락을 사용하긴 하지만 제대로 공부하거나 구현해본 적이 없던 나는 분산락에
대힌 여러가지 궁금했던 점들을 해소해보고자 한다.
위에서 말했던 것처럼 내가 분산락을 접하게 된 이유도 MSA 에 대한 이야기를 하다가였기 때문에 내가 가장 궁금했던 점은 이거였다.
“분산락이 MSA랑 무슨 상관인데?”
내가 여러 자료를 찾아보고 내린 결론은 다음과 같다. 바로 공유 자원 때문이다. MSA환경에서는 여러 서버가 통신을 하기 때문에 야러 서버가 같은 자원에 접근하는 일도 빈번하게 발생한다. 이 때 여러 서버가 같은 자원을 사용할 경우 데이터 정합성이 깨지는 일이 발생한다. 이것을 막아주는 것이 분산락인 것이다.
위에서도 간단하게 설명했지만 다시 정리해보자면
여러 대의 서버에서 공유 자원 접근하는 경우에 한 번에 하나의 서버만 공유 자원에 접근할 수 있도록 보장하는 메커니즘이다.
분산락을 구현하기 위한 다양한 방법이 존재한다. MySql같은 rdbms에서 직접 제공하는 네임드락도 존재하고 zookeeper를 사용해사 분산락을 구현할 수 있다. 그 중 가장 믾이 사용하고 대중적인 방법은 Redis를 이용하는 것이다. 내 생각에 주로 Redis를 사용해서 분산락을 구현하는 이유는
인 것 같다.
Redis를 이용해서 분산락을 구현하는 방법은 두 가지가 있다. 스핀락과 SETNX를 활용한 방법이다.
영상 링크 : https://www.youtube.com/watch?v=UOWy6zdsD-c
토스 증권의 아키텍처에 관한 영상이지만 나는 그 중 분산락에 대한 내용에 집중해서 봤다. 인상 깊었던 부분은 단순히 서버간의 공유 자원 접근 컨트롤을 위해서 Redis를 이용한 분산락을 사용했다를 넘어 분산락의 문제점과 극복 과정을 설명한 부분이었다.
Redis 분산락 사용시 주의할 점은 타임아웃이 발생할 경우 데드락에 발생할 수 있다는 점이었다. 이를 해결하기 위해서 다영한 해결책이 존재한다. (원자적 연산 사용, 명시적 잠금, 갱신 손실 자동 감지, Compare-and-set 연산)
분산락에 대한 내용 외에도 좋은 내용이 많으니 영상은 한 번 보길 추천한다.
분산락을 검색해보면서 계속 나오는 용어여서 이 부분도 궁금해서 보너스 느낌으로 조금 찾아봤다.
관련 자료 : https://stackoverflow.com/questions/129329/optimistic-vs-pessimistic-locking
정리하고 보니 분산락과 크게 관련있는 내용이라고 보기는 어려울 수 있지만 분산락을 비관적 락을 이용해서 구현할 지, 낙관적 락을 이용해서 구현할 지 정할 때 도움이 될 듯 하다.