admin
不忘初心,方得始终
级别: 管理员
只看楼主 | | | 0楼 发表于:2017-06-04 08:25

Openstack底层Ceph存储故障解决方法

  Openstack中用Ceph作为云主机系统盘、云主机镜像、云主机快照、自定义镜像、云硬盘、对象存储的存储方式的场景比较多。
1. 配置Ceph的SSD 存储磁盘使用上限。
  设置 ssd 硬盘存储池使用量上限的方法是:
  ceph osd pool set ssd-cachepool-volumes target_max_bytes <存储池最大可使用容量,单位为字节>
  设置 ssd 硬盘存储池使用量上限为 100GB,则命令为:
  ceph osd pool set ssd-cachepool-volumes target_max_bytes 107374182400
  ssd 硬盘存储池使用量上限根据实际部署情况计算,和 ssd 硬盘 osd 的数量,大小以及 ssd 硬盘存储池的副本数计算。
  ssd 硬盘存储池使用量上限计算方法是:ssd osd 硬盘大小 * ssd osd 数目 / 存储池副本数,如: ssd 硬盘有 200G 用于 cache,共有 4 个 ssd osd ,副本数是 2 ,则物理上限是:
200G * 4 / 2 = 400G
  ssd 硬盘存储池的副本数可以通过:
  ceph osd pool get ssd-cachepool-volumes size
  相应的 ssd 硬盘存储池的上限可以取物理上限的 80% 左右(也可以更多,保留一部份空间以应对后期的故障处理)。
  举例:2个各有2个ssd 存储osd的2副本250GB容量的存储服务器,计算ssd 硬盘存储池使用量上限计算方法是:
  ceph osd pool get ssh-cachepool-volumes size得到2。
  echo '227*4/2' |bc   250GB磁盘可用量227.9GB左右。
  echo '227*4/2*0.8'|bc得到363.2GB
  echo '360*1024*1024*1024'|bc 得到386547056640
  ceph osd pool set ssd-cachepool-volumes target_max_bytes 386547056640

  2.解决Ceph osd出现full的问题。
  Ceph 出现 full 标志时,会禁止写入操作(写入操作会被挂起,等待集群恢复正常)。所以通过删除数据(比如 cinder 卷等)恢复是不可行的。
  处理方案是,增加新的 osd 实例,重新平衡数据,然后根据情况删除无效数据,但是实际处理时可能无法快速的增加新的服务器和存储设备,因此需要在线恢复 Ceph 集群。
   Ceph full 可能的情况有下面 2 种:
  osd 使用率超过 mon_osd_full_ratio 但没有超过 osd_failsafe_full_ratio。
  osd 使用率超过 osd_failsafe_full_ratio。
  对于前一种情况,只需要调整整个集群关于 full_ratio 的配置; 对于后一种情况,调整整个集群的 full_ratio 配置之后,还需要调整具体 osd 实例的 full_ratio。
  需要注意:
   只能在确认当前环境中没有大量数据写入操作的前提下进行;
    临时调整之后,应尽快删除无效数据(在调整之前,做好删除操作的相关准备);
    集群恢复之后,恢复原来的配置参数。
    将整个集群的 full_ratio 上调到 98%:#ceph pg set_full_ratio 0.98
    将 osd.X (X 指代 osd id)将该实例的 full_ratio 上调到 98%:(在 osd.X 实例所在节点服务器执行) #ceph daemon osd.X config set osd_failsafe_full_ratio 0.98

   3.PG出现 inconsistent,有scrub error错误的处理方法。
     cache pool 所在 osd 中,偶尔会出现 inconsistent 状态的 pg。执行ceph -s后查看是:health HEALTH_ERR 1 pgs inconsistent; 1 scrub errors。
     ceph health detail查看出pg。ceph pg dump|grep incon查看处于 inconsistent 状态的 pg。
     ceph pg map查看pg的映射情况。ceph pg 5.d1 query查询pg映射。
     ceph pg repair pg名称。
  
  4.PG长期处于scurbbing状态。
    个别 pg 处于 scrubbing(但是状态中仍然包含 active+clean 的情况) ,但是其上次 scrubbing 的时间和当前时间的差距超过正常的 scub 周期。 正常的 scrub 周期是:scrub:2 ~ 14 天。deep-scrub :14 天。执行#ceph pg dump可以看到 scrub_stamp 和 deep_scrub_stamp ,分别对应上一次 scrub 和 deep-scrub 开始的时间。如果:1.pg 当前的状态包含 scrubbing ,对应的 scrub_stamp 是 14 天之前;2.pg 当前的状态包含 scrubbing+deep ,对应的 deep_scrub_stamp 是 14 天之前,则 pg 的 scrubing 无法自动恢复,会长期处于这一状态。 这种状态不影响 Ceph 集群正常运行,但是会影响其它 pg 的 scrub 调度。对于这些 pg 的处理,可以在 Ceph 集群压力不大,对用户影响较小的时间,重启 pg 所在的主 osd (在 ceph pg dump 中的 up_primary 这一列显示的数字是主 osd 的 ID)。存在多个这种 pg 时,可以先选择其中一个 pg 对应的主 osd 实例进行重启。重启 osd 都会导致一些数据自动平衡,通过 ceph -s 可以看到有 recovery io 。另外由于 pg 长期处于 scrubbing 状态,相关的 pg 和 osd 的 scrub 操作都会推迟(要等待该 pg 的 scrub 操作完成),重启 pg 所在的主 osd 之后,之前被推迟的 pg scrub 会逐个开始执行,scrub 对 Ceph 整体性能会有影响。重启下一个 osd 之前,需要观察确认上一个 osd 重启导致的数据自动平衡以及被推迟的 pg scrub 已经结束或者基本结束。数据自动平衡和被推迟的 scub 依次触发之后,长期处于 scrubing 状态的 pg 可能都恢复正常,也可能仍存在 pg 还没有恢复,需要重复上述步骤。 在准确重启 osd 之前,还是需要设置 noout 标志,以防止出现大规模的数据平衡;所有 osd 重启操作之后,确认 osd 都状态都是 up 的情况下,再解除 noout 标志。
  操作步骤:
  1.找出处于“active+clean+scrubbing+deep” 或者 “active+clean+scrubbing” 状态的pg:
  #ceph pg dump | grep "active+clean+scrubbing+deep"
  确认 scrubbing 的 pg 的 scrub_stamp 或者 scrubbing+deep 的 deep_scrub_stamp 是否超过正常周期,超过即可认为该 pg 会长期处于 scrubbing 状态。如果有多个长期处于 scrubbing 的 pg ,选择其中一个,找到 pg 对应的主 OSD。
  2.观察集群负载情况 。持续重复执行 # ceph -s或者执行 # ceph -w观察 3 ~ 5 分钟,确定当前 Ceph 集群没有大量的 I/O (观察 rd , wr , op/s 等数据)。
  3.登录到上一步找到的主 OSD 所在主机,重启该 OSD 实例。
   # ceph osd set noout# /etc/init.d/ceph restart osd.xx
  4..等待 Ceph 集群恢复正常,以及被推迟 scrub 操作结束持续观察 Ceph 集群状态。执行# ceph -s     # ceph health detail应该保证经过 1 分钟左右,至少所有 pg 的状态都包含 active(即 pg 可用,不影响上层 I/O 请求),正在 scrubbing 的 pg 发生变化(即不断有 pg 开始执行之前被推迟的 scrub )。当 ceph -s 的输出超过 3 ~ 5 分钟没有变化,pg 的状态都包含 active + clean , 正在 scrubbing 的 pg 一直保持不变,可以继续下面的操作。
  5. 重复上面的第 1、 2 、3(其中 ceph osd set noout 不用重复执行,最开始执行一次即可) 、4 步。
  6.取消 noout 标志 。
  待整个 Ceph 集群恢复正常(所有 pg 的状态都包含 active+clean )再执行:
  # ceph osd unset noout

  5.处理Ceph的磁盘报错的方法。
   umount 挂载点。
   xfs_repair /dev/sddX 修复磁盘设备。
   测试ceph rbd的读写情况:#rbd -p volumes create test --size 1024     #ceph -p volumes info test   #ceph -p volumes rm test
   ceph daemon osd.1 config get debug_osd
   ceph daemon osd.1 config set debug_osd 20/20
   ceph daemon osd.1 config set debug_osd 0/5
   从ceph osd 集群移出Ceph osd.7:
  #ceph osd out 7
  手动调整 osd.7 的权值:
  ceph osd crush reweight osd.7  0
  手动恢复osd.7的权值:
  ceph osd crush reweight osd.7 3.64