CKA를 준비해보자 35일차 - HA(RAFT)

0

CKA

목록 보기
35/43

ETCD의 HA

etcd는 분산 신뢰기반 key-value 저장소로 빠르고 안전한 데이터 접근을 제공한다. 그런데, '분산'이라는 것이 무엇일까?? 다음을 보도록 하자.

etcd의 idea는 다음과 같다.

--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------

다음과 같이 3개의 etcd server가 존재하고, 이들은 data를 모두 동일하게 갖고 있기 때문에, 하나가 없어져도 나머지 두개로 data를 관리할 수 있다.

그런데, 어떻게 etcd안에 있는 data들이 모두 동일하다는 것을 보장할까? 즉, 어떻게 일관성을 제공할 수 있는 것일까??

etcd는 모든 node들에 대해서 read와 write가 가능하다.

write/read  write/read  write/read
   |           |           |
   |           |           |
--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------

그런데, 어떻게 이것이 가능한가?? 먼저 read측면은 어렵지 않다. 동시에 read한다고 해서 문제가 발생하지 않는다. 반면 write의 경우는 문제가 발생한다. 다음의 경우를 보도록 하자.

name: john              name: joe
 write       write       write
   |           |           |
   |           |           |
--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------

첫번째 etcd는 name: john record를 받았고, 세번째 etcd는 name: joe를 받았다. 어떻게 이 문제를 해결하고, 데이터의 일관성을 유지하는 지 알아보도록 하자.

먼저, etcd는 leader를 선출하는데, 3가지 etcd 중 첫번째 etcd server를 leader로 선출하도록 한다. 나머지 두 etcd server는 follower로 두도록 한다.

leader      follower    follower
   |           |           |
   |           |           |
--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------

이제 write연산이 이전 예제처럼 첫번째 etcd와 세번째 etcd에 동시에 들어왔을 때, 가장 먼저 처리되는 것은 leader의 write이다. 따라서 name: john이 먼저 처리된다.

leader      follower    follower
name: john     |        name: joe
   |           |           |
   |           |           |
--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------
name: john  name: john  name: john

처리된 record는 나머지 두 node들에게도 copy가 전달되어 사용된다. 따라서 leader etcd node뿐만 아니라 follower etcd node 둘 다 같은 data record를 갖게 된다. 이 다음 name: joe가 처리되는데, follower인 3번째 etcd node에 전달된 record인 것이다.

이 경우, follower는 해당 record를 직접 write하지 않고 leader로 전달한다. 이 다음 leader는 해당 record를 write처리하게 되는데, 다음과 같이 follower들에게 전달되는 것이다.

leader      follower    follower
name: joe      |           |
   |           |           |
   |           |           |
--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------
name: joe  name: joe  name: joe

이렇게 data의 일관성을 지킨 것이다.

그런데, leader를 이들 중에 어떻게 선출하는 것일까?? 또한 어떻게 leader가 처리한 write를 다른 follower들에게 예외없이 전달해줄 수 있는 것일까??

RAFT

leader 선출을 위해서 etcd는 RAFT 알고리즘을 사용한다.

RAFT 알고리즘을 간단하게 설명하면 다음과 같다.

  1. 모든 etcd node들은 랜덤한 interval이 지나면 자신이 leader가 될꺼라는 요청을 다른 node들에 전달한다.
  2. 다른 모든 node들이 응답으로 vote up을 전달하면, leader 요청을 보낸 node는 leader가 된다.
                         --2379--
                         |etcd  |
--2379--                 |      |
|etcd  | --leader 요청 -> --------
|      |        
|      |
|      | --leader 요청 -> --2379--
--------                 |etcd  |
                         |      |
                         --------

다음과 같이 랜덤한 시간이 지나면 가장 먼저 하나의 etcd가 자신이 leader가 되고 싶다는 요청을 보낸다.

다른 etcd들은 이에 대한 응답을 보내는데, 이 응답은 leader를 해도 좋다는 vote up이다.

                         --2379--
                         |etcd  |
--2379--                 |      |
|etcd  | ←--voteup 응답-- --------
|      |        
|      |
|      | ←--voteup 응답-- --2379--
--------                 |etcd  |
                         |      |
                         --------

그럼 이제 leader 요청을 보낸 etcd가 leader가 되고, 나머지는 follower가 된다.

                         follower
                         --2379--
leader                   |etcd  |
--2379--                 |      |
|etcd  |                 --------
|      |        
|      |                 follower
|      |                 --2379--
--------                 |etcd  |
                         |      |
                         --------

이후에 만약 network문제나, 특정 문제로 leader node가 사라지면, 나머지 node에 대해서 똑같은 알고리즘을 적용한다.

data 일관성

그런데, 다음의 상황을 보도록 하자.

leader      follower    follower
name: joe      |           |
   |           |           |
   |           |           |
--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------

이전에 leader가 etcd node에서 name: joe record를 처리할 때, 세번째 etcd node가 다운되면 어떻게되는가?

leader      follower       X
name: joe      |           |
   |           |           |
   |           |           |
--2379--    --2379--    --2379--
|etcd  |    |etcd  |    |etcd  |
|      |    |      |    |      |
|      |    |      |    |      |
--------    --------    --------
name: joe   name: joe   X

다음과 같이 세번째 etcd node는 data를 받지 못한다. 이 상태를 정상이라고 표현하기는 어려울 것이다. 그러나 etcd는 이 상태가 문제가 없으므로, data의 일관성이 유지되었다고 판단한다.

왜냐하면 정족수(최소 수)를 만족하였기 때문인데, etcd cluster에 참여하는 node의 개수를 2로 나눈 값에 1을 더한 값이 정족수이다. 따라서 3개의 etcd server가 있으므로 3/2 + 1 = 2이므로 정족수가 2이다. 정족수 2를 만족하는 node들이 살아있기 때문에 etcd cluster는 정상이라고 판단되어 data 저장이 완료되는 것이다.

나중에 다시 세번째 etcd가 살아나면, 최신 데이터로 업데이트하기만 하면 된다.

그런데, 정족수는 무엇인가? 이는 Quorum으로 minimum number of nodes를 의미한다. 즉, Write연산이 성공적으로 이루어졌다는 것을 보장하는 최소한의 node 수를 말하는 것이다.

etcd에서는 quorum을 다음과 같이 정의했다.

Quorum = N/2 + 1

따라서 etcd의 node 갯수인 N=2이면 quorum도 2이고, N=5이면 quourm은 3이다.

여기서 어차피 etcd의 갯수인 N이 2, 3은 같은 quorum을 가지지만, N=3일 때가 HA에 훨씬 더 좋다. 하나 더 많은 node를 관리하기 때문이다. 즉, 짝수보다는 홀수가 더 관리에 있어서나 HA에 있어서 극대화된 효율을 얻을 수 있다는 것이다.

0개의 댓글