{{위키데이터 속성 추적}}
'''일관된 해싱'''(Consistent hashing)은 웹서버의 개수가 변동하는 가운데 요청을 분산하는 방법을 말한다. 해시테이블의 크기가 변할 때, 평균적으로 K/n의 키만 재매핑되면 된다. 즉 노드나 슬롯의 개수가 바뀔 때, 노드의 추가나 삭제를 할 때, 오직 K/n의 아이템만 다시 섞이면 되는 것이다. (n은 전체 노드의 개수, K는 item의 개수) 기존의 해싱에서는 슬롯의 개수 변화가 거의 모든 키가 다시 재매핑돼야만 했다. (키와 슬롯간의 매핑이 모듈러 연산에 의해 정의되었기 때문)

== 일관된 해싱이 사용되는 상황 ==
일관된 해싱은 분산 캐싱을 위해 나오게 되었다. 이는 변화하는 웹서버들의 수들 사이에서 요청을 분산하는 방법의 하나로 소개되었다. 또한 일관된 해싱은 거대한 웹 애플리케이션에서의 부분적인 장애의 충격을 감소시키는 역할을 하는데, 이는 시스템의 전반적인 장애의 결과를 초래하는 것 없이 강력한 캐시를 사용하기 위해서이다. 일관된 해싱은 또한 분산 해시 테이블(DHT) 디자인에 적용할 수 있다. DHT는 분산된 노드들의 집합사이에서 전체 키공간을 파티셔닝하기 위해서 사용한다. 게다가 노드들을 연결해서 노드가 어떤 키가 효과적으로 위치될 수 있도록 하는 오버레이 네트워크를 제공한다.

== 일관된 해싱의 필요성 ==
보통, n개의 캐싱 머신을 로드밸런싱하는 방법은 데이터(O)에 대한 해시값을 모듈러 n 하는 방식인데[= hash(O) (mod n) ] , 이는 캐싱 머신이 늘어나거나 줄어들 때 n이 바뀌며 모든 데이터들이 새로운 곳에 해시되어야 한다. 이것은 매우 치명적일 수 있는데, 왜냐하면 기존의 데이터가 있는 서버가 캐싱 머신으로부터의 요청으로 과부하가 걸릴 수 있기 때문이다. 따라서 Consistent hashing은 서버의 과부하를 막기위해서 필요하다.

일관된 해싱은 데이터를 가능한 한 같은 캐싱 머신에 해싱시킨다. 이는 캐싱머신이 추가될 때, 추가되는 캐싱머신이 다른 모든 캐싱머신들로부터 데이터를 공유한다는 의미이다. 반대로 이 캐싱 머신이 클러스터에서 빠져나갈때, 이 머신의 데이터들은 클러스터에 남아있는 캐싱머신들사이에서 공유된다.

일관된 해싱의 핵심 목적은 각각의 캐시를 다른 해시 값 구간들과 연관시키도록 하는 것인데, 이 구간의 경계는 각각의 캐시 identifier의 해시를 계산하면서 결정된다. 만약 그 캐시가 제거된다면, 그 캐시의 구간은 적정의 구간과 함께 다른 캐시에 의해 취해진다. 모든 남아있는 캐시는 변하지 않는다.

만약 버킷이 이용불가능하다면, hash ring에서의 버킷의 포인트는 제거된다. 그리고 그 버킷에 매핑된 모든 데이터에 대한 요청은 그 다음 포인트에 매핑된다. 각각의 버킷이 무수한 램덤하게 분산된 포인트들과 연관되기 때문에 (vnode 혹은 vbucket이라 불리는 각 버킷의 virtual버전의 버킷들을 hash ring의 군데군데 만든다. 이로 인해 노드 제거시 부하 불균형을 해결한다.), 각 버킷에 소유되는 리소스들은 무수히 다른 버킷들로 매핑된다. 사라진 버킷에 소유되었던 데이터들은 남아있는 것들사이의 버킷들로 재분산된다. 그러나 다른 버킷에 매핑된 값은 여전히 그 같은 값이고, 이동될 필요가 없다.

== 기술 ==
일관된 해싱은 모든 데이터를 hash ring의 각 지점에 매핑 시키는데에 기반을 둔다. 시스템은 각각의 이용가능한 머신을 hash ring의 무수한 랜덤하게 분산된 포인트에 매핑시킨다.

데이터가 어디 위치해야하는지를 찾기 위해서, 시스템은 hash ring상에서의 데이터의 키의 위치를 찾는다. 그후에 처음으로 만나는 버킷에 도달할때까지 hash ring들 돈다. 각각의 버킷은 그 버킷의 포인트와 이전 버킷의 포인트 사이에 존재하는 모든 리소스를 포함한다.

버킷을 추가할때도 비슷한 과정이 일어난다. 버킷을 추가하면서 그 버킷과 그 옆의 버킷 사이의 모든 리소스는 새로운 버킷에 추가된다. 이 리소스들은 더 이상 이전의 버킷과 연관되지 않으며, 데이터 선택 메서드에 의해서 이전의 버킷에서 찾아지지 않는다.

각각의 버킷과 연관된 키의 부분들은 버킷이 매핑된 각들의 개수가 변함에 따라 바뀔수있다.

== 사용 예 ==
* [[카우치베이스 서버|Couchbase]] 자동화된 데이터 분할
* [[오픈스택|Openstack]]'s 객체 저장 서비스 Swift<ref>http://docs.openstack.org/developer/swift/ring.html</ref>
* 파티션의 구성 요소는 아마존의 스토리지 시스템 발전기<ref name="Amazon2007">{{저널 인용|성=DeCandia, G.|성2=Hastorun, D.|성3=Jampani, M.|성4=Kakulapati, G.|성5=Lakshman, A.|성6=Pilchin, A.|성7=Sivasubramanian, S.|성8=Vosshall, P.|성9=Vogels, W.|저널=Proceedings of the 21st ACM Symposium on Operating Systems Principles|연도=2007|제목=Dynamo: Amazon's Highly Available Key-Value Store}}</ref><ref name="Dynamo: Amazon’s Highly Available Key-value Store">http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf</ref>
* 데이터 분할에서 아파치 카산드라<ref name="Lakshman2010b">{{저널 인용|성=Lakshman, Avinash|성2=Malik, Prashant|저널=ACM SIGOPS Operating Systems Review|연도=2010|제목=Cassandra: a decentralized structured storage system}}</ref>
* 데이터 분할에서 도 모<ref>{{웹 인용|제목=Design -- Voldemort|url=http://www.project-voldemort.com/voldemort/design.html|웹사이트=http://www.project-voldemort.com/|확인날짜=9 February 2015|보존날짜=9 February 2015|인용문=Consistent hashing is a technique that avoids these problems, and we use it to compute the location of each key on the cluster.}}</ref>
* Akka's consistent hashing 라우터<ref name="akka-routing">[http://doc.akka.io/docs/akka/snapshot/scala/routing.html Akka Routing]</ref>
* Riak,배포 키-값 데이터베이스에<ref name="riak-consistent-hashing">{{웹 인용|url=http://docs.basho.com/riak/latest/theory/concepts/|제목=Riak Concepts|확인날짜=2015년 12월 13일|보존url=https://web.archive.org/web/20151222093835/http://docs.basho.com/riak/latest/theory/concepts/|보존날짜=2015년 12월 22일|url-status=dead}}</ref>
* [[GlusterFS]],네트워크 연결 스토리지 파일 시스템<ref name="GlusterFS Algorithms: Distribution">http://www.gluster.org/2012/03/glusterfs-algorithms-distribution/</ref>
* Skylable,오픈 소스 배포 객체 저장 시스템<ref name="skylable-architecture">{{웹 인용|url=http://wiki.skylable.com/wiki/Sxarchitecture#Data_distribution|제목=Skylable architecture|확인날짜=2014년 6월 21일|보존url=https://web.archive.org/web/20151029102753/https://wiki.skylable.com/wiki/Sxarchitecture#Data_distribution|보존날짜=2015년 10월 29일|url-status=dead}}</ref>

== 각주 ==
{{각주}}

[[분류:해싱]]