가상 테이블
가상 테이블 (Virtual Tables)
Apache Cassandra 4.0은 가상 테이블을 구현합니다(CASSANDRA-7622). 가상 테이블은 SSTable로 명시적으로 관리·저장되는 데이터 대신 API로 지원되는 테이블이에요. Apache Cassandra 4.0은 가상 테이블을 위한 가상 키스페이스 인터페이스를 구현합니다. 가상 테이블은 각 노드에 특정됩니다.
가상 테이블의 기능 중 일부는 다음 능력입니다:
- CQL을 통해 메트릭 노출
- YAML 구성 정보 노출
가상 키스페이스와 가상 테이블은 일반 테이블·키스페이스와 꽤 다릅니다:
- 가상 테이블은 특수 키스페이스에 생성되며 아무 키스페이스에나 생성되지 않아요.
- 가상 테이블은 Cassandra가 관리합니다. 사용자는 새 가상 테이블을 만들기 위해 DDL을 실행하거나 기존 가상 테이블을 수정하기 위해 DML을 실행할 수 없습니다.
- 가상 테이블은 현재 읽기 전용입니다. 다만 이는 나중 버전에서 바뀔 수 있어요.
- 가상 테이블은 로컬 전용이며 비분산형이라 복제되지 않습니다.
- 가상 테이블에는 연관된 SSTable이 없습니다.
- 가상 테이블로 보내는 쿼리의 일관성 수준은 무시됩니다.
- 모든 기존 가상 테이블은 LocalPartitioner를 사용합니다. 가상 테이블은 복제되지 않으므로 파티셔너는 해시가 아닌 파티션 키 순서로 정렬해요.
- ALLOW FILTERING과 집계 함수를 사용하는 고급 쿼리는 일반 테이블에서는 권장되지 않지만 가상 테이블에서는 실행할 수 있습니다.
출처: 문서
본문
가상 키스페이스 (Virtual Keyspaces)
Apache Cassandra 4.0은 가상 테이블을 위해 두 개의 새 키스페이스를 추가했습니다:
- system_virtual_schema
- system_views
system_virtual_schema 키스페이스에는 세 개의 테이블이 있습니다: keyspaces, columns, tables로 각각 가상 키스페이스, 테이블, 컬럼 정의를 담당해요. 이 테이블들은 가상 테이블에 대한 스키마 정보를 포함합니다. Cassandra가 내부적으로 사용하며 사용자가 직접 접근해서는 안 됩니다.
system_views 키스페이스에는 실제 가상 테이블이 들어 있습니다.
가상 테이블 제한 사항
가상 키스페이스와 테이블을 논의하기 전에, 가상 키스페이스와 테이블에는 몇 가지 제한 사항이 있다는 점을 유의하세요. 이러한 제한은 변경될 수 있습니다. 가상 키스페이스는 변경(alter)하거나 삭제(drop)할 수 없어요. 사실 가상 키스페이스에 대해 어떤 연산도 수행할 수 없습니다.
가상 키스페이스에 가상 테이블을 만들 수 없습니다. 가상 테이블은 변경, 삭제, 잘라내기(truncate)할 수 없어요. 가상 테이블에 대해 이차 인덱스, 타입, 함수, 애그리게이트, 구체화된 뷰, 트리거를 만들 수 없습니다. 만료 수명(TTL) 컬럼을 만들 수 없습니다. 가상 테이블은 조건부 업데이트나 삭제를 지원하지 않아요. SELECT 문에서 애그리게이트를 실행할 수 있습니다.
조건부 배치 문은 가상 테이블에 대한 변경을 포함할 수 없으며, 가상 테이블 문을 로그 배치에 포함할 수도 없어요. 사실 가상 테이블과 일반 테이블에 대한 변경은 같은 배치 테이블에서 일어날 수 없습니다.
가상 테이블
system_views 가상 키스페이스의 각 가상 테이블은 서로 다른 정보를 포함합니다.
다음 표는 가상 테이블을 설명합니다:
| 가상 테이블 | 설명 |
|---|---|
| caches | 일반 캐시 정보 표시: cache name, capacity_bytes, entry_count, hit_count, hit_ratio double, recent_hit_rate_per_second, recent_request_rate_per_second, request_count, size_bytes |
| cidr_filtering_metrics_counts | CIDR 필터링에 특화된 개수 메트릭 |
| cidr_filtering_metrics_latencies | CIDR 필터링에 특화된 지연 시간 메트릭 |
| clients | 모든 연결된 클라이언트에 대한 정보 나열 |
| coordinator_read_latency | 조정자 읽기에 대한 counts, keyspace_name, table_name, max, median, per_second 기록 |
| coordinator_scan | 조정자 스캔에 대한 counts, keyspace_name, table_name, max, median, per_second 기록 |
| coordinator_write_latency | 조정자 쓰기에 대한 counts, keyspace_name, table_name, max, median, per_second 기록 |
| disk_usage | disk_space, keyspace_name, table_name을 포함한 디스크 사용량 기록, 시스템 키스페이스로 정렬 |
| internode_inbound | 인바운드 노드 간 메시징 정보 나열 |
| internode_outbound | 아웃바운드 노드 간 메시징 정보 |
| local_read_latency | 로컬 읽기에 대한 counts, keyspace_name, table_name, max, median, per_second 기록 |
| local_scan | 로컬 스캔에 대한 counts, keyspace_name, table_name, max, median, per_second 기록 |
| local_write_latency | 로컬 쓰기에 대한 counts, keyspace_name, table_name, max, median, per_second 기록 |
| max_partition_size | 최대 파티션 크기 테이블 메트릭 |
| rows_per_read | 읽힌 행에 대한 counts, keyspace_name, table_name, max, median 기록 |
| settings | cassandra.yaml의 구성 설정 표시 |
| sstable_tasks | 컴팩션·업그레이드 같은 연산에 대해 SSTable에서 현재 실행 중인 작업과 진행률 나열 |
| system_logs | logback.xml의 CQLLOG appender로 기록된 경우 Cassandra 로그 표시 |
| system_properties | 노드에 설정된 환경 시스템 속성 표시 |
| thread_pools | 각 스레드 풀 메트릭 나열 |
| tombstones_per_read | 툼스톤에 대한 counts, keyspace_name, table_name, max, median 기록 |
CASSANDRA-18238부터 사용성 개선을 위해 system_logs를 제외한 모든 테이블에는 CQL 명세에서 요구할 때 쿼리에 ALLOW FILTERING이 암시적으로 추가됩니다.
다음에서 일부 가상 테이블을 더 자세히 논의할게요.
Clients 가상 테이블
clients 가상 테이블은 활성 연결(연결된 클라이언트)을 모두 나열하며 ip address, port, client_options, connection stage, driver name, driver version, protocol version, request count, ssl enabled, ssl protocol, user name을 포함합니다:
cqlsh> SELECT * FROM system_views.clients;
@ Row 1
------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
address | 127.0.0.1
port | 50687
client_options | {'CQL_VERSION': '3.4.7', 'DRIVER_NAME': 'DataStax Python Driver', 'DRIVER_VERSION': '3.25.0'}
connection_stage | ready
driver_name | DataStax Python Driver
driver_version | 3.25.0
protocol_version | 5
request_count | 16
ssl_cipher_suite | null
ssl_enabled | False
ssl_protocol | null
username | anonymous
@ Row 2
------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
address | 127.0.0.1
port | 50688
client_options | {'CQL_VERSION': '3.4.7', 'DRIVER_NAME': 'DataStax Python Driver', 'DRIVER_VERSION': '3.25.0'}
connection_stage | ready
driver_name | DataStax Python Driver
driver_version | 3.25.0
protocol_version | 5
request_count | 4
ssl_cipher_suite | null
ssl_enabled | False
ssl_protocol | null
username | anonymous
@ Row 3
------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
address | 127.0.0.1
port | 50753
client_options | {'APPLICATION_NAME': 'TestApp', 'APPLICATION_VERSION': '1.0.0', 'CLIENT_ID': '55b3efbd-c56b-469d-8cca-016b860b2f03', 'CQL_VERSION': '3.0.0', 'DRIVER_NAME': 'DataStax Java driver for Apache Cassandra(R)', 'DRIVER_VERSION': '4.13.0'}
connection_stage | ready
driver_name | DataStax Java driver for Apache Cassandra(R)
driver_version | 4.13.0
protocol_version | 5
request_count | 18
ssl_cipher_suite | null
ssl_enabled | False
ssl_protocol | null
username | anonymous
@ Row 4
------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
address | 127.0.0.1
port | 50755
client_options | {'APPLICATION_NAME': 'TestApp', 'APPLICATION_VERSION': '1.0.0', 'CLIENT_ID': '55b3efbd-c56b-469d-8cca-016b860b2f03', 'CQL_VERSION': '3.0.0', 'DRIVER_NAME': 'DataStax Java driver for Apache Cassandra(R)', 'DRIVER_VERSION': '4.13.0'}
connection_stage | ready
driver_name | DataStax Java driver for Apache Cassandra(R)
driver_version | 4.13.0
protocol_version | 5
request_count | 7
ssl_cipher_suite | null
ssl_enabled | False
ssl_protocol | null
username | anonymous
(4 rows)
clients가 사용될 수 있는 예는 다음과 같아요:
- 업그레이드 전에 오래되고 호환되지 않는 버전의 드라이버를 사용하는 애플리케이션을 찾고, 업그레이드 중에는
nodetool enableoldprotocolversions와nodetool disableoldprotocolversions로 찾기 - 너무 많은 요청을 보내는 클라이언트 식별
- SSL로 또는 SSL에서 마이그레이션하는 동안 SSL이 활성화되어 있는지 찾기
가상 테이블은 DESCRIBE 문으로 설명할 수 있습니다. 그러나 나열된 DDL은 가상 테이블을 만드는 데 실행할 수 없어요. 예를 들어 system_views.clients 가상 테이블을 설명하세요:
cqlsh> DESCRIBE TABLE system_views.clients;
/*
Warning: Table system_views.clients is a virtual table and cannot be recreated with CQL.
Structure, for reference:
VIRTUAL TABLE system_views.clients (
address inet,
port int,
client_options frozen<map<text, text>>,
connection_stage text,
driver_name text,
driver_version text,
protocol_version int,
request_count bigint,
ssl_cipher_suite text,
ssl_enabled boolean,
ssl_protocol text,
username text,
PRIMARY KEY (address, port)
) WITH CLUSTERING ORDER BY (port ASC)
AND comment = 'currently connected clients';
*/
Caches 가상 테이블
caches 가상 테이블은 캐시에 대한 정보를 나열합니다. 현재 생성된 네 개의 캐시는 chunks, counters, keys, rows입니다. caches 가상 테이블에 대한 쿼리는 다음 세부 사항을 반환합니다:
cqlsh:system_views> SELECT * FROM system_views.caches;
name | capacity_bytes | entry_count | hit_count | hit_ratio | recent_hit_rate_per_second | recent_request_rate_per_second | request_count | size_bytes
---------+----------------+-------------+-----------+-----------+----------------------------+--------------------------------+---------------+------------
chunks | 229638144 | 29 | 166 | 0.83 | 5 | 6 | 200 | 475136
counters | 26214400 | 0 | 0 | NaN | 0 | 0 | 0 | 0
keys | 52428800 | 14 | 124 | 0.873239 | 4 | 4 | 142 | 1248
rows | 0 | 0 | 0 | NaN | 0 | 0 | 0 | 0
(4 rows)
CIDR 필터링 메트릭 가상 테이블
cidr_filtering_metrics_counts 가상 테이블은 CIDR 필터링에 특화된 개수 메트릭을 나열합니다. cidr_filtering_metrics_counts 가상 테이블에 대한 쿼리는 아래와 유사한 메트릭을 나열해요.
cqlsh> select * from system_views.cidr_filtering_metrics_counts;
name | value
--------------------------------------------------------+-------
CIDR groups cache reload count | 2
Number of CIDR accesses accepted from CIDR group - aws | 15
Number of CIDR accesses accepted from CIDR group - gcp | 30
Number of CIDR accesses rejected from CIDR group - gcp | 6
cidr_filtering_metrics_latencies 가상 테이블은 CIDR 필터링에 특화된 지연 시간 메트릭을 나열합니다. cidr_filtering_metrics_latencies 가상 테이블에 대한 쿼리는 아래 메트릭을 나열해요.
cqlsh> select * from system_views.cidr_filtering_metrics_latencies;
name | max | p50th | p95th | p999th | p99th
---------------------------------------------+-------+-------+-------+--------+-------
CIDR checks latency (ns) | 24601 | 1 | 11864 | 24601 | 24601
CIDR groups cache reload latency (ns) | 42510 | 42510 | 42510 | 42510 | 42510
Lookup IP in CIDR groups cache latency (ns) | 1 | 1 | 1 | 1 | 1
CQL 메트릭 가상 테이블
cql_metrics 가상 테이블은 CQL prepared statement 캐싱에 특화된 메트릭을 나열합니다. cql_metrics 가상 테이블에 대한 쿼리는 아래 메트릭을 나열해요.
cqlsh> select * from system_views.cql_metrics ;
name | value
------------------------------+-------
prepared_statements_count | 0
prepared_statements_evicted | 0
prepared_statements_executed | 0
prepared_statements_ratio | 0
regular_statements_executed | 17
CIDR 필터링 메트릭 가상 테이블
cidr_filtering_metrics_counts 가상 테이블은 CIDR 필터링에 특화된 개수 메트릭을 나열합니다. cidr_filtering_metrics_counts 가상 테이블에 대한 쿼리는 아래와 유사한 메트릭을 나열해요.
cqlsh> select * from system_views.cidr_filtering_metrics_counts;
name | value
--------------------------------------------------------+-------
CIDR groups cache reload count | 2
Number of CIDR accesses accepted from CIDR group - aws | 15
Number of CIDR accesses accepted from CIDR group - gcp | 30
Number of CIDR accesses rejected from CIDR group - gcp | 6
cidr_filtering_metrics_latencies 가상 테이블은 CIDR 필터링에 특화된 지연 시간 메트릭을 나열합니다. cidr_filtering_metrics_latencies 가상 테이블에 대한 쿼리는 아래 메트릭을 나열해요.
cqlsh> select * from system_views.cidr_filtering_metrics_latencies;
name | max | p50th | p95th | p999th | p99th
---------------------------------------------+-------+-------+-------+--------+-------
CIDR checks latency (ns) | 24601 | 1 | 11864 | 24601 | 24601
CIDR groups cache reload latency (ns) | 42510 | 42510 | 42510 | 42510 | 42510
Lookup IP in CIDR groups cache latency (ns) | 1 | 1 | 1 | 1 | 1
CQL 메트릭 가상 테이블
cql_metrics 가상 테이블은 CQL prepared statement 캐싱에 특화된 메트릭을 나열합니다. cql_metrics 가상 테이블에 대한 쿼리는 아래 메트릭을 나열해요.
cqlsh> select * from system_views.cql_metrics ;
name | value
------------------------------+-------
prepared_statements_count | 0
prepared_statements_evicted | 0
prepared_statements_executed | 0
prepared_statements_ratio | 0
regular_statements_executed | 17
Settings 가상 테이블
settings 테이블은 cassandra.yaml의 모든 현재 구성 설정을 나열하므로 꽤 유용해요. 암호화 옵션은 민감한 truststore 정보나 비밀번호를 숨기기 위해 재정의됩니다. 하지만 구성 설정은 현재 가상 테이블에서 DML을 사용해 설정할 수 없습니다:
cqlsh:system_views> SELECT * FROM system_views.settings;
name | value
-------------------------------------+--------------------
allocate_tokens_for_keyspace | null
audit_logging_options_enabled | false
auto_snapshot | true
automatic_sstable_upgrade | false
cluster_name | Test Cluster
enable_transient_replication | false
hinted_handoff_enabled | true
hints_directory | /home/ec2-user/cassandra/data/hints
incremental_backups | false
initial_token | null
...
...
...
rpc_address | localhost
ssl_storage_port | 7001
start_native_transport | true
storage_port | 7000
stream_entire_sstables | true
(224 rows)
settings 테이블은 yaml 파일이 시작 이후 변경됐고 실행 중 구성을 모르거나, jmx/nodetool 또는 가상 테이블을 통해 수정됐는지 찾으려 할 때 정말 유용할 수 있어요.
Thread Pools 가상 테이블
thread_pools 테이블은 모든 스레드 풀에 대한 정보를 나열합니다. 스레드 풀 정보는 active tasks, active tasks limit, blocked tasks, blocked tasks all time, completed tasks, pending tasks를 포함해요. thread_pools에 대한 쿼리는 다음 세부 사항을 반환합니다:
cqlsh:system_views> select * from system_views.thread_pools;
name | active_tasks | active_tasks_limit | blocked_tasks | blocked_tasks_all_time | completed_tasks | pending_tasks
------------------------------+--------------+--------------------+---------------+------------------------+-----------------+---------------
AntiEntropyStage | 0 | 1 | 0 | 0 | 0 | 0
CacheCleanupExecutor | 0 | 1 | 0 | 0 | 0 | 0
CompactionExecutor | 0 | 2 | 0 | 0 | 881 | 0
CounterMutationStage | 0 | 32 | 0 | 0 | 0 | 0
GossipStage | 0 | 1 | 0 | 0 | 0 | 0
HintsDispatcher | 0 | 2 | 0 | 0 | 0 | 0
InternalResponseStage | 0 | 2 | 0 | 0 | 0 | 0
MemtableFlushWriter | 0 | 2 | 0 | 0 | 1 | 0
MemtablePostFlush | 0 | 1 | 0 | 0 | 2 | 0
MemtableReclaimMemory | 0 | 1 | 0 | 0 | 1 | 0
MigrationStage | 0 | 1 | 0 | 0 | 0 | 0
MiscStage | 0 | 1 | 0 | 0 | 0 | 0
MutationStage | 0 | 32 | 0 | 0 | 0 | 0
Native-Transport-Requests | 1 | 128 | 0 | 0 | 130 | 0
PendingRangeCalculator | 0 | 1 | 0 | 0 | 1 | 0
PerDiskMemtableFlushWriter_0 | 0 | 2 | 0 | 0 | 1 | 0
ReadStage | 0 | 32 | 0 | 0 | 13 | 0
Repair-Task | 0 | 2147483647 | 0 | 0 | 0 | 0
RequestResponseStage | 0 | 2 | 0 | 0 | 0 | 0
Sampler | 0 | 1 | 0 | 0 | 0 | 0
SecondaryIndexManagement | 0 | 1 | 0 | 0 | 0 | 0
ValidationExecutor | 0 | 2147483647 | 0 | 0 | 0 | 0
ViewBuildExecutor | 0 | 1 | 0 | 0 | 0 | 0
ViewMutationStage | 0 | 32 | 0 | 0 | 0 | 0
(24 rows)
Internode Inbound Messaging 가상 테이블
internode_inbound 가상 테이블은 노드 간 인바운드 메시징을 위한 것입니다. 처음에는 아무 노드 간 인바운드 메시징도 나열되지 않을 수 있어요. address, port, datacenter, rack 정보 외에도 corrupt frames recovered, corrupt frames unrecovered, error bytes, error count, expired bytes, expired count, processed bytes, processed count, received bytes, received count, scheduled bytes, scheduled count, throttled count, throttled nanos, using bytes, using reserve bytes가 포함됩니다. internode_inbound에 대한 쿼리는 다음 세부 사항을 반환합니다:
cqlsh:system_views> SELECT * FROM system_views.internode_inbound;
address | port | dc | rack | corrupt_frames_recovered | corrupt_frames_unrecovered |
error_bytes | error_count | expired_bytes | expired_count | processed_bytes |
processed_count | received_bytes | received_count | scheduled_bytes | scheduled_count | throttled_count | throttled_nanos | using_bytes | using_reserve_bytes
---------+------+----+------+--------------------------+----------------------------+-
(0 rows)
SSTables Tasks 가상 테이블
sstable_tasks는 실행 중인 작업에 대한 정보를 얻는 데 사용할 수 있어요. 다음 컬럼을 나열합니다:
cqlsh:system_views> SELECT * FROM sstable_tasks;
keyspace_name | table_name | task_id | kind | progress | total | unit
---------------+------------+--------------------------------------+------------+----------+----------+-------
basic | wide2 | c3909740-cdf7-11e9-a8ed-0f03de2d9ae1 | compaction | 60418761 | 70882110 | bytes
basic | wide2 | c7556770-cdf7-11e9-a8ed-0f03de2d9ae1 | compaction | 2995623 | 40314679 | bytes
또 다른 예로, SSTable 작업에 남은 시간이 얼마인지 찾으려면 다음 쿼리를 사용하세요:
SELECT total - progress AS remaining
FROM system_views.sstable_tasks;
기타 가상 테이블
다른 가상 테이블을 사용하는 예는 다음과 같습니다.
디스크 사용량이 가장 많은 테이블 찾기:
cqlsh> SELECT * FROM disk_usage WHERE mebibytes > 1 ALLOW FILTERING;
keyspace_name | table_name | mebibytes
---------------+------------+-----------
keyspace1 | standard1 | 288
tlp_stress | keyvalue | 3211
읽기 지연 시간이 가장 큰 테이블의 쿼리 찾기:
cqlsh> SELECT * FROM local_read_latency WHERE per_second > 1 ALLOW FILTERING;
keyspace_name | table_name | p50th_ms | p99th_ms | count | max_ms | per_second
---------------+------------+----------+----------+----------+---------+------------
tlp_stress | keyvalue | 0.043 | 0.152 | 49785158 | 186.563 | 11418.356
예제
- 키스페이스를 나열하려면 cqlsh에 들어가 CQL 명령
DESCRIBE KEYSPACES를 실행하세요:
cqlsh> DESC KEYSPACES;
system_schema system system_distributed system_virtual_schema
system_auth system_traces system_views
- 가상 테이블 스키마를 보려면 CQL 명령
USE system_virtual_schema와SELECT * FROM tables를 실행하세요:
cqlsh> USE system_virtual_schema;
cqlsh> SELECT * FROM tables;
결과:
keyspace_name | table_name | comment
-----------------------+---------------------------+--------------------------------------
system_views | caches | system caches
system_views | clients | currently connected clients
system_views | coordinator_read_latency |
system_views | coordinator_scan_latency |
system_views | coordinator_write_latency |
system_views | disk_usage |
system_views | internode_inbound |
system_views | internode_outbound |
system_views | local_read_latency |
system_views | local_scan_latency |
system_views | local_write_latency |
system_views | max_partition_size |
system_views | rows_per_read |
system_views | settings | current settings
system_views | sstable_tasks | current sstable tasks
system_views | system_properties | Cassandra relevant system properties
system_views | thread_pools |
system_views | tombstones_per_read |
system_virtual_schema | columns | virtual column definitions
system_virtual_schema | keyspaces | virtual keyspace definitions
system_virtual_schema | tables | virtual table definitions
(21 rows)
- 가상 테이블을 보려면 CQL 명령
USE system_view와DESCRIBE tables를 실행하세요:
cqlsh> USE system_view;;
cqlsh> DESCRIBE tables;
결과:
sstable_tasks clients coordinator_write_latency
disk_usage local_write_latency tombstones_per_read
thread_pools internode_outbound settings
local_scan_latency coordinator_scan_latency system_properties
internode_inbound coordinator_read_latency max_partition_size
local_read_latency rows_per_read caches
- 테이블 데이터를 보려면 CQL 명령
SELECT를 실행하세요:
cqlsh> USE system_view;;
cqlsh> SELECT * FROM clients LIMIT 2;
결과:
address | port | connection_stage | driver_name | driver_version | protocol_version | request_count | ssl_cipher_suite | ssl_enabled | ssl_protocol | username
-----------+-------+------------------+------------------------+----------------+------------------+---------------+------------------+-------------+--------------+-----------
127.0.0.1 | 37308 | ready | DataStax Python Driver | 3.21.0.post0 | 4 | 17 | null | False | null | anonymous
127.0.0.1 | 37310 | ready | DataStax Python Driver | 3.21.0.post0 | 4 | 8 | null | False | null | anonymous
(2 rows)
더 알아보기 (Learn more)
- 노드 간 메시징 — internode 가상 테이블
- 캐시/메트릭 관련 cassandra.yaml 설정
- 모니터링