Cassandra 节点上的高磁盘 I/O
High disk I/O on Cassandra nodes
设置:
我们有 3 个节点的 Cassandra 集群,每个节点上有大约 850G 的数据,我们为 Cassandra 数据目录设置了 LVM(目前包括 3 个驱动器 800G + 100G + 100G)并且有单独的卷(非 LVM)用于 cassandra_logs
版本:
卡桑德拉 v2.0.14.425
DSE v4.6.6-1
问题:
在每个节点上的 LVM 中添加第 3 个(100G)卷后,所有节点的磁盘 I/O 都变得非常高,并且经常出现故障,服务器也变得无法访问,我们需要重新启动服务器,服务器不不稳定,我们需要每 10 - 15 分钟重启一次。
其他信息:
我们在所有节点
上配置了 DSE 推荐的服务器设置(vm.max_map_count、文件描述符)
每个节点上的 RAM:24G
CPU 在每个节点上:6 核 / 2600MHz
每个节点上的磁盘:1000G(数据目录)/ 8G(日志)
正如我所怀疑的,您的磁盘吞吐量有问题。这是我为您提供的背景资料。来自三个节点的 nodetool tpstats
输出有这些行:
Pool Name Active Pending Completed Blocked All time blocked
FlushWriter 0 0 22 0 8
FlushWriter 0 0 80 0 6
FlushWriter 0 0 38 0 9
我关注的栏目是所有时间被阻止。作为完成的比率,你有很多阻塞。 flushwriter 负责将 memtables 刷新到磁盘,以防止 JVM 运行 内存不足或造成大量 GC 问题。 memtable 是表在内存中的表示。随着您的节点进行更多写入,它们开始填满并需要刷新。该操作是对磁盘的长时间顺序写入。将其加入书签。我会回来的。
当 flushwriters 被阻塞时,堆开始填充。如果它们一直处于阻塞状态,您将看到请求开始排队,最终节点将 OOM。
压缩也可能是 运行。压缩是将 SSTables 长时间顺序读取到内存中,然后长时间顺序刷新合并排序的结果。更多顺序 IO。
所以磁盘上的所有这些操作都是顺序的。不是随机的 IOP。如果您的磁盘无法处理同时的顺序读写,IOWait 会激增,请求会被阻塞,然后 Cassandra 的日子就会非常糟糕。
您提到您正在使用 Ceph。我还没有看到 Cassandra 在 Ceph 上的成功部署。它会保持一段时间,然后在顺序加载时翻倒。短期内最简单的解决方案是添加更多节点来分散负载。中期是找到一些方法来优化顺序磁盘加载的堆栈,但这最终会失败。长期是将您的数据放在真实磁盘和共享存储上。
多年来,我在使用 Cassandra 时向咨询客户讲过这个 "If your storage has an ethernet plug, you are doing it wrong" 很好的经验法则。
设置:
我们有 3 个节点的 Cassandra 集群,每个节点上有大约 850G 的数据,我们为 Cassandra 数据目录设置了 LVM(目前包括 3 个驱动器 800G + 100G + 100G)并且有单独的卷(非 LVM)用于 cassandra_logs
版本:
卡桑德拉 v2.0.14.425
DSE v4.6.6-1
问题:
在每个节点上的 LVM 中添加第 3 个(100G)卷后,所有节点的磁盘 I/O 都变得非常高,并且经常出现故障,服务器也变得无法访问,我们需要重新启动服务器,服务器不不稳定,我们需要每 10 - 15 分钟重启一次。
其他信息:
我们在所有节点
上配置了 DSE 推荐的服务器设置(vm.max_map_count、文件描述符)
每个节点上的 RAM:24G
CPU 在每个节点上:6 核 / 2600MHz
每个节点上的磁盘:1000G(数据目录)/ 8G(日志)
正如我所怀疑的,您的磁盘吞吐量有问题。这是我为您提供的背景资料。来自三个节点的 nodetool tpstats
输出有这些行:
Pool Name Active Pending Completed Blocked All time blocked
FlushWriter 0 0 22 0 8
FlushWriter 0 0 80 0 6
FlushWriter 0 0 38 0 9
我关注的栏目是所有时间被阻止。作为完成的比率,你有很多阻塞。 flushwriter 负责将 memtables 刷新到磁盘,以防止 JVM 运行 内存不足或造成大量 GC 问题。 memtable 是表在内存中的表示。随着您的节点进行更多写入,它们开始填满并需要刷新。该操作是对磁盘的长时间顺序写入。将其加入书签。我会回来的。
当 flushwriters 被阻塞时,堆开始填充。如果它们一直处于阻塞状态,您将看到请求开始排队,最终节点将 OOM。
压缩也可能是 运行。压缩是将 SSTables 长时间顺序读取到内存中,然后长时间顺序刷新合并排序的结果。更多顺序 IO。
所以磁盘上的所有这些操作都是顺序的。不是随机的 IOP。如果您的磁盘无法处理同时的顺序读写,IOWait 会激增,请求会被阻塞,然后 Cassandra 的日子就会非常糟糕。
您提到您正在使用 Ceph。我还没有看到 Cassandra 在 Ceph 上的成功部署。它会保持一段时间,然后在顺序加载时翻倒。短期内最简单的解决方案是添加更多节点来分散负载。中期是找到一些方法来优化顺序磁盘加载的堆栈,但这最终会失败。长期是将您的数据放在真实磁盘和共享存储上。
多年来,我在使用 Cassandra 时向咨询客户讲过这个 "If your storage has an ethernet plug, you are doing it wrong" 很好的经验法则。