2014년 4월 3일 목요일

모두를 위한 ring 가이드 - ring 기초

ring이란?

ring을 설명하기 위해서 swift 의 역할을 아래의 일에 비유해 보겠다.


  1. 서울시 안의 주소가 적힌 카드들을 책장안에 분류해서 저장해야 되는 일을 맞게 되었다.
  2. 분류가 쉽게 카드를 보관해서 필요할때 언제든지 꺼내 볼 수 있는 방법이 필요하다.
  3. 기본적으로 카드들에 대한 고유번호에 대한 리스트는 가지고 있다.
    (주소를 보면 언제든지 고유번호를 찾을 수 있는 방법은 제공됐다고 가정)
  • 위의 일을 비교하기 위해서 이에 맞게 가정을 해보자.
  • 주소가 적힌 카드들이 있다고 생각하자. 주소가 적힌 카드들의 뒷면에는 각 카드를 대표하는 고유번호를 가지고 있다.
  • 카드를 정리 하기위해서 우선 칸막이가 5개인 책장이 있다. 칸막이 안에는 0~9까지 적혀 있는 바구니 가 각각 있다.
  • 카드를 어디다 넣을지 결정하기 위한 장부가 있다고 생각하자.

  • 카드를 넣을때 일어 나는 일
    1. 집어넣는 카드의 고유번호를 확인한다.(뒤집든 카드 고유번호를 조회해서 찾든 어쨌든 주소를 보면 고유 번호를 알 수 있다.)
    2. 카드의 고유번호의 마지막 자리 숫자를 확인한다.(예제로 따지면 고유번호가 121357632면 2번 이다.)
    3. 카드를 칸막이에 넣기위해 장부를 조회해본다.(카드 고유번호 마지막자리가 2번이기 때문에 칸막이번호는 3번이다.)
    4. 카드를 넣을 칸막이에 가서 카드 고유번호 마지막자리와 같은 바구니에 집어넣는다.(카드고유번호 마지막 자리가 2번 이기 때문에 3번 칸막이의 2번 바구니에 넣는다.)
      위의 설명과 같이 책장안, 바구니안에 넣긴 하나 카드의 고유번호가 유일하기 때문에 같은 바구니에 다른 카드를 헤깔릴 이유는 없다.

  • 카드를 가져올때 일어 나는 일
    1. 주소에 대한 카드의 고유번호를 확인한다. (주소를 가지고 고유번호를 찾을 수 있다는 것은 위에서 가정) 
    2. 고유번호 마지막 자리 숫자를 확인한다. (예제로 따지면 고유번호가 121357632면 2번 이다.)
    3. 카드를 찾기위해 장부를 조회해본다.(카드 고유번호 마지막자리가 2번이기 때문에 칸막이 번호는 3번 이다.)
    4. 카드를 가져올 칸막이에 가서 카드 고유 번호 마지막 자리에 해당하는 바구니에서 카드를 찾아온다.(카드 고유 번호 마지막 자리가 2번 이기 때문에 3번 칸막이의 2번 바구니에서 고유번호에 맞는 카드를 가져온다.)
이로서 언제든지 주소가 적힌 카드를 받더라도 집어 넣을 수 있는 방법을 설계 했다. 


실제 ring의 작동


  • 위의 예제를 이해 했다면 실제 ring의 작동에 대해서 매치해서 생각해 보자.
    • 카드에 적힌 주소는 url 이다. 그리고 md5 hash digest로 url들은 항상 자신의 고유한 해쉬값을 갖게 된다. 
    • 칸막이가 5개인 책장은 5개의 device로 매치되고 0~9까지 적힌 바구니는 partition로 매치된다.
    •  마지막으로 카드를 넣기위해 조회하는 장부가 ring 이다.
  • 위의 예제와 같이 실제 작동할때도 매치해서 생각해 보자.
    1. 집어 넣는 카드의 고유번호를 확인하는 것은 hash를 통한 digest 값을 얻는 것이다.
    2. 카드의 고유번호의 마지막 자리 숫자를 확인한다는 의미는 digest값을 숫자로 변환한뒤 한 칸막이 안의 바구니 개수(partition 개수)로 modular연산 한 값이다.(이하 partition 번호)
    3. 카드를 칸막이에 넣기 위해 장부를 조회해 보는 것은 ring을 조회 해서 위의 partition 번호에 맞는 device를 찾는 일이다.
    4. 카드를 넣을 칸막이에 가서 partition 번호에 맞는 바구니에 카드를 넣는다는 의미는 device 안에 partition 안에 hash digest값으로 파일을 저장하는 일이다.
여기서 기본적으로 집고 넘어가야 할 것이 있다.

swift 현재 128bit md5를 사용중이다.이때 다른 url이 같은 hash 값을 갖게 되면 문제가 생길까?
우선 만약 다른 url이 같은 hash를 갖게되면 문제가 생긴다.
기본적으로 만약 다른 url이 같은 hash를 갖게 되면 자신의 요구와 전혀 다른 결과를 얻을 수 도 있을 것이다. 
하지만 우선 확률이 희박하다고 생각하면 될것이다. 자세히 알고 싶은 분들을 위해 아래 내용을 첨부한다.
이는 생일 문제로 생각 할 수 있다. 다음을 참고하면 이 확률을 계산해 볼 수 있다. 






다음으로 생각해 볼만한 것이 있다.


그냥 우리가 운영체제에서 파일을 저장하듯이 디렉토리 별로 저장하지 않고 왜 이와 같이 복잡한 방법을 이용하는 것인가?
만약 주소에 맞게 분류해서 저장하게 된다면 어떤 지역은 그 아래 매우 많은 주소가 있을 수 있고 어떤 지역은 매우 적 은 주소가 있을 수도 있을 것이다.
그렇다면 어떤 디렉토리는 커지고 어떤 디렉토리는 그에 비해 작을 것이다. 즉 이는 올바르게 분산되지 않은 환경이 된다.

그렇기 때문에 md5 hash, modular와 같은 균등 분배를 지원하는 방법을 이용해서 데이터를 분산시키는 것이다.

마지막으로 ring이 하는 일을 간단하게 정리 한다면

  • 장부(ring)는 static한 정보이다.
  • 또한 어떤 칸막이 안(device)의 어떤 바구니(partition) 까지만 알려주지 결국 고유번호(hash)로 카드(url)에 접 근하게 된다.
위의 설명은 대략적인 ring의 작동에 대해서 설명한 기본적인 내용이다.
다만 replica에 대한 내용은 빠져있으며 책장의 크기가 커질때나(device가 추가될때)의 내용은 생략된 내용이다. 또한 현재 5개의 device가 각각 zone에 매칭되는 개념으로 설명했다.
우선 다음장에서 이 내용에 대해서 설명하도록 하겠다.

이 글은 아래에 대해서 설명했다.
* url
* url hash 값

* device
* partition 

* ring 



댓글 없음:

댓글 쓰기