多个 Cassandra 节点宕机
Multiple Cassandra node goes down
我们有一个跨 2 个不同数据中心的 12 节点 cassandra 集群。我们正在通过网络应用程序将数据从 sql 数据库迁移到 cassandra,还有另一个 .net 应用程序从 cassandra 读取数据。最近我们看到一个或另一个节点出现故障(nodetool 状态显示 DN 并且服务已停止)。以下是节点工具状态的输出。我们必须启动该服务才能再次运行,但它又停止了。
https://ibb.co/4P1T453
所以在查看你的 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.conf
或 sysctl.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.conf
和 sysctl.conf
文件。
- 禁用交换。
- 最好上最新版的3.11(3.11.4)。
希望对您有所帮助!
我们有一个跨 2 个不同数据中心的 12 节点 cassandra 集群。我们正在通过网络应用程序将数据从 sql 数据库迁移到 cassandra,还有另一个 .net 应用程序从 cassandra 读取数据。最近我们看到一个或另一个节点出现故障(nodetool 状态显示 DN 并且服务已停止)。以下是节点工具状态的输出。我们必须启动该服务才能再次运行,但它又停止了。
https://ibb.co/4P1T453
所以在查看你的 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.conf
或 sysctl.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.conf
和sysctl.conf
文件。 - 禁用交换。
- 最好上最新版的3.11(3.11.4)。
希望对您有所帮助!