【问题标题】:Understanding read from a single partition in Cassandra了解从 Cassandra 中的单个分区读取
【发布时间】:2018-06-07 06:01:50
【问题描述】:

我有一个 3 节点设置,Node1 (172.30.56.60)、Node2 (172.30.56.61) 和 Node3 (172.30.56.62), 单分区数据100K,分区由nodeip框定。
请找到 nodeip - 172.30.56.60 的令牌/分区值

cqlsh:qnapstat> SELECT token(nodeip) FROM nodedata WHERE nodeip = '172.30.56.60' LIMIT 5; 

 system.token(nodeip)
----------------------
   222567180698744628
   222567180698744628
   222567180698744628
   222567180698744628
   222567180698744628

根据下面提供的 ./nodetool 环值,“172.30.56.60”只会将数据返回给协调器,因为从 173960939250606057 到 239923324758894350 的值是在节点 172.30.56.60 处处理的。 注意:这是我的理解

172.30.56.60  rack1       Up     Normal  32.72 MiB       100.00%             173960939250606057                          
172.30.56.62  rack1       Up     Normal  32.88 MiB       100.00%             239923324758894351                          
172.30.56.61  rack1       Up     Normal  32.84 MiB       100.00%             253117576269706963                          
172.30.56.60  rack1       Up     Normal  32.72 MiB       100.00%             273249439554531014                          
172.30.56.61  rack1       Up     Normal  32.84 MiB       100.00%             295635292275517104                          
172.30.56.62  rack1       Up     Normal  32.88 MiB       100.00%             301162927966816823                          

我有两个问题,

1) 当我尝试执行以下查询时,是否意味着协调器(例如 172.30.56.61)从 172.30.56.60 读取所有数据?

2) 是不是Coordinator接收到所有100K的entry在coordinator后,会进行100K的聚合,如果是的话,是不是把所有100K的entry都保存在172.30.56.61的内存中?

SELECT Max(readiops) FROM nodedata WHERE nodeip = '172.30.56.60';

【问题讨论】:

    标签: cassandra cassandra-3.0


    【解决方案1】:

    有一个名为 CQL TRACING 的好工具,可以帮助您了解和查看执行 SELECT 查询后的事件流。

    cqlsh> INSERT INTO test.nodedata (nodeip, readiops) VALUES (1, 10);
    cqlsh> INSERT INTO test.nodedata (nodeip, readiops) VALUES (1, 20);
    cqlsh> INSERT INTO test.nodedata (nodeip, readiops) VALUES (1, 30);
    cqlsh> select * from test.nodedata ;
    
     nodeip | readiops   
    --------+-----------
          1 |        10 
          1 |        20 
          1 |        30 
    
    (3 rows)
    cqlsh> SELECT MAX(readiops) FROM test.nodedata WHERE nodeip = 1;
    
     system.max(readiops)
    -----------------------
                       30
    
    (1 rows)
    

    现在让我们设置cqlsh> TRACING ON 并再次运行相同的查询。

    cqlsh> TRACING ON
    Now Tracing is enabled
    cqlsh> SELECT MAX(readiops) FROM test.nodedata WHERE nodeip = 1;
    
     system.max(readiops)
    ----------------------
                       30
    
    (1 rows)
    
    Tracing session: 4d7bf970-eada-11e7-a79d-000000000003
    
    
     activity                                                                                                                                                        | timestamp                  | source       | source_elapsed
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+--------------+----------------
                                                                                                                                                  Execute CQL3 query | 2017-12-27 07:48:44.404000 | 172.16.0.128 |              0
                                                                                                            read_data: message received from /172.16.0.128 [shard 4] | 2017-12-27 07:48:44.385109 |  172.16.0.48 |              9
                                                                                           read_data handling is done, sending a response to /172.16.0.128 [shard 4] | 2017-12-27 07:48:44.385322 |  172.16.0.48 |            222
                                                                                                                                       Parsing a statement [shard 1] | 2017-12-27 07:48:44.404821 | 172.16.0.128 |             --
                                                                                                                                    Processing a statement [shard 1] | 2017-12-27 07:48:44.404913 | 172.16.0.128 |             93
     Creating read executor for token 6292367497774912474 with all: {172.16.0.128, 172.16.0.48, 172.16.0.115} targets: {172.16.0.48} repair decision: NONE [shard 1] | 2017-12-27 07:48:44.404966 | 172.16.0.128 |            146
                                                                                                              read_data: sending a message to /172.16.0.48 [shard 1] | 2017-12-27 07:48:44.404972 | 172.16.0.128 |            152
                                                                                                                 read_data: got response from /172.16.0.48 [shard 1] | 2017-12-27 07:48:44.405497 | 172.16.0.128 |            676
                                                                                                                      Done processing - preparing a result [shard 1] | 2017-12-27 07:48:44.405535 | 172.16.0.128 |            715
                                                                                                                                                    Request complete | 2017-12-27 07:48:44.404722 | 172.16.0.128 |            722
    

    至于你的问题:

      1234563 ),而不是需要接收来自多个副本的回复并比较答案,因此在协调器端也进行了编排。 它实际完成的方式是对最快副本的数据请求(使用 snitch)和对满足 CL 所需的其他副本的摘要请求。 然后协调器需要对来自数据的响应进行哈希处理,并消化请求并比较它们。 如果分区被散列到特定节点,它将驻留在该节点中(假设 RF=1)并且信息将仅从该节点读取。
    1. 客户端与查询一起发送页面大小,因此回复本身是批量返回的(默认=5000),可以从客户端设置。

    我建议在 Cassandra 阅读路径上观看此 youtube 剪辑以了解更多详细信息。

    【讨论】:

    • 当我尝试执行以下查询时,是否意味着协调器(比如 172.30.56.61)从 172.30.56.60 读取了所有数据?你能回答这个问题吗?
    • 或者即使是同一个分区的数据也会从多个节点读取?
    • 协调器将查询发送到replica/s,replica/s批量返回数据。我确实回答了,这取决于 RF + CL 设置。你为什么投-1票?
    • 我添加了更多信息,我希望这是您要求的信息。
    • 什么是厕所?您是说一致性级别 (CL) 吗?当使用 RF=3 时,这意味着所有数据都被复制了 3 次,并且 3 个节点中的每一个都保存了您的所有数据库数据。这意味着可以从任何 3 个节点提供对该分区的任何查询。根据 CL (1, Q, ALL) ,协调器需要从 1 / 2 / 3 个服务器获取响应。在“ALL”中,Snitch 网络感知不相关,但在 CL=Q(2 个节点必须回复)中,Snitch 帮助 Coordinator 选择最快的 2 个节点。最快将获得数据请求和第二个摘要请求。 RING 也用于 HA 目的。
    猜你喜欢
    • 2020-05-15
    • 2020-01-23
    • 2018-05-27
    • 2021-11-12
    • 2016-07-19
    • 2020-02-08
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多