반응형
SMALL

이번시간엔 지난시간에 이어 mongodb Replica Set Election에 대해 포스팅 해보려고 한다. 아마 지난시간에 설명한 Arbiter의 내용은 다 이해하고 왔을 거라고 생각한다. 그러면 Election은 또 어떤건지 자세히 알아보도록 하자.




‘그림1’처럼 Primary 하나와 Secondary 둘이 rs를 구성하고 있다고 가정해보자.

스크린샷 2015-09-10 오전 1.19.50

[그림1 mongodb rs: Primary1, Secondary2]

‘그림2’와 같이 Primary가 죽고 Secondary 둘만 남은 상황이다.

스크린샷 2015-09-10 오전 1.19.57

[그림2 Primary1, Secondary2 rs에서 Primary가 죽은경우]


그럼 저상황에서 Election을 진행하는데 서로 1표씩 받은 상황이다. 그럼 결국엔 1:1 무승부가 되었기때문에 Primary는 선출되지 않는다. 그럼 또 이럴땐 어떻게 해야할까?

스크린샷 2015-09-10 오전 1.20.05

[그림3 Election for New Primary: 1 vs 1 무승부]


아래와 같이 mongodb를 실행시켜보면 Replica Set 구성원은 “votes”라는 투표권을 가지고 있다.

스크린샷 2015-09-10 오전 1.20.13

[그림4 rs member가 가지는 votes]

그렇다면 투표권 숫자를 변경해 Primary가 선출될 수 있도록 설정하면 될거같지않은가? 투표권이 각각 3, 2, 1로 설정된다면 Primary 선출에 아무런 지장이 없을테니 말이다.

하지만 또하나의 변수는 있다. 아래의 그림을 보자.

스크린샷 2015-09-10 오전 1.20.22

[그림5 rs member의 votes 특성]

“must be 0 or 1” 문구를 보면 알 수 있듯이 “votes” 값은 ‘0’ 혹은 ‘1’로 설정해야한다. 그렇다면 Primary 투표권을 ‘1’로 Secondary의 투표권을 각각 ‘0’, ‘1’로 설정하면 되지 않을까?아래 그림과 같이 Primary에 장애가 생겼다.

스크린샷 2015-09-10 오전 1.20.38

[그림6 Primary, Secondary2가 각각 1, 0, 1 votes를 가지고 Primary가 죽은 경우]

Secondary 둘이 Election을 진행하게 된다. 서로 가진 투표권은 각각 ‘0’, ‘1’이다. Secondary 둘이 Election을 진행한 결과 아래 그림과 같이 각각 ‘1’, ‘0’표씩 받았다. 그렇다면 1표를 받은 Secondary가 Primary로 선출되지않을까?

스크린샷 2015-09-10 오전 1.20.49

[그림7 Secondary 둘이 Election 진행한 결과]

하지만 투표자 들의 투표 숫자(1표)가 전체 투표 숫자(2표)의 과반수(1표)를 넘지 못한다는걸 볼 수 있다. 이로 인해 1표를 받은 Secondary는 Primary로 선출되지 못한다. mongodb는 Election 시에 투표자들의 투표 숫자가 전체 투표 숫자의 과반수를 넘어야 진행이 되도록 하고 있다. 그렇다면 Primary의 투표권이 ‘0’이고 Secondary 투표권이 각각 ‘0’, ‘1’이라면 되지 않을까??

이렇게 설정하려 하면 다음과 같은 문구를 보게 된다.

스크린샷 2015-09-10 오전 1.20.57[그림8 rs member들의 votes 합이 1개인 경우]

위의 문구를 보면 알 수 있듯이 “not enough voting nodes”라고 경고하고 있다. 적어도 2개의 투표권이 있어야 한다. 따라서 투표권을 하나씩 가지고 있는 상황에서 투표를 하는 서버는 3개 이상의 홀수개로 존재하여야 Primary가 정상적으로 선출이 된다. 만약 짝수의 서버가 Election을 진행하면 N:N 무승부로 Primary 선출이 정상적으로 진행되지 않을 수 있기 때문이다.

하지만 Primary 하나와 Secondary 둘, Arbiter 하나가 있는 상황에서 Primary가 죽는다면? ‘그림9’와 같이 된다. Primary와 Secondary, Arbiter가 모두 투표권을 ‘1’개씩 가지고 있는 상황이라면 투표자들의 투표 숫자(3)가 전체 투표 숫자(4)의 과반수를 넘긴다는 것을 알 수 있다.


따라서 정상적으로 Election이 진행됨을 볼 수 있다.

스크린샷 2015-09-10 오전 1.21.10

[그림9 Primary1, Secondary2, Arbiter1으로 구성된 rs이 votes를 각 ‘1’씩 가질 경우]

여기서 주의할 점 한가지는 Arbiter는 Primary로 선출되지 않도록 되어있다. 그저 투표권을 가지고 있을 뿐이다. Election이 진행이 되면 특정 Secondary는 Arbiter의 투표를 받아 ‘2’표를 획득하게 되고 다른 Secondary는 상대방 Secondary의 투표를 받아 ‘1’표를 획득하게 된다.

스크린샷 2015-09-10 오전 1.21.19

[그림10 ‘그림9’ 형태에서 Election을 진행한 결과]

 

Election 시에 투표를 진행하는 멤버들의 전체 투표 숫자(3표)의 과반수 이상을 받아야 Primary로 선출이 됩니다. ‘2’표를 받았으니 과반수 이상이 맞다.

따라서 아래 그림처럼 Election은 성공하게 되고 Primary가 새롭게 선출되게 된다.

스크린샷 2015-09-10 오전 1.21.30

[그림11 ‘그림9’ 형태에서 Election이 성공해 Primary가 선출된 모습]

허나 Primary 하나와 Secondary 하나, Arbiter 하나인 경우에는 Primary가 죽을 경우 마지막 Secondary가 Primary로 선출이 되진 않는다. 왜일까? 그건 바로 ‘그림12’를 보면 알 수 있듯이 투표자들의 투표 숫자(2표)가 전체 투표 숫자(4표)의 과반수를 넘지 못하기 때문임을 알 수 있다.

스크린샷 2015-09-10 오전 1.21.41

[그림12 ‘그림11’ 형태에서 Primary가 죽어 Election을 진행하는 모습]

그런데 Election 진행 시에 투표의 우선순위는 정할 수 없는 걸까? 원하는 Secondary를 콕 집어 Primary로 선출될 가능성을 높이고 싶은 경우가 있다.

먼저 아래 그림을 봅시다.

스크린샷 2015-09-10 오전 1.21.50

[그림13 rs member가 가지는 priority]

“Priority”가 보일 것이다. 이 값을 변경하여 원하는 rs member의 투표 우선순위를 설정할 수는 있다. 그러나 여기서 오해하면 안되는 부분이 있는데 “Priority”는 원하는 member를 Election 시 primary로 선출될 가능성을 높이는 것이지 반드시 선출되게 하는 건 아니다.

<출저:https://unagi44.wordpress.com/Developer Lee>



지금까지 Election에 대해 포스팅을 해봤지만 알고나면 어려운건 아니다. 나도 처음에 이해하기 힘들었으며 몇번 반복해서 읽고 이해함으로써 알게 된 사실이었다.  하지만 Arbiter는 투표권한을 갖고 있고 전체투표수의 과반수 이상이 넘어야만 primary로 선출된다는 것은 자명한 사실이다. 





반응형
LIST

'mongoDB' 카테고리의 다른 글

mongodb Replica Set 실습  (0) 2016.09.08
Sharding의 기능  (0) 2016.09.03
왜 Arbiter인가?  (0) 2016.09.03
mongodb Replica Set 알아보기  (0) 2016.09.03
mongodb Replica Set의 필요성  (0) 2016.09.02
블로그 이미지

만년필석사

,