분산락에 관련한 궁금증들을 풀어봅시다

문지은·2024년 3월 17일
0
post-thumbnail

맨 처음에 분산락에 관심을 갖게 된 이유는 소프트웨어 아키텍처 스터디를 진행하면서 였다. 다양한 아키텍처에 대해서 토론을 하면서 단연 가장 트렌디하고 대중적인 아키텍처인 MSA를 자주 언급하게 되었다. 그런데 MSA를 이야기할 때마다 꼭 빠지지 않고 니오는 주제가 바로 분산락이었다. 팀에서 분산락을 사용하긴 하지만 제대로 공부하거나 구현해본 적이 없던 나는 분산락에
대힌 여러가지 궁금했던 점들을 해소해보고자 한다.

MSA 환경에서 분산락이 자주 언급되는 이유

위에서 말했던 것처럼 내가 분산락을 접하게 된 이유도 MSA 에 대한 이야기를 하다가였기 때문에 내가 가장 궁금했던 점은 이거였다.
“분산락이 MSA랑 무슨 상관인데?”

내가 여러 자료를 찾아보고 내린 결론은 다음과 같다. 바로 공유 자원 때문이다. MSA환경에서는 여러 서버가 통신을 하기 때문에 야러 서버가 같은 자원에 접근하는 일도 빈번하게 발생한다. 이 때 여러 서버가 같은 자원을 사용할 경우 데이터 정합성이 깨지는 일이 발생한다. 이것을 막아주는 것이 분산락인 것이다.

분산락이란?

위에서도 간단하게 설명했지만 다시 정리해보자면
여러 대의 서버에서 공유 자원 접근하는 경우에 한 번에 하나의 서버만 공유 자원에 접근할 수 있도록 보장하는 메커니즘이다.

Redis를 이용한 구현

분산락을 구현하기 위한 다양한 방법이 존재한다. MySql같은 rdbms에서 직접 제공하는 네임드락도 존재하고 zookeeper를 사용해사 분산락을 구현할 수 있다. 그 중 가장 믾이 사용하고 대중적인 방법은 Redis를 이용하는 것이다. 내 생각에 주로 Redis를 사용해서 분산락을 구현하는 이유는

  1. 분산 서비스에서는 캐시를 위해 이미 Redis를 사용하고 있는 경우가 많으므로 추가 세팅 비용이 들지 않는다.
  2. Redis는 대표적인 싱글 스레드 어플리케이션으로 쉽게 분산락 구현이 가능하며 이를 위한 알고리즘인 redlock을 지원한다.
  3. 인메모리 디비이므로 처리 속도가 매우 빠르다.

인 것 같다.

Redis를 이용해서 분산락을 구현하는 방법은 두 가지가 있다. 스핀락SETNX를 활용한 방법이다.

  • 스핀락은 미치 폴링처럼 락을 얻을 때까지 해당 서버가 계속 락 횟득 시도를 하는 방법으로 필요 이상으로 Redis에 요청을 많이 보내게 된다.
  • SETNX를 활용한 방법은 Redis의 Pub/Sub 을 이용해 락을 얻은 서버가 락을 해제한 후에 락 획득을 시도하므로 보다 효율적인 자원 사용이 가능하다.

분산락을 이용해서 공유 자원을 관리하는 토스 영상

영상 링크 : https://www.youtube.com/watch?v=UOWy6zdsD-c

토스 증권의 아키텍처에 관한 영상이지만 나는 그 중 분산락에 대한 내용에 집중해서 봤다. 인상 깊었던 부분은 단순히 서버간의 공유 자원 접근 컨트롤을 위해서 Redis를 이용한 분산락을 사용했다를 넘어 분산락의 문제점과 극복 과정을 설명한 부분이었다.
Redis 분산락 사용시 주의할 점은 타임아웃이 발생할 경우 데드락에 발생할 수 있다는 점이었다. 이를 해결하기 위해서 다영한 해결책이 존재한다. (원자적 연산 사용, 명시적 잠금, 갱신 손실 자동 감지, Compare-and-set 연산)
분산락에 대한 내용 외에도 좋은 내용이 많으니 영상은 한 번 보길 추천한다.

비관적 락, 낙관적 락

분산락을 검색해보면서 계속 나오는 용어여서 이 부분도 궁금해서 보너스 느낌으로 조금 찾아봤다.

  • 비관적 락
    • 트랜잭션 실행 중간에 conflict가 생기는 것을 허용하지 않는다.
    • 트랜잭션이 시작하고 종료될 때까지 record에
      대한 락을 유지한다.
    • 데이터 정합성은 보장되지만 성능 이슈나 데드락 이슈가 생길 수 있다.
  • 낙관적 락
    • 트랜잭션 실행 중간에 conflict가 생기는 것을 허용한다.
    • record에 대한 버전을 가정하고 실행하야 해당 버전이 아닐 경우(update가 일어난 경우) 트랜잭션을 abort한다.

관련 자료 : https://stackoverflow.com/questions/129329/optimistic-vs-pessimistic-locking

정리하고 보니 분산락과 크게 관련있는 내용이라고 보기는 어려울 수 있지만 분산락을 비관적 락을 이용해서 구현할 지, 낙관적 락을 이용해서 구현할 지 정할 때 도움이 될 듯 하다.

profile
백엔드 개발자입니다.

0개의 댓글