多个 Cassandra 节点宕机

Multiple Cassandra node goes down

我们有一个跨 2 个不同数据中心的 12 节点 cassandra 集群。我们正在通过网络应用程序将数据从 sql 数据库迁移到 cassandra,还有另一个 .net 应用程序从 cassandra 读取数据。最近我们看到一个或另一个节点出现故障(nodetool 状态显示 DN 并且服务已停止)。以下是节点工具状态的输出。我们必须启动该服务才能再次运行,但它又停止了。

https://ibb.co/4P1T453

日志路径:https://pastebin.com/FeN6uDGv

所以在查看你的 pastebin 时,我看到了一些可以调整的东西。

首先,我有理由相信这是您的主要问题:

Unable to lock JVM memory (ENOMEM). This can result in part of the JVM being swapped out,
especially with mmapped I/O enabled. Increase RLIMIT_MEMLOCK or run Cassandra as root.

来自 GNU Error Codes

Macro: int ENOMEM

“Cannot allocate memory.” The system cannot allocate more virtual memory because its capacity is full.

-Xms12G, -Xmx12G, -Xmn3000M,

您的实例有多少 RAM?据我所见,您的节点正在死于 OOM(内存不足错误)。我的猜测是您为堆指定了过多的 RAM,而 OS/page-cache 却不够用。事实上,我不会将超过 50%-60% 的 RAM 分配给堆。

例如,我主要在 16GB 的 RAM 上构建实例,我发现 10GB 的最大堆与您想要的一样高。

-XX:+UseParNewGC, -XX:+UseConcMarkSweepGC

事实上,当您使用 CMS GC 时,我不会将最大堆大小设置为超过 8GB。

Maximum number of memory map areas per process (vm.max_map_count) 65530 is too low,
recommended value: 1048575, you can change it with sysctl.

这意味着您还没有调整您的 limits.confsysctl.conf。查看指南 (DSE 6.0 - Recommended Production Settings),但通常最好将以下内容添加到这些文件中:

/etc/limits.conf

* - memlock unlimited
* - nofile 100000
* - nproc 32768
* - as unlimited

/etc/sysctl.conf

vm.max_map_count = 1048575

注意:调整 sysctl.conf 后,您需要 运行 sudo sysctl -p 或重启。

Is swap disabled? : false,

想要禁用交换。如果 Cassandra 开始将 RAM 的内容交换到磁盘,事情会变得很慢。 运行 a swapoff -a 然后编辑 /etc/fstab 并删除所有交换条目。

tl;博士;摘要

  • 将您的初始和最大堆大小设置为 8GB(堆新大小就可以了)。
  • 适当修改您的 limits.confsysctl.conf 文件。
  • 禁用交换。
  • 最好上最新版的3.11(3.11.4)。

希望对您有所帮助!