单节点Cassandra搭配SAN存储崩溃问题及配置优化咨询
Cassandra 2.2.8 频繁崩溃问题解答
针对你遇到的Cassandra单节点频繁崩溃问题,结合你的环境配置(Windows 2012 R2、RAID5 SAN、Java 1.8.0_151)和错误日志里的The semaphore timeout period has expired信号量超时错误,我来逐个解答你的疑问:
1. 是否可通过牺牲性能使Cassandra稳定运行?
完全可以。这个错误的核心原因是存储系统的IO响应速度跟不上Cassandra的写刷需求,导致JVM在等待磁盘IO完成时触发超时,判定系统不稳定并强制退出。通过降低Cassandra的IO压力(哪怕牺牲部分性能),可以有效缓解这个问题:
- 进一步降低并发写线程数:把
concurrent_writes、concurrent_counter_writes从4降到2甚至1,减少同时发起的写请求,降低IO峰值压力 - 启用小批量刷写:把
trickle_fsync改为true,配合调整trickle_fsync_interval_in_kb(比如设为2048),让Cassandra分多次小批量刷写commit log,避免一次性写入大量数据导致IO阻塞 - 调整commit log同步策略:将
commitlog_sync从periodic改为batch(这个会让每个写操作等待fsync完成,性能下降明显,但稳定性大幅提升) - 限制内存映射使用:把
disk_access_mode从standard改为mmap_index_only,仅对索引文件使用内存映射,数据文件用标准IO模式,减少Windows环境下内存映射与SAN存储的兼容性问题
2. 迁移至RAID 10 LUN是否能解决问题?
非常大概率可以解决,这甚至是长期稳定运行的最优方案之一。
RAID5的写惩罚极高(每次写操作需要计算并更新校验位),而Cassandra的commit log、SSTable写都是随机写为主,RAID5的性能完全无法匹配Cassandra的IO需求;而RAID10通过镜像+条带的方式,随机写性能是RAID5的2-3倍,能显著提升存储系统的IO响应速度,从根源上解决信号量超时问题。
3. 是否值得继续调整Cassandra配置参数?若可行,哪些参数与该问题相关?
值得调整,但这属于临时缓解方案,长期来看还是建议迁移到RAID10。与该问题直接相关的配置参数包括:
commitlog_sync:切换为batch模式(性能牺牲大但稳定),或保持periodic但延长同步周期(你已经调到3600000,调整空间有限)trickle_fsync:设为true,搭配trickle_fsync_interval_in_kb(建议设为2048-4096),分散IO压力concurrent_writes/concurrent_counter_writes:进一步降低至2或1,减少并发写请求disk_access_mode:改为mmap_index_only,规避Windows下内存映射的SAN兼容性问题commitlog_segment_size_in_mb:从128降至64,减小每次同步的commit log段大小,降低单次IO压力memtable_flush_writers:设为1,减少memtable flush时的并发IO请求
另外,系统层面也可以调整Windows磁盘超时时间:修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk下的TimeoutValue(十进制设为60),延长磁盘响应超时阈值,避免系统过早判定存储异常。
内容的提问来源于stack exchange,提问作者MGold
相关产品推荐
相关产品推荐

