공부 흔적남기기

안정해시(해시링) 본문

MSA & Arcitecture

안정해시(해시링)

65살까지 코딩 2025. 1. 19. 01:10
728x90
반응형

안정해시

안정해시는 샤드와 같이 분산서버에 골고루 트래픽이나 데이터를 분산할때 분산이 안정적이로 이루어지게 하는 기법이다. 
이때 주로 사용되는게 해시링이다. 

해시링은 하나의 해시값들을 하나점으로 두고 각 점들을 통해 만든 링이라고 보면된다.

 

클라이언트에서 요청받은 데이터를 해싱해서 해시링에 올리고 가장 가까운 분산 서버에 저장하는 방식이다.

 

 

이때 왜 해시링을 사용하는지 궁금할 것이다. 그냥 분산서버의 개수 N으로 모듈러 연산을 하면되는거 아닌가? 

모듈러 연산을 하게되면 분산서버의 개수 N에 영향을 받게된다. 분산서버는 언제든지 늘어나거나 줄을 수도 있고 특정 장애에 의해서 줄어들 수도 있다. 이때마다 모듈러의 값이 변하기 때문에 캐시히트와 캐시미스에대해 관리가 불가능해진다. 

해시링을 사용하게되면 최대 해시키값 K / N의 캐시 이동이 발생하기 때문에 안정적으로 분산서버가 관리된다. 

 

해시에 서버를 균등하게 분산시키기위해서는 가상노드를 추가하면된다. 가상노드들은 분산된 서버를 가르키며 
가상노드를 사용하면 특정 분산 노드에 트래픽 양도 조절이 가능하다. 다만 해시링에 공간을 차지하기 때문에 적절하게 잘 설정해야한다.

 

TMI

분산 서버를 이용할때 그냥 라운드 로빈으로 사용하면되는거 아닌가요? 

staless 일 경우 라운드로빈도 가능하고 트래픽에 의해서도 가능하고 서버의 상황에 따라서도 가능합니다.

하지만 캐시나 DB와 같이 stateful할 경우에는 서버가 계속 바뀌게 되면 캐시미스나 샤드가 올바르지 않게 동작할 수 있습니다. 따라서 특정 요청이 항상 특정 분산 서버로 요청이 갈 수 있게 해시를 사용해야합니다.

 

TMI 2

Redis 같은 경우 해시 슬롯을 사용하는데 

16384 크기의 해시슬롯을 갖고 분산서버가 각자 균등하게 나눠 가진 후 
레디스 키값을 해싱한후 16384로 모듈러 연산해서 해당 해시 슬롯에 키 벨류 형태로 저장합니다. 

 

TMI 3

각 분산된 서버가 SPOF가 되지 않기 위해선 Replication을 통해 복제를 만들어들 수도 있고 특정 개수의 분산 서버가 서로 데이터를 동기화 할 수도 있습니다.  데이터를 안전하게 동기화 하기위해선 version과 offset을 둘수도 있고

머클트리를 통해 주기적으로 데이터가 서로 알맞는지 확인할 수도 있습니다. 

728x90
반응형