opensack 和 ceph 踩坑记录
1、bond带宽扩容时,引发大规模集群故障。
bond时配置的网卡数量不一致会导致数量多的一方发送数据给数量少的一方时数据发送不过去,大量丢包。引发大规模故障。网络带宽扩容时Linux 做网卡聚合时,两台服务器的网卡配置网口数量不同会导致网口数量低的服务器接收不到网卡数量高的服务器发送的通讯数据。
解决方案:
通过shell脚本,并发批量一次性快速修改网卡配置,并发同时扩容带宽,几秒钟内全部修改配置文件并扩容完成,可以避免集群大规模故障。几秒钟的中断不会对集群造成什么影响。
2、ceph自动扩容会无脑在业务高峰期扩容,且扩容时如果可用副本小于osd pool default min size,将导致集群大规模磁盘不可写,业务大规模故障,且重平衡和扩容时间极其长达两三个小时。
解决方案:
关闭自动扩容:
ceph osd pool set volumes pg_autoscale_mode off
确认是否关闭
ceph osd pool get volumes pg_autoscale_mode
ceph osd pool autoscale-status
关闭自动重平衡:
ceph balancer off
确认是否关闭
ceph balancer status
设置最小和最大pgm 防止误操作导致扩容
ceph osd pool set volumes pg_num_max <num>
ceph osd pool set volumes pg_num_min <num>
在业务低谷期一个一个pgm增加扩容
ceph osd pool set volumes pg_num <num>
查看扩容详情:
ceph osd pool ls detail
查看扩容中的pgs对象状态:
ceph pg dump_stuck
ceph pg dump_stuck stale
ceph pg dump_stuck inactive
ceph pg dump_stuck unclean
但凡pg状态没有处于active,那么io都会阻塞的
临时调整最小的可用副本数尝试恢复
ceph osd pool set ssd min_size 1
ceph osd set norebalance
——禁止集群pg做从均衡,当出现问题时,可以设置,用于排查问题
ceph osd set nobackfill
——禁止修复数据 backfill,当出现问题时,我们暂时不想修复数据,可以使用,配合nobackfill 一起使用
ceph osd set norecover
——禁止修复数据 recover,当出现问题时,我们暂时不想修复数据,可以使用,配合nobackfill 一起使用
3、Linux镜像jbd2进程长时间卡磁盘IO,目前Cetons7和Ubuntu的EXT4文件系统中皆有发现。
兴动云上的Centos系统官方镜像存在一个EXT4日志文件系统的bug,int整型溢出会导致系统中的一个核心CPU IOWAIT 长时间100%占满,目前测试已通过升级系统内核,和修改文件系统挂载参数关闭日志功能解决,测试云服务器中测试通过。
解决方案:
Centos7:
yum update kernel
findmnt (确认磁盘类型为ordered)
vim /etc/fstab
defaults,rw,noatime,nodiratime,barrier=0,data=ordered,commit=60
mount -a
reboot
findmnt
不停机方案:
findmnt (确认磁盘类型为ordered)
vim /etc/fstab
defaults,rw,noatime,nodiratime,barrier=0,data=ordered,commit=60
mount -a
mount -o remount,noatime,nodiratime,barrier=0,data=ordered,commit=60 /
mount -o remount,noatime,nodiratime,barrier=0,data=ordered,commit=60 /boot
findmnt
Ubuntu20.04:
findmnt (确认磁盘类型为ordered)
vim /etc/fstab
defaults,rw,noatime,nodiratime,barrier=0,data=ordered,commit=60
mount -a
reboot
findmnt
不停机方案:
findmnt (确认磁盘类型为ordered)
vim /etc/fstab
defaults,rw,noatime,nodiratime,barrier=0,data=ordered,commit=60
mount -a
mount -o remount,noatime,nodiratime,barrier=0,data=ordered,commit=60 /
mount -o remount,noatime,nodiratime,barrier=0,data=ordered,commit=60 /boot
findmnt