Scylla DB의 파티션 및 클러스터링 키

8945 단어 databasescylladb
지난 2개의 이전 게시물에서 우리는 Scylla DB에 대해 이야기했습니다. 오늘 저는 데이터베이스에 대해 계속 이야기할 것입니다. 특히 Scylla에서 기본 키가 작동하는 방식에 대해 설명하겠습니다. PK는 파티션 키와 클러스터링 키의 두 가지로 나눌 수 있습니다. 관계형 데이터베이스와 관련하여 두 가지 차이점과 몇 가지 차이점을 살펴보겠습니다.

파티션 키



파티션 키는 노드 전체의 데이터 배포를 담당합니다. 주어진 행을 저장할 노드를 결정합니다. 하나 이상의 열이 될 수 있습니다.



클러스터링 키



클러스터링 키는 파티션 내의 행 정렬을 담당합니다. 0개 이상의 열이 될 수 있습니다.

카 테이블의 문제



이제 복합 키에 대한 차이점을 알았으므로 Car 테이블에서 PK를 모델링하는 방법을 기억해 봅시다. Keyspace를 선택한 후 cqlsh에서 아래 명령을 사용하십시오.

DESCRIBE car


결과는 될 것입니다.

CREATE TABLE automobilies.car (
    id uuid PRIMARY KEY,
    brand text,
    color text,
    model text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
    AND comment = ''
    AND compaction = {'class': 'SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';


보시다시피 우리가 가지고 있는 고유한 PK는 id이며 Simple Primary Key를 호출할 수 있습니다. 데이터베이스에서 선택하면 한 대의 자동차만 검색됩니다.

cqlsh:automobilies> select * from car;

 id                                   | brand | color | model
--------------------------------------+-------+-------+-------
 f714e8e5-b160-4341-807d-f4cd92b973a4 |    VW |   Red |  Golf


테스트를 개선하기 위해 테이블에 더 많은 자동차를 포함시키겠습니다. 동일한 자동차 모델은 동일한 ID를 갖습니다.

cqlsh:automobilies> insert into car (id, brand, color, model) values (e0625c94-e9c2-11eb-9a03-0242ac130003, 'Ford', 'Red', 'Focus');
cqlsh:automobilies> insert into car (id, brand, color, model) values (fbd04f2c-511a-43c5-b588-9e29ebcb5d7a, 'VW', 'Nardo Grey', 'Passat');


이제 select 절의 결과는 다음과 같습니다.

 id                                   | brand | color      | model
--------------------------------------+-------+------------+--------
 fbd04f2c-511a-43c5-b588-9e29ebcb5d7a |    VW | Nardo Grey | Passat
 e0625c94-e9c2-11eb-9a03-0242ac130003 |  Ford |        Red |  Focus
 f714e8e5-b160-4341-807d-f4cd92b973a4 |    VW |        Red |   Golf


Golf car만 찾으려면 id로 쿼리할 수 있습니다.

cqlsh:automobilies> select * from car where id = f714e8e5-b160-4341-807d-f4cd92b973a4;

 id                                   | brand | color | model
-------------------------------------------+-------+-------+-------
 f714e8e5-b160-4341-807d-f4cd92b973a4 |    VW |   Red |  Golf

(1 rows)



그러나 ID와 색상으로 쿼리하려면 어떻게 해야 할까요? 음, 쿼리에 and를 추가하고 색상을 선택해야 할 수도 있습니다. 맞습니까?

cqlsh:automobilies> select * from car where id = f714e8e5-b160-4341-807d-f4cd92b973a4 and color = 'Red';

InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"


보시다시피 색상을 추가하면 오류가 발생하는데 그 이유는 무엇입니까?
이 질문에 답하려면 Scylla가 데이터를 저장하는 방법을 이해해야 합니다(다른 도메인의 예를 사용하겠습니다).



위의 이미지에서 Scylla가 PK를 사용하여 파티션을 나누는 것을 볼 수 있습니다. 쿼리에 id만 사용할 때 Scylla는 ID(파티션 키)를 해싱하여 데이터가 포함된 노드를 정확히 파악하므로 첫 번째 쿼리에서 결과를 얻었습니다. 두 번째 쿼리에서 색상을 필터링하려고 시도했을 때 색상을 클러스터링 키 또는 파티션 키로 정의하지 않았기 때문에 불가능했습니다. 파티션 키가 있기 때문에 데이터가 있는 파티션을 여전히 알 수 있지만 찾고 있는 특정 행을 찾으려면 해당 파티션의 전체 데이터에 대한 선형 스캔을 수행해야 합니다(ALLOW FILTERING 사용). 이 쿼리는 비효율적이며 매우 느릴 수 있습니다. ALLOW FILTERING을 사용하는 방법은 다음과 같습니다.

cqlsh:automobilies> select * from car where id = f714e8e5-b160-4341-807d-f4cd92b973a4 and color = 'Red' ALLOW FILTERING;

 id                                   | brand | color | model
-------------------------------------------+-------+-------+-------
 f714e8e5-b160-4341-807d-f4cd92b973a4 |    VW |   Red |  Golf

(1 rows)


cqlsh:automobilies> select * from car where id = f714e8e5-b160-4341-807d-f4cd92b973a4 and color = 'Green' ALLOW FILTERING;

--------MORE---
(0 rows)



우리가 본 방법은 좋지 않으므로 데이터 모델링을 개선해 보겠습니다.

리모델링 카테이블



키를 정의하기 위해 쿼리할 속성을 알아야 합니다. color 및 id에 대한 쿼리를 원하는 방식은 둘 다 Pk가 되고 id는 파티션 키이고 색상은 클러스터링 키입니다.

cqlsh:automobilies> CREATE TABLE car (id uuid, brand text, color text, model text, PRIMARY KEY (id, color));

cqlsh:automobilies> DESCRIBE car;

CREATE TABLE automobilies.car (
    id uuid,
    color text,
    brand text,
    model text,
    PRIMARY KEY (id, color)
) WITH CLUSTERING ORDER BY (color ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
    AND comment = ''
    AND compaction = {'class': 'SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';



이제 클러스터링 키가 있으므로 동일한 id를 가진 일부 자동차를 삽입할 수 있지만 다른 색상과 Scylla가 정렬됩니다.

cqlsh:automobilies> insert into car (id, brand, color, model) values (f714e8e5-b160-4341-807d-f4cd92b973a4, 'VW', 'Red', 'Golf');
cqlsh:automobilies> insert into car (id, brand, color, model) values (e0625c94-e9c2-11eb-9a03-0242ac130003, 'Ford', 'Red', 'Focus');
cqlsh:automobilies> insert into car (id, brand, color, model) values (fbd04f2c-511a-43c5-b588-9e29ebcb5d7a, 'VW', 'Red', 'Passat');
cqlsh:automobilies> insert into car (id, brand, color, model) values (fbd04f2c-511a-43c5-b588-9e29ebcb5d7a, 'VW', 'Green', 'Passat');
cqlsh:automobilies> insert into car (id, brand, color, model) values (f714e8e5-b160-4341-807d-f4cd92b973a4, 'VW', 'Green', 'Golf');


파티션은 이렇게 유지됩니다



따라서 우리는 id에 대해 분할된 파티션과 색상별로 정렬된 자동차 행을 가지고 있습니다.

cqlsh:automobilies> select * from car;

 id                                   | color | brand | model
-------------------------------------------+-------+-------+--------
 fbd04f2c-511a-43c5-b588-9e29ebcb5d7a | Green |    VW | Passat
 fbd04f2c-511a-43c5-b588-9e29ebcb5d7a |   Red |    VW | Passat
 e0625c94-e9c2-11eb-9a03-0242ac130003 |   Red |  Ford |  Focus
 f714e8e5-b160-4341-807d-f4cd92b973a4 | Green |    VW |   Golf
 f714e8e5-b160-4341-807d-f4cd92b973a4 |   Red |    VW |   Golf


이제 ID와 색상으로 쿼리할 수 있습니다.

cqlsh:automobilies> select * from car where id = fbd04f2c-511a-43c5-b588-9e29ebcb5d7a and color = 'Red';

 id                                   | color | brand | model
-------------------------------------------+-------+-------+--------
 fbd04f2c-511a-43c5-b588-9e29ebcb5d7a |   Red |    VW | Passat

(1 rows)


결론



일반적으로 우리는 Scylla에서 파티션 키와 클러스터링 키가 될 수 있는 PK를 정의하는 방법을 보았습니다. 먼저 쿼리에 대해 생각하고 테이블을 모델링한 후에 생각해야 합니다. 이러한 PK 작업에 대한 다른 많은 규칙이 있지만 고유한 게시물에서 모든 주제를 다룰 수는 없습니다. https://university.scylladb.com/ 과정을 수행하는 것이 좋습니다. 자, 이번 포스팅에서 소개하고 싶었던 내용인데, 마음에 드셨으면 좋겠습니다. 의심, 비판, 제안, 나는 처분이 될 것입니다.

좋은 웹페이지 즐겨찾기