diff --git "a/5. \354\225\210\354\240\225\355\225\264\354\213\234 \354\204\244\352\263\204.md" "b/5. \354\225\210\354\240\225\355\225\264\354\213\234 \354\204\244\352\263\204.md" new file mode 100644 index 0000000..70b5009 --- /dev/null +++ "b/5. \354\225\210\354\240\225\355\225\264\354\213\234 \354\204\244\352\263\204.md" @@ -0,0 +1,93 @@ +# 안정 해시 설계 + +요청이나 데이터를 서버에 균등하게 나누기위해 사용하는 기술 + + + +### 해시 키 재배치(rehash) 문제 + + +#### 일반적인 노드기반 라우팅 방식 +![](https://velog.velcdn.com/images/rodlsdyd/post/3108ee9c-f717-4f7a-8d73-674fcb6db454/image.png) + +- 해시값과 서버개수와의 모듈러 연산을통해 서버 라우팅하는방식 +- 간단하고 효율적으로 트래픽을 분산해준다. + + - 연산 결과가 어떤것이 나오든 캐시미스는 발생할 확률이 적다. + +- **노드목록이 변경되면 트래픽이 재분배**되는데 이때 문제가 생긴다. + +![](https://velog.velcdn.com/images/rodlsdyd/post/93103576-b70f-41a4-b77b-60fbd80ba2a8/image.png) + + + + + - 1번 서버가 장애발생해서 동작을 중단했다고 가정 + - 서버 개수가 줄기때문에 연산 결과의 범위가 0~2까지로 감소한다. + - 대부분의 키가 재분배되어 **데이터가없는 엉뚱한 서버에 접속**해 **대규모 캐시미스**가 발생하게 된다. + + +### 안정해시 (위의 문제를 해결) + +![](https://velog.velcdn.com/images/rodlsdyd/post/7a0a34fb-0c8b-41a6-a821-4ca9db57d741/image.png) + + +- 노드목록이 변경되었을때 생기는 캐시미스를 낮추기위해 생긴 개념 + +- 해시값의 범위를가지고 링을만들어서 노드들을 배치한다.(서버 IP나 이름을 대응시킬수도있다.) + +![](https://velog.velcdn.com/images/rodlsdyd/post/8d59de53-3022-496a-af02-2c8d33457ed1/image.png) + + +- 특정 키가 저장되는 서버는 해당 키의 위치로부터 시계방향으로 탐색해 나가며 만나는 가장 첫번째 서버 + + +### 노드 추가시 + +![](https://velog.velcdn.com/images/rodlsdyd/post/ce5f901f-f5b5-4f9c-a08f-506cd1734016/image.png) + + +- 노드가 추가된다고 하더라도 C와 D노드 사이 배치되어있던 키의 일부가 E노드로 라우팅되면서 캐시미스가 발생하지만 나머지 노드들은 캐시미스가 발생하지않는다. + +### 노드 삭제시 +![](https://velog.velcdn.com/images/rodlsdyd/post/a68723a4-3963-4ce7-8dcd-d957e5358342/image.png) + +- C노드로 라우팅된 키들만 D로 향하면서 캐시미스가 발생하지만 그외의 키들은 캐시미스가 발생하지않는다. + + + +### 문제점 +![](https://velog.velcdn.com/images/rodlsdyd/post/dfbb6ca9-ed18-45bb-88d3-911f47e14351/image.png) + +- 파티션의 크기를 균등하게 유지하는게 불가능하다 + - 서버에 따라 엄청작은 해시공간을 할당받거나 엄청 큰 해시공간을 할당받을 상황이 발생할수있다. + +- 키의 균등분포를 달성하기 어렵다 + - 아무 데이터도 갖지않는 서버도 존재할수있고 특정 서버는 여러개의 키를 보관할수있는상황이 생긴다. + +### 해결법 - 가상 노드 + +![](https://velog.velcdn.com/images/rodlsdyd/post/6c73e134-a2e9-4e6c-a3e3-d6235015aadf/image.png) + + +- 하나의 서버가 링위에 여러개의 가상 노드를 가질수있다. +- 가상 노드의 개수를 늘려 키의 분포를 균등화시킬수있지만 가상 노드 데이터를 저장할 공간이 더 많이 필요해지는 **트레이드오프가 존재**한다. + + + +## 안정해시의 이점 + +- 서버가 추가/삭제될때 **재배치되는 키의 수를 최소화**시킬수있다. +- **데이터를 균등하게 분포**시킬수있어 수평적 규모 확장성을 달성하기 쉽다 +- 특정 샤드에 데이터가 몰리는 상황을 줄여 핫스팟 키 문제를 줄일수있다. + + +## 의논점 +[메시지 큐로는 균등분포 안될까?](https://github.com/back-end-study/system-design-interview/issues/9) + +ref : https://github.com/songkg7/consistent-hashing-sample + + + + +