我们正在研究开发一种工具来捕获和分析我们收集的大量网络流量数据。每天我们捕获大约 14 亿条流记录,它们的 json 格式如下所示:
{
"tcp_flags": "0",
"src_as": "54321",
"nexthop": "1.2.3.4",
"unix_secs": "1352234521",
"src_mask": "23",
"tos": "0",
"prot": "6",
"input": "105",
"doctets": "186",
"engine_type": "0",
"exaddr": "2.3.4.5",
"engine_id": "2",
"srcaddr": "9.8.7.6",
"dst_as": "12345",
"unix_nsecs": "752265174",
"sysuptime": "2943529544",
"dst_mask": "24",
"dstport": "80",
"last": "2943523241",
"srcport": "52672",
"dpkts": "4",
"output": "111",
"dstaddr": "6.5.4.3",
"first": "2943517993"
}
Run Code Online (Sandbox Code Playgroud)
我们希望能够对数据集进行快速搜索(少于 10 秒),最有可能在很短的时间内(10 - 30 分钟间隔)。我们还希望索引大部分数据点,以便我们可以快速搜索每个数据点。我们还希望在执行搜索时拥有最新的数据视图。留在开源世界会很棒,但我们不反对为这个项目寻找专有解决方案。
这个想法是保留大约一个月的数据,这将是大约 432 亿条记录。粗略估计,每条记录将包含大约 480 字节的数据,相当于一个月内约 18.7 TB 的数据,可能是索引的三倍。最终,我们希望增加该系统存储数万亿条记录的能力。
我们已经(非常基本地)评估了 couchbase、cassandra 和 mongodb 作为这个项目的可能候选者,但是每个人都提出了自己的挑战。使用 couchbase,索引是每隔一段时间完成的,而不是在插入数据期间完成,因此视图不是最新的,cassandra 的二级索引在返回结果方面效率不高,因为它们通常需要扫描整个集群以获取结果,而 mongodb 看起来很有希望但是由于它是主/从/分片,因此扩展似乎要困难得多。我们计划评估的其他一些候选者是 elasticsearch、mysql(不确定这是否适用)和一些面向列的关系数据库。任何建议或现实世界的经验将不胜感激。
我的要求是:
目前,我们将高 CPU 超大实例的连接数最大化为 700。所有 8 个内核都已达到最大值。我们认为这是并发连接数,因为内存很好。写入本身非常简单(验证缓慢)。要扩展到 3000,我们需要转到多台服务器,当前选项:
要处理这个数量的连接,有几个问题:
如果我没有很好地描述我的问题,我深表歉意。请提问。
我正准备扩展现有的 Cassandra 集群。我已计划定期进行维修。向集群添加新节点时是否需要禁用修复,或者我可以在集群中的其他地方运行修复时引导新节点?
您是否必须nodetool repair在集群中的每个节点上运行,或者您只需要在一个节点上运行它,然后 Cassandra 会负责其余的工作?
Cassandra 文档指出,
在这些情况下不要使用索引:
- 在高基数列上,因为您随后会为少量结果查询大量记录。请参阅下面的使用高基数列索引的问题。
它继续,
如果您在具有许多不同值的高基数列上创建索引,则字段之间的查询将导致为极少的结果进行多次搜索。在包含 10 亿首歌曲的表格中,按作者(每首歌曲通常唯一的值)而不是按艺术家查找歌曲可能会非常低效。手动维护表作为索引的形式而不是使用 Cassandra 内置索引可能会更有效。对于包含唯一数据的列,为了方便起见,有时使用索引在性能方面是很好的,只要对具有索引列的表的查询量适中并且不是在恒定负载下。
但从来没有真正回答过这个问题:为什么它效率低下?我不知道“手动维护表格作为索引的形式”是什么意思。但是它与“......有时为了方便而使用索引在性能方面是很好的,只要查询量适中......”有点矛盾。
这是否只是想告诉我何时何地可以使用 PK?什么是低效?我的理解是,命中索引的查询需要查询集群中的每个¹节点,然后每个节点将在其本地索引中进行查找,然后将结果汇总。这并不一定很昂贵(每个索引查找应该相当便宜),除了我们支付网络延迟,因为我们必须等待该批次中最慢的节点。我在这里错过了什么吗?
但是,如果我有一个包含大量项目的集合——在极少数情况下——需要通过不同但几乎独特的属性来查找……这是一个合适的用途,对吧?
¹每个?IDK,如果复制意味着这可以达到集群的 1/3,复制因子是否为 3?
我正在尝试设置一个多数据中心 Cassandra 集群。问题是我的数据中心只有 1 个外部 IP(广域网 IP),我可以在数据中心交换机上设置端口转发以使用不同的端口从外部世界访问每个节点,但我不知道如何设置 cassandra .yaml 文件正确。
在这种情况下,有没有办法设置多数据中心 cassandra 集群?
提前致谢!
试图找到一种方法来轻松地将所有行从 Cassandra ColumnFamily/Table 转移到另一个。
据COPY我了解,该命令是一个不错的选择。但是,由于它将所有数据转储到.csv磁盘上,然后将其重新加载,我不禁想知道是否有更好的方法在引擎中执行此操作。
我的意思的一个具体例子是INSERT * FROM my_table INTO my_other_table在许多SQL数据库中可用。当然,我意识到 Cassandra 是 NoSQL,因此不会以相同的方式工作 - 但它似乎是可用的。
什么是实现这一目标的好方法?
非常感谢!
我正在为我们的 Cassandra 装置评估最佳设计。
互联网上关于使用 Cassandra 提供的前两个访问级别——键空间和列族的信息并不多。
我想知道如果您选择创建大量的键空间或列族(> 10.000),是否会受到惩罚以及会受到什么惩罚。
某处的一篇旧博客文章建议 Cassandra 为每个列族保留内存。这篇文章是关于 0.6 版本的,当前版本是 1.0。这仍然是一个真正的问题吗?
在 Cassandra 中使用数以千计的列族或键空间的惩罚是什么?
在 Cassandra 中,不建议拥有超过几千个列族,为了争论起见,我们说 2,000 个。在需要持久化 2,000 多种类型的数据的情况下,一种方法是将多种不相关类型的数据分片到每个列族中。
例如,单个CF 可以包含Orders、Invoices 和Customers,前提是它们的行键是不同的(例如,以对象类型为前缀,即单个CF 的键可以同时包含Order|1234和Customer|1234)。第二个 CF 可以包含说 Addresses、LineItems 和 OrderTypes。鉴于这种方法的基本可行性,它的实际限制是什么?例如,将所有 10,000 种类型的对象放入单个 CF 会有什么问题?据我从Cassandra wiki得知,CF 的大小没有硬性限制。
我对 Cassandra 缺乏经验,但我对基于 SQL 的关系数据库有一些经验。
我一直无法找到有关如何在部署后维护 Cassandra 的最佳实践信息。是否有必要对数据库进行 VACUUM?我应该认为读/写负载会导致存储碎片。
或者更一般地说:维护 Cassandra 生产部署的最佳实践是什么?必须定期执行哪些操作才能保持系统的健康?操作手册确实没有讨论这个方面。
谢谢。
cassandra ×10
maintenance ×2
mongodb ×2
nosql ×2
clustering ×1
index ×1
migration ×1
mysql ×1
rdbms ×1
replication ×1
scalability ×1
sql-server ×1