"알고리즘 샤딩"의 두 판 사이의 차이
잔글 |
|||
(다른 사용자 한 명의 중간 판 2개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
[[파일:딩알고리즘 샤.PNG|썸네일|500픽셀|'''알고리즘 샤딩 구조''']] | [[파일:딩알고리즘 샤.PNG|썸네일|500픽셀|'''알고리즘 샤딩 구조''']] | ||
− | '''알고리즘 샤딩'''<!--알고리즘샤딩-->( | + | |
+ | '''알고리즘 샤딩'''<!--알고리즘샤딩-->(algorithm sharding)은 [[데이터베이스]] 아이디를 단순하게 나누어 [[샤딩]]하는 방식이다. '''샤딩 알고리즘'''<!--샤딩알고리즘-->(sharding algorithm)이라고도 불린다. | ||
== 개요 == | == 개요 == | ||
− | 알고리즘 샤딩은 데이터베이스 아이디를 단순하게 샤딩하는 방식으로 같은 값을 가지는 key-value 데이터베이스에 적합하지만, 클러스터를 포함하는 노드 개수가 변하게 되면 | + | 알고리즘 샤딩은 [[데이터베이스]] 아이디를 단순하게 샤딩하는 방식으로 같은 값을 가지는 key-value 데이터베이스에 적합하지만, 클러스터를 포함하는 [[노드]] 개수가 변하게 되면 [[리샤딩]](Resharding)이 필요하며, [[해시키]]로 분산되기 때문에 공간에 대한 효율이 부족하다.<ref>DevBlog, 〈[https://sophia2730.tistory.com/entry/Databases-Database-Sharding%EC%83%A4%EB%94%A9 (Databases) Database Sharding(샤딩)이란?]〉, 《티스토리》, 2019-01-29 </ref> |
== 특징 == | == 특징 == | ||
− | + | [[샤딩]]을 분류하는 한 가지 방법은 대동적 알고리즘이다. 알고리즘 샤딩에서 클라이언트는 도움 없이 주어진 파티션의 데이터베이스를 결정할 수 있고, [[동적 샤딩]]에서 별도의 로케이터 서비스는 [[노드]] 간의 파티션을 추적한다. 알고리즘 샤딩 데이터베이스는 샤딩 기능 (partition_key)-> database_id를 사용하여 데이터를 찾고, 간단한 샤딩 함수는 <math>hash (key) % NUM_DB</math>일 수 있다. 파티션 키가 제공되는 한 단일 데이터베이스 내에서 읽기가 수행되어, 파티션 키가 없는 [[쿼리]]는 모든 데이터베이스 노드를 검색해야 하며, 파티션되지 않은 쿼리는 클러스터 크기와 관련하여 확장되지 않음으로 사용하지 않는 것이 좋다. 알고리즘 샤딩은 샤딩 기능만으로 데이터를 배포하여, [[페이로드]] 크기 또는 공간 활용도는 고려하지 않는다. 데이터를 균일하게 분배하려면 각 파티션의 크기가 비슷해야 하고, 세분화 된 파티션은 핫스팟을 줄이며, 단일 데이터베이스에는 많은 파티션이 포함되어, 데이터베이스 간의 데이터 합계는 통계적으로 비슷할 것이다. 이러한 이유로 알고리즘 샤딩은 값이 같은 키-값 데이터베이스에 적합하며, 데이터 [[리샤딩]]은 어려울 수 있다. 샤딩 기능을 업데이트하고 클러스터에서 데이터를 이동해야 하기 때문에 일관성과 가용성을 유지하면서 동시에 두 가지를 모두 수행하는 것은 어렵다. 샤딩 기능을 영리하게 선택하면 전송되는 데이터의 양을 줄일 수 있어, 일관된 해싱은 이러한 알고리즘이다. 시스템의 예로는, 맴케시드(mem cached)가 있다. 맴케시드는 자체적으로 샤딩 되지 않지만, 클라이언트 라이브러리가 클러스터 내에서 데이터를 분배할 것으로 예상되며, 이러한 논리는 응용 프로그램 수준에서 구현하기가 매우 쉽다.<ref>김재영, 〈[https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6 샤딩 작동 방식]〉, 《미디엄》, 2014-12-06 </ref> | |
== 활용 == | == 활용 == | ||
=== 블록 플로우=== | === 블록 플로우=== | ||
− | 기본 크로스 샤드 트랜잭션을 지원하는 새로운 샤딩 프로토콜은, | + | 기본 크로스 샤드 트랜잭션을 지원하는 새로운 샤딩 프로토콜은, [[크로스샤드]] TX에 2단계 커밋이 필요하지 않으며, 이를 블록 플로우라고한다. 일반적인 알고리즘 샤딩 이지만 [[이더리움]](Ethereum)에 적용될 수 있다. [[블록 플로우]]에서는 먼저 샤드 주소를 <math>G</math>그룹으로 분할한 다음 입력 주소 및 출력 주소를 기반으로 모든 트랜잭션을 <math>GxG</math> 샤드로 분배한다. 샤드 <math>(i, j)</math>는 그룹 <math>i</math>에서 그룹 <math>j</math>까지의 트랜잭션으로 구성되어 있다고 가정하면, 그룹 <math>i</math>의 경우 샤드 <math>(j, i)</math> 및 <math>(i, j)</math>의 트랜잭션만 다운로드하면되므로 총 <math>GxG</math> 샤드 대신 <math>2G-1</math> 샤드가 필요하며, 확장성에 이바지한다. 그룹 <math>i</math>에서 그룹 <math>j</math>로의 트랜잭션은 샤드 <math>(i, j)</math>에 직접 제출되며, 이는 2단계 커밋을 피하는 첫 번째 방법이다. 특정 데이터 구조 + 최종 알고리즘을 사용하여 모든 샤드에 대한 합의에 도달하여, 데이터 구조 덕분에 알고리즘은 1% 공격 대신 51% 공격을 받는다. 이 알고리즘 샤딩을 사용하는 비용은 샤드 종속성을 저장하는 새로운 데이터 구조를 위해 추가 스토리지가 필요하며 비용은 블록당 약 <math>100B-200B</math>이고, 수퍼 노드는 필요하지 않지만 풀 노드는 각 그룹당 하나의 <math>G</math> 노드로 구성되어 완전한 원장을 구성한다. 또한 스마트 계약 확장을 위한 혁신적인 기능으로, 현명한 계약을 토큰 부분과 데이터 부분으로 분해한 다음 토큰 수준 프로그래밍을 위한 스크립팅 언어를 제공하면, 데이터 부분에 내장된 VM 언어를 원하지 않기 때문에 실질적인 절충안이다. |
− | 시스템에는 <math>GxG</math> | + | 시스템에는 <math>GxG</math> [[샤드]]가 있으며 <math>G</math>는 주소 그룹의 수이고, 각 주소 그룹마다 <math>G</math> 샤드가 있어, 이 설정에서 크로스 샤드 트랜잭션은 그룹 간 트랜잭션이 된다. 토큰 기반 접근 방식과 같은 상태 기반이 아닌 UTXOs + 데이터를 확장하는 것이 주정부 계약을 확장하기보다 훨씬 쉽다는 것을 알았으므로 처음에 결정적인 디자인 절충안이었다. 애플리케이션은 [[UTXO]]와 함께 데이터 블록을 사용하여 상태를 가질 수 있어, 일부 응용 프로그램은 기존 블록체인과 거의 동일한 샤드 <math>(i, i)</math>를 고수 할 수도 있고, 응용 프로그램의 일반성을 잃어버렸지만 훨씬 간단한 확장 가능한 솔루션이다. 종속성은 방향성 비순환 그래프를 형성하며, DAG는 각 샤드의 포크를 결정하는 데 사용되고, 예를 들어 최신 블록 <math>(3, 5)</math>는 최신 블록 <math>(3, 4)</math>를 종속성으로 사용하고 최신 블록 <math>(3, 4)</math>는 최신 블록 <math>{3, 5}</math>를 종속성으로 사용한다. 이 두 개의 최신 블록 <math>(3, 4) (3, 5)</math>를 동시에 만들 수 있으나 최신 블록 <math>(3, 1)</math>에 대한 종속성으로 함께 사용될 수 있다. 블록 시간은 다른 샤드에 대해 약간 무작위이므로 가능한 한 많은 블록을 포함하기 위해 다른 행의 최신 블록을 사용하고, 예를 들어, <math>G</math>개의 개별 노드에 분산된 전체 수퍼 체인에 대한 견해를 결정해, 종속성 구성은 뷰가 올바른지 확인한다.<ref>청왕, 〈[http://a.to/19pgpzt BlockFlow : 단일 단계 크로스 샤드 트랜잭션으로 새로운 샤딩 알고리즘 소개]〉, 《EthResearch》, 2019-02-18 </ref> |
== 종류 == | == 종류 == | ||
* '''샤딩 알고리즘''' | * '''샤딩 알고리즘''' | ||
− | : | + | : [[클러스터]]의 서버 수가 일정한 경우 모든 서버에 균일하고 일관되게 트래픽을 분산시키는 것은 어렵지 않으나 실제 환경에서는 유지 관리를 위해 항상 서버를 사용하지 않아야 하며, 좋은 샤딩 알고리즘의 과제는 요청의 완전한 재배포를 피하는 것이다. 아래 표는 간단한 모듈식 알고리즘을 사용하며, 서비스 중인 서버 수로 나누고 키를 나누어, 나머지는 요청을 받는 서버이다. |
:{|class=wikitable width=600 | :{|class=wikitable width=600 | ||
169번째 줄: | 170번째 줄: | ||
* '''키 + 노드해시 알고리즘''' | * '''키 + 노드해시 알고리즘''' | ||
− | : 일반적으로 MD5 또는 SHA- | + | : 일반적으로 [[MD5]] 또는 [[SHA-1]]과 같은 우수한 해시 알고리즘을 사용한다. 각 요청에 대해 각 활성 노드의 값을 계산한다. 값은 키와 노드, 노드 번호, 노드 이름 또는 노드를 고유하게 식별하는 것으로 구성된 문자열의 해시이다. 서버에서 요청한 최대 해시값을 산출했으며, 아래 표는 일련의 테스트 키에 대한 노드 선택 프로세스를 보여준다. 여기에 사용된 해시 알고리즘은 설명 목적으로만 사용되어 MD5도 SHA-1도 아니며, 마지막 행에서 노드 2의 서비스가 중단되면 로드가 노드 0, 1 및 4 사이에 분배된다는 것을 알 수 있다. 그동안 정상적인 상황에서 다른 요청이 동일한 서버 노드에 의해 계속 제공되고, 따라서 캐시를 완전히 재배포할 필요가 없다. |
:{|class=wikitable width=600 | :{|class=wikitable width=600 | ||
|+ | |+ | ||
270번째 줄: | 271번째 줄: | ||
|align=center|3 | |align=center|3 | ||
|} | |} | ||
− | : 이 알고리즘의 장점은 간단하고 유지 보수가 적으며, 클러스터에 노드를 쉽게 추가하고 제거 할 수 있다. 단점은 각 요청에 대한 해시 값을 계산하기위한 오버 | + | : 이 알고리즘의 장점은 간단하고 유지 보수가 적으며, 클러스터에 노드를 쉽게 추가하고 제거 할 수 있다. 단점은 각 요청에 대한 해시 값을 계산하기위한 [[오버 헤드]]로, 클러스터의 노드 수가 증가하면 오버 헤드가 증가한다.<ref name="삼"></ref> |
{{각주}} | {{각주}} |
2019년 9월 18일 (수) 22:25 기준 최신판
알고리즘 샤딩(algorithm sharding)은 데이터베이스 아이디를 단순하게 나누어 샤딩하는 방식이다. 샤딩 알고리즘(sharding algorithm)이라고도 불린다.
개요[편집]
알고리즘 샤딩은 데이터베이스 아이디를 단순하게 샤딩하는 방식으로 같은 값을 가지는 key-value 데이터베이스에 적합하지만, 클러스터를 포함하는 노드 개수가 변하게 되면 리샤딩(Resharding)이 필요하며, 해시키로 분산되기 때문에 공간에 대한 효율이 부족하다.[1]
특징[편집]
샤딩을 분류하는 한 가지 방법은 대동적 알고리즘이다. 알고리즘 샤딩에서 클라이언트는 도움 없이 주어진 파티션의 데이터베이스를 결정할 수 있고, 동적 샤딩에서 별도의 로케이터 서비스는 노드 간의 파티션을 추적한다. 알고리즘 샤딩 데이터베이스는 샤딩 기능 (partition_key)-> database_id를 사용하여 데이터를 찾고, 간단한 샤딩 함수는 일 수 있다. 파티션 키가 제공되는 한 단일 데이터베이스 내에서 읽기가 수행되어, 파티션 키가 없는 쿼리는 모든 데이터베이스 노드를 검색해야 하며, 파티션되지 않은 쿼리는 클러스터 크기와 관련하여 확장되지 않음으로 사용하지 않는 것이 좋다. 알고리즘 샤딩은 샤딩 기능만으로 데이터를 배포하여, 페이로드 크기 또는 공간 활용도는 고려하지 않는다. 데이터를 균일하게 분배하려면 각 파티션의 크기가 비슷해야 하고, 세분화 된 파티션은 핫스팟을 줄이며, 단일 데이터베이스에는 많은 파티션이 포함되어, 데이터베이스 간의 데이터 합계는 통계적으로 비슷할 것이다. 이러한 이유로 알고리즘 샤딩은 값이 같은 키-값 데이터베이스에 적합하며, 데이터 리샤딩은 어려울 수 있다. 샤딩 기능을 업데이트하고 클러스터에서 데이터를 이동해야 하기 때문에 일관성과 가용성을 유지하면서 동시에 두 가지를 모두 수행하는 것은 어렵다. 샤딩 기능을 영리하게 선택하면 전송되는 데이터의 양을 줄일 수 있어, 일관된 해싱은 이러한 알고리즘이다. 시스템의 예로는, 맴케시드(mem cached)가 있다. 맴케시드는 자체적으로 샤딩 되지 않지만, 클라이언트 라이브러리가 클러스터 내에서 데이터를 분배할 것으로 예상되며, 이러한 논리는 응용 프로그램 수준에서 구현하기가 매우 쉽다.[2]
활용[편집]
블록 플로우[편집]
기본 크로스 샤드 트랜잭션을 지원하는 새로운 샤딩 프로토콜은, 크로스샤드 TX에 2단계 커밋이 필요하지 않으며, 이를 블록 플로우라고한다. 일반적인 알고리즘 샤딩 이지만 이더리움(Ethereum)에 적용될 수 있다. 블록 플로우에서는 먼저 샤드 주소를 그룹으로 분할한 다음 입력 주소 및 출력 주소를 기반으로 모든 트랜잭션을 샤드로 분배한다. 샤드 는 그룹 에서 그룹 까지의 트랜잭션으로 구성되어 있다고 가정하면, 그룹 의 경우 샤드 및 의 트랜잭션만 다운로드하면되므로 총 샤드 대신 샤드가 필요하며, 확장성에 이바지한다. 그룹 에서 그룹 로의 트랜잭션은 샤드 에 직접 제출되며, 이는 2단계 커밋을 피하는 첫 번째 방법이다. 특정 데이터 구조 + 최종 알고리즘을 사용하여 모든 샤드에 대한 합의에 도달하여, 데이터 구조 덕분에 알고리즘은 1% 공격 대신 51% 공격을 받는다. 이 알고리즘 샤딩을 사용하는 비용은 샤드 종속성을 저장하는 새로운 데이터 구조를 위해 추가 스토리지가 필요하며 비용은 블록당 약 이고, 수퍼 노드는 필요하지 않지만 풀 노드는 각 그룹당 하나의 노드로 구성되어 완전한 원장을 구성한다. 또한 스마트 계약 확장을 위한 혁신적인 기능으로, 현명한 계약을 토큰 부분과 데이터 부분으로 분해한 다음 토큰 수준 프로그래밍을 위한 스크립팅 언어를 제공하면, 데이터 부분에 내장된 VM 언어를 원하지 않기 때문에 실질적인 절충안이다.
시스템에는 샤드가 있으며 는 주소 그룹의 수이고, 각 주소 그룹마다 샤드가 있어, 이 설정에서 크로스 샤드 트랜잭션은 그룹 간 트랜잭션이 된다. 토큰 기반 접근 방식과 같은 상태 기반이 아닌 UTXOs + 데이터를 확장하는 것이 주정부 계약을 확장하기보다 훨씬 쉽다는 것을 알았으므로 처음에 결정적인 디자인 절충안이었다. 애플리케이션은 UTXO와 함께 데이터 블록을 사용하여 상태를 가질 수 있어, 일부 응용 프로그램은 기존 블록체인과 거의 동일한 샤드 를 고수 할 수도 있고, 응용 프로그램의 일반성을 잃어버렸지만 훨씬 간단한 확장 가능한 솔루션이다. 종속성은 방향성 비순환 그래프를 형성하며, DAG는 각 샤드의 포크를 결정하는 데 사용되고, 예를 들어 최신 블록 는 최신 블록 를 종속성으로 사용하고 최신 블록 는 최신 블록 를 종속성으로 사용한다. 이 두 개의 최신 블록 를 동시에 만들 수 있으나 최신 블록 에 대한 종속성으로 함께 사용될 수 있다. 블록 시간은 다른 샤드에 대해 약간 무작위이므로 가능한 한 많은 블록을 포함하기 위해 다른 행의 최신 블록을 사용하고, 예를 들어, 개의 개별 노드에 분산된 전체 수퍼 체인에 대한 견해를 결정해, 종속성 구성은 뷰가 올바른지 확인한다.[3]
종류[편집]
- 샤딩 알고리즘
- 클러스터의 서버 수가 일정한 경우 모든 서버에 균일하고 일관되게 트래픽을 분산시키는 것은 어렵지 않으나 실제 환경에서는 유지 관리를 위해 항상 서버를 사용하지 않아야 하며, 좋은 샤딩 알고리즘의 과제는 요청의 완전한 재배포를 피하는 것이다. 아래 표는 간단한 모듈식 알고리즘을 사용하며, 서비스 중인 서버 수로 나누고 키를 나누어, 나머지는 요청을 받는 서버이다.
키 396562 673665 115181 650428 804339 394035 280572 108093 938266 125314 5 노드 2 0 1 3 4 0 2 3 1 4 4 노드 2 1 1 0 3 3 0 1 2 2
- 5개의 서버 (0-4) 클러스터를 가지고 있고 서버 4를 서비스에서 제외시키는 경우를 알 수 있으며, 요청은 나머지 4대의 서버로 완전히 재분배되고, 노드 변경 시 일관성을 제공하는 두 가지 알고리즘이다.[4]
- 조회 링 알고리즘
- 서버 노드 수보다 훨씬 많은 양의 요소가 있는 배열을 사용하여 링을 형성한다. 설명을 위해 5개의 노드에 25개의 슬롯을 사용하지만, 실제 비율은 훨씬 높아야 하고, 정확한 수는 시뮬레이션을 실행하여 확인할 수 있다. 그런 다음 서버 노드 번호들이 배열에 무작위로 배치하여, 정상 모드에서 로드를 균등하게 분배하려면 링을 채우는 알고리즘이 모든 노드가 슬롯의 동일한 점유율을 갖도록 해야 한다.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 3 1 4 2 0 3 0 2 4 1 2 3 4 0 1 3 2 1 0 4 3 1 4 0 2
- 어떤 노드가 어떤 요청을 얻는지 결정하기 위해 키(650428)를 슬롯 수(25)로 나누고 나머지(3)를 가져온다. 나머지 배열을 인덱스로 사용하여 위의 배열에서 서버 노드 번호(2)를 얻고, 해당 서버(2)는 요청을 처리하도록 지정되어 있어, 지정된 서버 노드가 서비스 불가능(OOS)인 경우 어레이의 다음 슬롯 (4) 에 의해 지정된 서버 노드 (0) 를 사용한다. 서비스 중인 서버를 찾을 때까지 프로세스가 계속된다. 아래 표는 일련의 테스트 키 요청을 처리하도록 선택된 서버 노드를 보여줌으로써 프로세스를 보여준다. 마지막 행에서 노드 2가 작동하지 않을 때 로드가 노드 0, 1 및 3 사이에 분배됨을 알 수 있고, 다른 상황은 정상적인 상황에서 동일한 서버 노드에 의해 계속 제공되어, 캐시를 완전히 재배포할 필요가 없다.
키 396562 673665 115181 650428 804339 394035 280572 108093 938266 125314 MOD 25 12 15 6 3 14 10 22 18 16 14 노드 선택 표준 4 3 0 2 1 2 4 0 2 1 노드 2 OOS 4 3 0 0 1 3 4 0 1 1
- 이 알고리즘을 사용하면 얻을 수있는 서버 노드 수에 관계없이 조회 속도가 빠르고 일관성이 있다는 장점있고, 단점은 특히 새 노드가 클러스터에 추가 될 때 조회 링을 유지해야한다는 것이다.[4]
- 키 + 노드해시 알고리즘
- 일반적으로 MD5 또는 SHA-1과 같은 우수한 해시 알고리즘을 사용한다. 각 요청에 대해 각 활성 노드의 값을 계산한다. 값은 키와 노드, 노드 번호, 노드 이름 또는 노드를 고유하게 식별하는 것으로 구성된 문자열의 해시이다. 서버에서 요청한 최대 해시값을 산출했으며, 아래 표는 일련의 테스트 키에 대한 노드 선택 프로세스를 보여준다. 여기에 사용된 해시 알고리즘은 설명 목적으로만 사용되어 MD5도 SHA-1도 아니며, 마지막 행에서 노드 2의 서비스가 중단되면 로드가 노드 0, 1 및 4 사이에 분배된다는 것을 알 수 있다. 그동안 정상적인 상황에서 다른 요청이 동일한 서버 노드에 의해 계속 제공되고, 따라서 캐시를 완전히 재배포할 필요가 없다.
노드 / 키 396562 673665 115181 650428 804339 694035 280572 108093 938266 125314 키 연결 노드의 해시 노드 0 81526 40031 29723 53735 23911 34931 96088 43852 56076 38777 노드 1 5425 19393 93416 53022 51364 84920 51352 70016 26255 30336 노드 2 93129 26422 83633 65930 81901 87666 50754 32221 29866 7363 노드3 40372 44005 22422 32105 80448 39727 33887 31331 82034 93235 노드 4 4337 89463 87164 65973 90511 14499 88153 11442 63305 29493 노드 선택 표준 2 4 1 2 4 2 0 1 3 3 노드 2 OOS 0 4 1 4 4 1 0 1 3 3
- 이 알고리즘의 장점은 간단하고 유지 보수가 적으며, 클러스터에 노드를 쉽게 추가하고 제거 할 수 있다. 단점은 각 요청에 대한 해시 값을 계산하기위한 오버 헤드로, 클러스터의 노드 수가 증가하면 오버 헤드가 증가한다.[4]
각주[편집]
- ↑ DevBlog, 〈(Databases) Database Sharding(샤딩)이란?〉, 《티스토리》, 2019-01-29
- ↑ 김재영, 〈샤딩 작동 방식〉, 《미디엄》, 2014-12-06
- ↑ 청왕, 〈BlockFlow : 단일 단계 크로스 샤드 트랜잭션으로 새로운 샤딩 알고리즘 소개〉, 《EthResearch》, 2019-02-18
- ↑ 4.0 4.1 4.2 Kenneth Xu, 〈프로그램〉, 《개인 블로그》, 2012-11-17
참고자료[편집]
- DevBlog, 〈(Databases) Database Sharding(샤딩)이란?〉, 《티스토리》, 2019-01-29
- 청왕, 〈BlockFlow : 단일 단계 크로스 샤드 트랜잭션으로 새로운 샤딩 알고리즘 소개〉, 《EthResearch》, 2019-02-18
- 김재영, 〈샤딩 작동 방식〉, 《미디엄》, 2014-12-06
- Kenneth Xu, 〈프로그램〉, 《개인 블로그》, 2012-11-17
같이 보기[편집]