>你好,我刚开始使用Cassandra不太熟悉,你能告诉我这里的错误吗
我正在尝试使用波纹管代码插入 16000 条记录
public async Task AddSprintsStories(List<SprintStories> sprintStories)
{
var tasks = new List<Task>();
try
{
if (sprintStories.Count > 0)
{
foreach (var item in sprintStories)
{
SprintStories sprintStoryData = new SprintStories();
sprintStoryData.Id = item.Id;
sprintStoryData.ProjectId = item.ProjectId;
sprintStoryData.SprintId = item.SprintId;
tasks.Add(mapper.InsertAsync<SprintStories>(sprintStoryData, new CqlQueryOptions().SetConsistencyLevel(ConsistencyLevel.LocalQuorum)));
}
await Task.WhenAll(tasks);
}
}
catch (Exception e)
{
}
}
但面临错误:C# 服务器在一致性本地仲裁写入查询期间超时(0 个对等方确认写入超过 2 个需要(
任何人都可以在这里帮助我吗
Cassandra 星团在这个星团中看起来如何? CPU 或磁盘 I/O 已用完? 不知道这一点,我的猜测是这 16000 次写入的速度比您的集群处理它们的速度更快,从而产生了回写压力。 最后,它无法再处理,所以他们开始失败。
对于可能的解决方案,请尝试限制活动线程的数量。 这样的事情应该可以做到。
int maxActiveThreads = 20;
int activeThreads = 0;
foreach (var item in sprintStories)
{
...
tasks.Add(mapper.InsertAsync<SprintStories>(sprintStoryData, new CqlQueryOptions().SetConsistencyLevel(ConsistencyLevel.LocalQuorum)));
activeThreads++;
if (activeThreads >= maxActiveThreads)
{
await Task.WhenAll(tasks);
activeThreads = 0;
}
}
await Task.WhenAll(tasks);
使用此代码,在任何给定时间,只有 20 次写入会争用 Cassandra 群集资源。 请注意,我只是以 20 为例。 将该数字调整为满足性能和稳定性要求的数字。
Ryan Svihla 写了一篇关于这个主题的很棒的博客文章 - Cassandra:没有 BATCH 的批量加载 - 细致入微的版本