Apache Cassandra 阅读解释
Posted
技术标签:
【中文标题】Apache Cassandra 阅读解释【英文标题】:Apache Cassandra Reading explanation 【发布时间】:2018-10-09 06:51:43 【问题描述】:我目前正在管理一个由 5 个节点组成的 percona xtradb 集群,每天处理数百万次插入。写入性能非常好,但读取速度不是很快,特别是当我请求大数据集时。
插入的记录是传感器时间序列。
我想尝试用 apache cassandra 替换 percona 集群,但我不明白数据读取的工作原理。我正在寻找能够围绕所有节点拆分查询并从多个节点并行读取的东西。
我知道 cassandra 分片可以有分片副本。 如果我有 5 个节点并且我将副本因子设置为 5,那么读取速度会快 5 倍吗?
【问题讨论】:
好的,我知道 cassandra 不会深入节点之间的工作,但是: 如果我使用主键 (sensor_id, date) 创建数据的小分区,并且不同的分区存储在不同的节点中,当我询问范围超过一天的数据时,是否读取从不同节点并行读取数据? 【参考方案1】:Cassandra 读取路径
客户端发起的读取请求被发送到协调器节点,协调器节点检查分区器负责数据的副本是什么以及是否满足一致性级别。
协调器将检查它是否对数据负责。如果是,将满足请求。如果不是,它会将请求发送到最快响应的副本(这是使用dynamic snitch 确定的)。此外,还会将请求摘要发送到其他副本。
节点将比较返回的数据摘要,如果都相同并且满足一致性级别,则从最快响应的副本返回数据。如果摘要不一样,协调器会发出一些读修复操作。
在节点上执行了几个步骤:检查行缓存、检查 memtables、检查 sstables。更多信息:How is data read? 和 ReadPathForUsers。
负载平衡查询
由于您的复制因子等于节点数,这意味着每个节点都将保存您的所有数据。因此,当协调节点收到读取查询时,它会从自己那里得到满足。特别是(如果您使用 LOCAL_ONE 一致性级别,请求会非常快)。
客户端驱动程序实现load balancing policies,这意味着您可以在客户端上配置查询将如何在集群中传播。更多阅读 - ClientRequestsRead
【讨论】:
【参考方案2】:如果我有 5 个节点并且我将副本因子设置为 5,那么读取速度会快 5 倍吗?
没有。这意味着您将拥有多达 5 个数据副本,以确保在节点关闭时可以满足您的查询。 Cassandra 不会为读取分配工作。相反,它试图强迫您以一种使读取高效且快速的方式设计数据。
【讨论】:
【参考方案3】:阅读 cassandra 的最佳方法是确保您生成的每个查询都命中 cassandra 分区。这意味着您的简单主键(x,y,z)的第一部分和复合主键的第一个括号((x,y),z)作为查询参数提供。 这可以追溯到 cassandra 表设计原则,即根据您的查询需求进行表设计。
复制是关于数据的副本,而分区是关于分发数据。 https://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archPartitionerAbout.html
关于 cassandra 建模的一些参考资料, https://www.datastax.com/dev/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key
https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling
建议有 100 MB 的分区,但不是强制性的。
您可以使用 cassandra-stress 实用程序来查看您的读取和写入的外观报告。
【讨论】:
以上是关于Apache Cassandra 阅读解释的主要内容,如果未能解决你的问题,请参考以下文章
更快,可扩展性更强的 Apache Cassandra 4.0 正式发布