如果节点离线,则加速 cassandra 查询
Speeding up cassandra queries if nodes are offline
工作代码:
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
问题:
是否可以在代码中加快查询速度,以便在节点离线时不会花费更长的时间?或者至少减少 运行 如果大多数节点处于离线状态的查询所需的时间?
您是否在测量该代码的总执行时间?或者您更感兴趣的是测量应用程序在初始化后 运行 查询所花费的时间?
在初始化(cluster.Connect
)期间,驱动程序迭代接触点集合,直到它能够成功打开控制连接,所以如果你想让这个初始化更快,你必须从中删除离线节点列表。
此外,默认情况下,驱动程序 运行 在初始化期间执行预热操作,其中包括打开与负载平衡策略返回的所有节点的连接,因此此处也会出现超时。您可以尝试设置 .WithPoolingOptions(new PoolingOptions().SetWarmup(false))
以加快初始化速度。
禁用预热操作可能会使第一个查询变慢,直到驱动程序识别出哪些节点处于脱机状态。在这种情况下减少查询执行时间的推荐方法是使用推测重试 (https://docs.datastax.com/en/developer/csharp-driver/3.12/features/speculative-retries)。
工作代码:
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
问题:
是否可以在代码中加快查询速度,以便在节点离线时不会花费更长的时间?或者至少减少 运行 如果大多数节点处于离线状态的查询所需的时间?
您是否在测量该代码的总执行时间?或者您更感兴趣的是测量应用程序在初始化后 运行 查询所花费的时间?
在初始化(cluster.Connect
)期间,驱动程序迭代接触点集合,直到它能够成功打开控制连接,所以如果你想让这个初始化更快,你必须从中删除离线节点列表。
此外,默认情况下,驱动程序 运行 在初始化期间执行预热操作,其中包括打开与负载平衡策略返回的所有节点的连接,因此此处也会出现超时。您可以尝试设置 .WithPoolingOptions(new PoolingOptions().SetWarmup(false))
以加快初始化速度。
禁用预热操作可能会使第一个查询变慢,直到驱动程序识别出哪些节点处于脱机状态。在这种情况下减少查询执行时间的推荐方法是使用推测重试 (https://docs.datastax.com/en/developer/csharp-driver/3.12/features/speculative-retries)。