1

我们有 32 个节点的 cassandra 集群,平均节点大小约为 1TB。节点配置 1xIntel Xeon E3-1271v3,32GB 内存,2x3TB HDD。我们有一个带有一些小表和一个大表的数据库,其中包含大约 90-95% 的总集群大小。

我尝试向该集群添加其他节点,但突然发现,将一个节点添加到现有集群需要大约 13-14 天才能加入集群。构建二级索引花费了大部分时间,并且一直以来我看到所有压缩器线程都占用了所有可用的 CPU。

我已将 cassandra 配置更改为扩展限制:

  • 并发压缩器:4
  • compaction_throughput_mb_per_sec: 0

卡桑德拉完整配置

架构

大约 1 年前,我们还向这个集群添加了新节点,并将其从 16 个节点扩展到 32 个节点的集群,集群扩展之前的平均节点大小为 1TB。Cassandra 版本是 2.1。一个节点加入时间为1-1.5天。

那么问题来了,我们怎样才能加快这个过程呢?我们错过了什么吗?

谢谢。

4

1 回答 1

0

这个有点长,所以我不能发表评论......对不起。

我知道这听起来有点奇怪,尤其是对于您项目的后期阶段,但问题是随着时间的推移,索引情况不会好转。我强烈建议您开始制作自己的表格,而不仅仅是将索引放在以下内容上。根据访问数据的频率,您可以使用“倒排索引”。

CREATE INDEX links_by_author_url_idx ON keyspace.links_by_author (url);


CREATE INDEX docs_url_idx ON keyspace.docs (url);


CREATE INDEX om_master_object_id_idx ON keyspace.om (master_object_id);


CREATE INDEX actions_pday_idx ON keyspace.actions (pday);


CREATE INDEX authors_yauid_idx ON keyspace.authors (yauid);

CREATE INDEX authors_login_lr_idx ON keyspace.authors (login_lr);

CREATE INDEX authors_login_idx ON keyspace.authors (login);

CREATE INDEX authors_email_idx ON keyspace.authors (email);

CREATE INDEX authors_name_idx ON keyspace.authors (name);

基本上,您在此处拥有的每个索引都使您能够“搜索”基本实体以通过某种条件找到它们。大多数条件实际上都非常狭窄,这是一个好消息。但问题是索引将变得庞大(已经如此),尤其是在文档和作者上。但我想doc的问题更大。

您应该考虑为此制作单独的表格。您创建的每个索引都将存在于集群中的每个节点上,最终您将拥有比您真正需要的数据多得多的数据,因为在后台,每个节点的数据都会成倍增加。当您向该系统添加复制因子时,您甚至都没有意识到会占用大量空间。

加入节点的问题在于,当它们接收到新数据时,集群中的所有数据都需要重建……对于集群中的每个节点,这会花费你很多时间。所以基本上你失去了 cassandra 所拥有的“简单节点加入”的所有好处。

现在您可能会认为,当您将数据写入非规范化的新模式时,空间会成为问题......

如果空间是问题,您可以使用一种称为倒排索引的技术,您只需将信息的 id 放入搜索表中,然后在主表中进行第二次加载。我在一些空间是问题的项目中使用了它,但是由于您拥有所有主要内容,索引空间可能不会成为问题,因为您已经使用了比您想象的更多的东西。(我敢打赌,您也可能会大大节省空间)

无论如何,所有索引都应该变成表......如果一致性有问题,请使用批处理(不要使用物化视图,因为您可能会丢失数据)。

我诚实的提示是你远离索引。我知道重构它是地狱,而且很难有时间重构:(但我认为它应该是可以管理的。

于 2017-04-14T16:55:59.193 回答