我正在尝试跟踪分区的当前大小。我试图不创建宽分区。我不需要有确切的数字,只需要一个大概的估计。作为我计划的一部分,我打算在'meta_table'中维护实际分区的元数据,并在'data_table'中维护实际数据
meta_table = CREATE TABLE meta_table (user TEXT, partition_id BIGINT, size BIGINT, PRIMARY KEY(user, partition_id));
data_table = CREATE TABLE data_table (user TEXT, partition_id BIGINT, key TEXT, value TEXT, PRIMARY KEY((user, partition_id), key));
为了确定我是否越过了data_table中的某个分区大小限制(50 Mb),我将在写入data_table之前读取meta_table。如果我已经超过了大小限制,我将创建一个新的分区并在meta_table中维护它,同时将数据插入到data_table中的新分区_id中,否则更新meta_table中该分区_id的大小并插入到data_table中的相同分区_id中。
Read:Write ratio为1。这样可以吗?或者有其他方法可以实现这一点吗?
Cassandra本身将在分区大小上存储元数据,这可能适合您,具体取决于您的确切需求。您可以通过以下命令查看表的压缩min/max/avg分区大小:
nodetool tablestats <keyspace.table>
如果您需要更精确的数字,您也可以下载并使用DSBulk: https://docs.datastax.com/en/dsbulk/docs/install/dsbulkInstall.html
使用count选项,您可以提取任何指定数量的分区,按从大到小排序,以及分区键,例如,查看您将运行的最大的10个分区:
dsbulk count --stats.modes partitions --stats.numPartitions 10 -k myKeyspace -t myTable
如果这需要在插入操作中以编程方式完成,那么可能需要检查系统。Size_estimates表可以为您提供快速获取平均大小的方法:
select avg(mean_partition_size) from system.size_estimates where keyspace_name = 'keyspace' and table_name = 'table';
希望其中一个能帮到你。
快速的回答是,是的,你可以存储任何你想要的数据,但真正的问题是"你想要解决什么问题?">
你的建议是做一个读前写,这是昂贵的,所以它会影响你的应用程序的性能。
你发布的模式显示你的用例在Cassandra中存储键值对。由于每个分区只包含一个单元格值,那么您真正希望分区增长到多大呢?那么,您试图通过存储分区元数据来解决什么问题呢?
根据你问题中有限的细节,我觉得你的建议似乎不是个好主意。干杯!