如果节点脱机则加快cassandra查询的速度

问题描述 投票:0回答:1

工作代码:

using System;
using Cassandra;

    namespace CassandraSelectTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                var cluster = Cluster.Builder()
                .AddContactPoints("192.168.0.18","192.168.0.21","192.168.0.22","192.168.0.23","192.168.0.24")
                .WithPort(9042)
                .Build();

                var session = cluster.Connect("test_keyspace");

                var results = session.Execute("SELECT * FROM test_table");

                foreach(var result in results)
                {
                    Console.WriteLine(result.GetValue<string>("col1"));
                }

                Console.WriteLine($"Finished");
                Console.ReadKey();
            }
        }
    }

设置:

Nodes = 5
Replication = 5
Consistency = 1

测试:

一次拖放1个节点以查看上面的代码是否继续工作。


结果:

代码在每个节点都脱机后继续工作,然后在所有节点都脱机时给出预期的错误。但是,脱机的节点越多,代码运行所需的时间就越长。每个脱机节点大约多出5秒。


速度:

5 nodes online = 1 second
4 nodes online = 5 seconds
3 nodes online = 10 seconds
2 nodes online = 15 seconds
1 node online = 20 seconds

问题:

是否可以加快代码中的查询速度,以便在节点脱机时不需要花费更长的时间?或者,如果大多数节点都处于脱机状态,则至少可以减少运行查询所花费的时间?

c# cassandra cassandra-3.0 distributed-database
1个回答
2
投票

您是否正在衡量该代码的总执行时间?还是您对测量应用程序初始化后运行查询所花费的时间感兴趣?

在初始化(cluster.Connect)期间,驱动程序将迭代触点集合,直到它能够成功打开控制连接为止,因此,如果要使此初始化更快,必须从该列表中删除脱机节点。

此外,默认情况下,驱动程序在初始化期间运行预热操作,该操作包括打开与负载平衡策略返回的所有节点的连接,因此此处也会存在超时。您可以尝试设置.WithPoolingOptions(new PoolingOptions().SetWarmup(false))以加快初始化速度。

禁用预热操作可能会使第一个查询变慢,直到驱动程序识别出哪些节点脱机为止。在这种情况下,建议的减少查询执行时间的方法是使用推测性重试(https://docs.datastax.com/en/developer/csharp-driver/3.12/features/speculative-retries)。

© www.soinside.com 2019 - 2024. All rights reserved.