development

Cassandra의 파티션 키, 복합 키 및 클러스터링 키의 차이점은 무엇입니까?

big-blog 2020. 2. 14. 23:43
반응형

Cassandra의 파티션 키, 복합 키 및 클러스터링 키의 차이점은 무엇입니까?


다음 key유형 간의 차이점을 이해하기 위해 인터넷 주변의 기사를 읽었습니다 . 그러나 나는 이해하기가 어려워 보인다. 예는 분명히 이해를 돕는 데 도움이 될 것입니다.

primary key,
partition key, 
composite key 
clustering key

이것에 대해 많은 혼란이 있습니다. 가능한 한 간단하게 만들 것입니다.

기본 키는 테이블에서 데이터를 검색하는 데 사용되는 하나 이상의 열을 나타내는 일반적인 개념입니다.

기본 키는 단순 하거나 인라인으로 선언 될 수도 있습니다 .

 create table stackoverflow_simple (
      key text PRIMARY KEY,
      data text      
  );

이는 단일 컬럼으로 작성됨을 의미합니다.

그러나 기본 키는 더 많은 열에서 생성 된 COMPOSITE (일명 COMPOUND ) 일 수도 있습니다 .

 create table stackoverflow_composite (
      key_part_one text,
      key_part_two int,
      data text,
      PRIMARY KEY(key_part_one, key_part_two)      
  );

COMPOSITE 기본 키 의 상황에서 키의 "첫 번째 부분"은 PARTITION KEY (이 예에서는 key_part_one 은 파티션 키)이고 키의 두 번째 부분은 CLUSTERING KEY입니다 (이 예에서는 key_part_two ).

파티션과 클러스터링 키는 더 많은 열로 만들 수 있습니다 . 방법은 다음과 같습니다.

 create table stackoverflow_multiple (
      k_part_one text,
      k_part_two int,
      k_clust_one text,
      k_clust_two int,
      k_clust_three uuid,
      data text,
      PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)      
  );

이 이름 뒤에 ...

  • 파티션 키는 사용자의 노드에서 데이터 배포에 대한 책임이 있습니다.
  • 클러스터링 키는 파티션 내 데이터 정렬 할 책임이있다.
  • 기본 키는 받는 사람과 동일 파티션 키 단일 필드 키 테이블 (예에서 단순 ).
  • 복합 / 화합물 키 그냥 다중 열 열쇠

추가 사용 정보 : DATASTAX DOCUMENTATION



간단한 사용법 및 내용 예 간단한 키 :

insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

테이블 내용

key | data
----+------
han | solo

COMPOSITE / COMPOUND KEY 는 "와이드 행"을 검색 할 수 있습니다 (즉, 클러스터링 키가 정의되어 있어도 파티션 키만으로 쿼리 할 수 ​​있음)

insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';

테이블 내용

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |            9 |    football player
      ronaldo |           10 | ex-football player

그러나 모든 키 (파티션 및 클러스터링)로 쿼리 할 수 ​​있습니다 ...

select * from stackoverflow_composite 
   where key_part_one = 'ronaldo' and key_part_two  = 10;

쿼리 출력

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |           10 | ex-football player

중요 사항 : 파티션 키는를 사용하여 쿼리를 수행하는 데 필요한 최소 지정자 where clause입니다. 다음과 같이 복합 파티션 키가있는 경우

예 : PRIMARY KEY((col1, col2), col10, col4))

최소한 col1과 col2를 모두 전달하여 쿼리를 수행 할 수 있습니다. 이들은 파티션 키를 정의하는 2 개의 열입니다. 쿼리를 만드는 "일반적인"규칙은 최소한 모든 파티션 키 열을 전달해야하며, 각 클러스터링 키를 설정된 순서대로 선택적으로 추가 할 수 있습니다.

유효한 쿼리는 ( 보조 인덱스 제외 )

  • col1과 col2
  • col1 및 col2 및 col10
  • col1 및 col2 및 col10 및 col 4

유효하지 않은 :

  • col1과 col2와 col4
  • col1과 col2를 모두 포함하지 않는 것

도움이 되었기를 바랍니다.


수락 된 답변으로 요약 답변을 추가하는 것은 꽤 길다. "행"및 "열"이라는 용어는 Cassandra가 실제로 구현되는 방식이 아니라 CQL과 관련하여 사용됩니다.

  • 기본 키는 행을 고유하게 식별합니다.
  • 복합 키는 복수 열로 형성된 열쇠이다.
  • 파티션 키는 , 행 세트를 찾을 파티션을 즉하기 위해 기본 검색입니다.
  • 클러스터링 키는 파티션 키가 아닌 (그리고 파티션 내에서 순서를 정의) 기본 키의 일부입니다.

예 :

  • PRIMARY KEY (a): 파티션 키는 a입니다.
  • PRIMARY KEY (a, b): 파티션 키는 a클러스터링 키입니다 b.
  • PRIMARY KEY ((a, b)): 복합 파티션 키는 (a, b)입니다.
  • PRIMARY KEY (a, b, c): 파티션 키는 a복합 클러스터링 키입니다 (b, c).
  • PRIMARY KEY ((a, b), c): 복합 파티션 키는 (a, b)클러스터링 키입니다 c.
  • PRIMARY KEY ((a, b), c, d): 복합 파티션 키는 (a, b)복합 클러스터링 키입니다 (c, d).

cassandra에서 기본 키, 파티션 키, 복합 키, 클러스터링 키의 차이점은 항상 약간의 혼란을 초래합니다. 따라서 아래에서 설명하고 서로 관련시킵니다. Cassandra 데이터베이스 액세스에는 CQL (Cassandra Query Language)을 사용합니다. 참고 :-답변은 Cassandra의 업데이트 된 버전에 따른 것입니다. 기본 키 :-

cassandra에는 primary Key를 사용하는 두 가지 방법이 있습니다.

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);

Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);

CQL에서 PRIMARY KEY에 대해 열이 정의되는 순서가 중요합니다. 키의 첫 번째 열을 동일한 파티션 키를 공유하는 모든 행 (실제 테이블 에서조차도)이 동일한 물리적 노드에 저장되는 속성이있는 파티션 키라고합니다. 또한 주어진 테이블에 대해 동일한 파티션 키를 공유하는 행에 대한 삽입 / 업데이트 / 삭제는 원자 적으로 수행됩니다. 파티션 키를 구성하는 열을 정의하기 위해 추가 괄호 세트를 사용하여 복합 파티션 키, 즉 여러 열로 구성된 파티션 키를 가질 수 있습니다.

파티셔닝 및 클러스터링 PRIMARY KEY 정의는 파티션 키와 클러스터링 열의 두 부분으로 구성됩니다. 첫 번째 부분은 스토리지 엔진 행 키에 매핑되고 두 번째 부분은 행의 열을 그룹화하는 데 사용됩니다.

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);

여기서 device_id는 파티션 키이고 checked_at는 cluster_key입니다.

선언에 따라 파티션 키뿐만 아니라 여러 개의 클러스터 키를 가질 수 있습니다.


기본 키 : 파티션 키 (S)로 구성된다 [및 선택적 클러스터링 키 (또는 열)]
파티션 키 : 분할 키의 해시 값은 데이터 저장하는 클러스터 내의 특정 노드를 결정하는 데 사용되는
클러스터링 키 : 데 사용되는 각 파티션 (또는 책임있는 노드와 복제본)의 데이터를 정렬하십시오.

복합 기본 키 : 위에서 말한 것처럼 클러스터링 키는 기본 키에서 선택 사항입니다. 언급되지 않은 경우 간단한 기본 키입니다. 클러스터링 키가 언급되면 복합 기본 키입니다.

복합 파티션 키 : 하나의 열을 파티션 키로 사용하면 광범위한 행 문제 가 발생할 수 있습니다 (사용 사례 / 데이터 모델링에 따라 다름). 따라서 파티션 키는 때때로 둘 이상의 열 조합으로 지정됩니다.

어느 것이 필수인지 혼란 스럽거나 쿼리에서 건너 뛸 수있는 것과 관련하여 Cassandra를 거대한 HashMap으로 상상해보십시오 . 따라서 HashMap에서는 Key가 없으면 값을 검색 할 수 없습니다.
여기서 파티션 키 는 해당 키의 역할을합니다. 따라서 각 쿼리에는이를 지정해야합니다. Cassandra가 없으면 검색 할 노드를 알 수 없습니다. 클러스터링 키를 더 카산드라는 특정 노드를 발견 한 후 쿼리 검색을 축소 (그리고 그것의 복제본)에 도움 특정에 대한 책임 (선택 사항 열) 파티션 키 .


간단히 말해서 :

파티션 키행을 식별 하는 것에 지나지 않습니다. 대부분의 경우 식별은 단일 열 ( 기본 키 )이며 때로는 여러 열의 조합 ( 복합 파티션 키 )입니다.

클러스터 키인덱싱정렬에 지나지 않습니다 . 클러스터 키는 몇 가지 사항에 따라 다릅니다.

  1. 기본 키 열을 제외하고 where 절에서 사용하는 열

  2. 당신이 매우 큰 기록을 가지고 있다면 어떤 관리 문제를 쉽게 할 수 있도록 날짜를 나눌 수 있습니다. 예를 들어, 1 백만 카운티의 인구 기록 데이터가 있습니다. 따라서 쉽게 관리 할 수 ​​있도록 상태 및 핀 코드 이후를 기준으로 데이터를 클러스터링합니다.


주목해야 할 것은 관계형 세계 (복합 키)의 유사한 개념보다 많은 것들을 사용할 것입니다.

예-최근에 사용자 그룹 X에 가입 한 마지막 N 명의 사용자를 찾아야한다고 가정합니다.이 경우 어떻게 효율적으로 읽기를 수행 할 수 있습니까? (공식 카산드라 가이드에서 ) :

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    join_date text,
    username text,
    email text,
    age int,
    PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)

여기서 파티션 키 는 복합적인 것이며 클러스터링 키 는 결합 된 날짜입니다. 클러스터링 키 가 결합 날짜 인 이유는 결과가 이미 정렬 되어 저장되어 조회가 빠르기 때문입니다. 그러나 왜 파티션 키에 복합 키를 사용 합니까? 때문에 우리는 항상 가능한 한 적은 수의 파티션으로 읽고 싶어 . 거기 join_date넣으면 어떻게 도움이됩니까? 이제 동일한 그룹과 동일한 가입 날짜의 사용자가 단일 파티션에 상주합니다! 즉, 가능한 한 적은 수의 파티션을 읽습니다 (먼저 새 파티션으로 시작한 다음 파티션간에 점프하지 않고 이전 파티션으로 이동).

실제로 극단적 인 경우 에는 join_date아니라 join_date 의 해시를 사용해야합니다. 따라서 지난 3 일 동안 쿼리하면 동일한 해시를 공유하므로 동일한 파티션에서 사용할 수 있습니다!


Cassandra의 기본 키는 일반적으로 파티션 키와 클러스터링 열의 두 부분으로 구성됩니다.

primary_key ((partition_key), clustering_col)

파티션 키-기본 키의 첫 번째 부분. 파티션 키의 주요 목표는 특정 행을 저장하는 노드를 식별하는 것입니다.

CREATE TABLE phone_book (phone_num int, 이름 텍스트, age int, 도시 텍스트, PRIMARY KEY ((phone_num, name), age);

여기서 (phone_num, name)은 파티션 키입니다. 데이터를 삽입하는 동안 파티션 키의 해시 값이 생성되며이 값은 행으로 들어가야하는 노드를 결정합니다.

4 노드 클러스터를 고려하면 각 노드에는 저장할 수있는 해시 값의 범위가 있습니다. (쓰기) INSERT INTO phone_book VALUES (7826573732, 'Joey', 25, 'New York');

이제 파티션 키의 해시 값은 Cassandra 파티 셔너에 의해 계산됩니다. 예를 들어, hash value (7826573732, 'Joey') → 12이면 이제이 행이 노드 C에 삽입됩니다.

(읽기) SELECT * FROM phone_book WHERE phone_num = 7826573732 및 name = 'Joey';

이제 다시 파티션 키 (7826573732, 'Joey')의 해시 값이 계산되는데,이 경우 읽기가 수행되는 노드 C에 상주하는 12입니다.

  1. 클러스터링 열-기본 키의 두 번째 부분. 클러스터링 열을 갖는 주요 목적은 데이터를 정렬 된 순서로 저장하는 것입니다. 기본적으로 주문은 오름차순입니다.

해결하려는 쿼리에 따라 기본 키에 둘 이상의 파티션 키와 클러스터링 열이있을 수 있습니다.

primary_key ((pk1, pk2), 열 1, 열 2)


데이터베이스 디자인에서 복합 키는 최소한의 슈퍼 키 세트입니다.

복합 키는 복합 키와 수 퍼키가 아닌 하나 이상의 속성을 포함하는 세트입니다.

주어진 테이블 : EMPLOYEES {employee_id, firstname, surname}

가능한 슈퍼 키는 다음과 같습니다.

{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}

{employee_id}는 유일한 최소 수 퍼키이며 또한 {firstname}과 {surname}이 (가) 고유성을 보장하지 않는 유일한 후보 키입니다. 기본 키는 선택된 후보 키로 정의되며이 예제에는 하나의 후보 키만 있으므로 {employee_id}는 최소 수 퍼키, 유일한 후보 키 및 유일한 가능한 기본 키입니다.

복합 키의 전체 목록은 다음과 같습니다.

{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}

복합 키 ({employee_id, firstname})와 수 퍼키 ({surname})가 아닌 속성을 포함하므로 유일한 복합 키는 {employee_id, firstname, surname}입니다.

참고 : https://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key-and-clustering-key-in-cassandra



반응형