Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions 5. 안정해시 설계.md
Original file line number Diff line number Diff line change
@@ -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