虚拟表
Apache Cassandra 4.0 实现虚拟表 (CASSANDRA-7622)。虚拟表是通过 API 支持的表,而不是作为 SSTable 显式管理和存储的数据。Apache Cassandra 4.0 为虚拟表实现了虚拟键空间接口。虚拟表特定于每个节点。
虚拟表的一些功能包括:
-
通过 CQL 公开指标
-
公开 YAML 配置信息
虚拟键空间和表与常规表和键空间有很大不同
-
虚拟表是在特殊键空间中创建的,而不仅仅是在任何键空间中。
-
虚拟表由 Cassandra 管理。用户不能运行 DDL 来创建新的虚拟表,也不能运行 DML 来修改现有的虚拟表。
-
虚拟表目前是只读的,尽管这可能会在以后的版本中发生变化。
-
虚拟表仅限本地,非分布式,因此不进行复制。
-
虚拟表没有关联的 SSTable。
-
发送到虚拟表的查询的一致性级别将被忽略。
-
所有现有的虚拟表都使用
LocalPartitioner
。由于虚拟表不进行复制,因此分区程序按分区键的顺序排序,而不是按其哈希值排序。 -
即使在普通表中不推荐使用,也可以在虚拟表中使用
ALLOW FILTERING
和聚合函数执行高级查询。
虚拟键空间
Apache Cassandra 4.0 为虚拟表添加了两个新的键空间
-
system_virtual_schema
-
system_views
.
system_virtual_schema
键空间包含三个表:keyspaces
、columns
和 tables
,分别用于虚拟键空间、表和列定义。这些表包含虚拟表的模式信息。它由 Cassandra 内部使用,用户不应直接访问它。
system_views
键空间包含实际的虚拟表。
虚拟表限制
在讨论虚拟键空间和表之前,请注意虚拟键空间和表有一些限制。这些限制可能会发生变化。虚拟键空间不能被更改或删除。事实上,不能对虚拟键空间执行任何操作。
虚拟键空间中不能创建虚拟表。虚拟表不能被更改、删除或截断。不能为虚拟表创建二级索引、类型、函数、聚合、物化视图和触发器。不能创建具有过期生存时间 (TTL) 的列。虚拟表不支持条件更新或删除。可以在 SELECT 语句中运行聚合。
条件批处理语句不能包含对虚拟表的变动,也不能将虚拟表语句包含在已记录的批处理中。事实上,虚拟表和常规表的变动不能在同一个批处理表中发生。
虚拟表
system_views
虚拟键空间中的每个虚拟表都包含不同的信息。
下表描述了虚拟表
虚拟表 | 描述 |
---|---|
caches |
显示常规缓存信息,包括缓存名称、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 |
记录协调器读取的计数、keyspace_name、table_name、max、median 和 per_second。 |
coordinator_scan |
记录协调器扫描的计数、keyspace_name、table_name、max、median 和 per_second。 |
coordinator_write_latency |
记录协调器写入的计数、keyspace_name、table_name、max、median 和 per_second。 |
disk_usage |
记录磁盘使用情况,包括 disk_space、keyspace_name 和 table_name,按系统键空间排序。 |
internode_inbound |
列出有关入站节点间消息传递的信息。 |
internode_outbound |
有关出站节点间消息传递的信息。 |
local_read_latency |
记录本地读取的计数、keyspace_name、table_name、max、median 和 per_second。 |
local_scan |
记录本地扫描的计数、keyspace_name、table_name、max、median 和 per_second。 |
local_write_latency |
记录本地写入的计数、keyspace_name、table_name、max、median 和 per_second。 |
max_partition_size |
最大分区大小的表指标。 |
rows_per_read |
记录读取的行数的计数、keyspace_name、tablek_name、max 和 median。 |
settings |
显示 cassandra.yaml 中的配置设置。 |
sstable_tasks |
列出当前正在运行的任务以及 SSTable 上的进度,用于压缩和升级等操作。 |
system_logs |
显示通过 logback.xml 中的 CQLLOG 追加器记录的 Cassandra 日志 |
system_properties |
显示在节点上设置的环境系统属性。 |
thread_pools |
列出每个线程池的指标。 |
tombstones_per_read |
记录墓碑的计数、keyspace_name、tablek_name、max 和 median。 |
为了提高可用性,从 CASSANDRA-18238 开始,除了 system_logs
之外的所有表在 CQL 规范需要时都会隐式地将 ALLOW FILTERING
添加到查询中。
接下来,我们将更详细地讨论一些虚拟表。
Clients 虚拟表
clients
虚拟表列出所有活动连接(已连接的客户端),包括它们的 IP 地址、端口、client_options、连接阶段、驱动程序名称、驱动程序版本、主机名、协议版本、请求计数、是否启用 SSL、SSL 协议和用户名
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
hostname | localhost
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
hostname | localhost
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
hostname | localhost
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
hostname | localhost
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,
hostname 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 预准备语句缓存相关的指标。对 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 预准备语句缓存相关的指标。对 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
表非常有用,它列出了来自 cassandra.yaml
的所有当前配置设置。加密选项被覆盖以隐藏敏感的信任库信息或密码。但是,目前无法使用 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)
如果 yaml 文件在启动后已更改,并且不知道正在运行的配置,或者要查找它们是否已通过 jmx/nodetool 或虚拟表修改,settings
表将非常有用。
线程池虚拟表
thread_pools
表列出了有关所有线程池的信息。线程池信息包括活动任务、活动任务限制、阻塞任务、所有时间的阻塞任务、已完成的任务和待处理的任务。对 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
虚拟表用于节点间入站消息。最初可能不会列出任何节点间入站消息。除了地址、端口、数据中心和机架信息外,还包括恢复的损坏帧、未恢复的损坏帧、错误字节、错误计数、过期字节、过期计数、已处理字节、已处理计数、接收字节、接收计数、已调度字节、已调度计数、节流计数、节流纳秒、使用字节、使用保留字节。对 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 任务虚拟表
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 | hostname | 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 | localhost | 4 | 17 | null | False | null | anonymous 127.0.0.1 | 37310 | ready | DataStax Python Driver | 3.21.0.post0 | localhost | 4 | 8 | null | False | null | anonymous (2 rows)