Docker-Ceph 故障排查完全指南:基于官方文档的实战方案

Docker-Ceph 故障排查完全指南:基于官方文档的实战方案

Docker 部署 Ceph 是一种快速、灵活的容器化存储方案,特别适合测试、开发和小规模生产环境。本文基于 Ceph 官方文档和实际运维经验,详细介绍 Docker 部署的 Ceph 集群故障排查方法,涵盖网络配置、存储卷、组件故障、性能优化等多个方面。

目录

一、Docker-Ceph 部署架构

二、容器管理命令

三、进入容器执行 Ceph 命令

四、Ceph Admin Socket 深度诊断

五、网络配置与 Bonding 优化

六、OSD 故障排查(基于官方文档)

七、PG 状态问题处理

八、性能优化

九、BlueStore 配置

十、Docker Compose 部署排查

十一、常见故障场景

一、Docker-Ceph 部署架构

1.1 官方文档参考

本指南基于以下 Ceph 官方文档编写:

故障排查Troubleshooting OSDs

网络配置Network Configuration Reference

BlueStore 配置BlueStore Config Reference

管理指南Administration Guide

1.2 部署方式概述

Docker 部署 Ceph 主要有两种方式:

手动 Docker 部署:使用 docker run 命令逐个启动 Ceph 组件容器

Docker Compose 部署:使用 docker-compose.yml 文件定义并启动所有组件

1.3 官方镜像

Ceph 官方提供的 Docker 镜像是 ceph/daemon,这是一个多入口镜像,通过指定不同的命令来启动不同的 Ceph 组件。

# 拉取官方镜像
docker pull ceph/daemon:latest-nautilus

# 查看镜像信息
docker images | grep ceph

1.4 组件容器说明

Mon 容器:Ceph Monitor,维护集群映射,需要至少 3 个才能形成法定人数

OSD 容器:Ceph OSD,管理存储设备,每个容器管理一个 OSD

MGR 容器:Ceph Manager,提供管理接口和监控

RGW 容器:Ceph RADOS Gateway,提供 S3/Swift 接口

MDS 容器:Ceph Metadata Server,提供 CephFS 文件系统

Tools 容器:可以运行任何 Ceph 命令的临时容器

1.5 关键部署参数

--net host:使用宿主机网络,这是 Docker-Ceph 部署的关键参数

-v /etc/ceph:/etc/ceph:挂载配置文件目录

-v /var/lib/ceph:/var/lib/ceph:挂载数据目录

--privileged:可能需要特权模式访问宿主机设备

# 启动 Mon 容器示例
docker run -d \
  --net host \
  --name mon \
  -v /etc/ceph:/etc/ceph \
  -v /var/lib/ceph:/var/lib/ceph \
  -e MON_IP=192.168.1.10 \
  -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
  ceph/daemon mon

二、容器管理命令

2.1 查看容器状态

# 查看所有运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 查看容器资源使用情况
docker stats

# 查看 Ceph 相关容器
docker ps | grep ceph

2.2 查看容器详细信息

# 查看容器详细信息
docker inspect <container-name>

# 查看容器网络配置
docker inspect <container-name> | grep -A 20 NetworkSettings

# 查看容器挂载的卷
docker inspect <container-name> | grep -A 10 Mounts

2.3 查看容器日志

# 查看容器日志
docker logs <container-name>

# 实时查看容器日志
docker logs -f <container-name>

# 查看最近 100 行日志
docker logs --tail 100 <container-name>

# 查看容器的标准错误输出
docker logs -e <container-name>

# 查看时间戳日志
docker logs -t <container-name>

2.4 容器生命周期管理

# 启动容器
docker start <container-name>

# 停止容器
docker stop <container-name>

# 重启容器
docker restart <container-name>

# 强制删除容器
docker rm -f <container-name>

# 查看容器退出码
docker inspect <container-name> | grep -i exitcode

三、进入容器执行 Ceph 命令

3.1 进入运行中的容器

# 使用 bash 进入容器(如果容器有 bash)
docker exec -it <container-name> bash

# 使用 sh 进入容器(精简镜像可能没有 bash)
docker exec -it <container-name> sh

# 在容器中执行单条命令
docker exec <container-name> ceph -s

3.2 创建临时 Tools 容器

如果不进入已有容器,可以创建一个临时的工具容器来执行 Ceph 命令:

# 创建临时容器执行命令
docker run --rm \
  --net host \
  -v /etc/ceph:/etc/ceph \
  -v /var/lib/ceph:/var/lib/ceph \
  ceph/daemon mon_status

# 创建交互式工具容器
docker run -it --rm \
  --net host \
  -v /etc/ceph:/etc/ceph \
  -v /var/lib/ceph:/var/lib/ceph \
  ceph/daemon bash

3.3 常用 Ceph 命令

# 查看集群状态
ceph -s

# 查看集群健康详情
ceph health detail

# 查看 OSD 树
ceph osd tree

# 查看 PG 状态
ceph pg stat

# 查看 Monitor 状态
ceph mon stat

# 查看集群映射
ceph osd lspools

四、Ceph Admin Socket 深度诊断

4.1 Admin Socket 简介

Admin Socket 是 Ceph 提供的一个强大诊断接口,允许运维人员深入查看 Ceph 守护进程的内部状态。通过 Admin Socket,可以查看性能统计、配置信息、运行状态等,是故障排查的重要工具。官方文档推荐使用 Admin Socket 进行深入诊断。

在 Docker 部署环境中,Admin Socket 文件通常位于 /var/run/ceph/ 目录下。

4.2 常用 Admin Socket 命令

4.2.1 查看可用命令

# 进入容器
docker exec -it <osd-container> bash

# 查看所有可用的 Admin Socket 命令
ceph daemon /var/run/ceph/ceph-osd.0.asok help

4.2.2 性能统计 - perf dump

# 查看 OSD 性能统计(最常用的命令)
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok perf dump

# 查看 Monitor 性能统计
docker exec <mon-container> ceph daemon /var/run/ceph/ceph-mon.asok perf dump

perf dump 输出内容包括:

WBThrottle:写回限制统计

filestore:文件存储层统计(journal、ops、latency)

objecter:对象客户端统计(op、op_active、op_active_bytes)

osd:OSD 层统计(op_wip、op_latency)

# 重置性能统计
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok perf reset all

4.2.3 配置查看 - config show

# 查看当前 OSD 配置
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok config show

# 获取特定配置项
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok config get osd_max_object_name_len

# 设置配置项(临时生效)
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok config set debug_osd 20

4.2.4 飞行中的操作 - dump_ops_in_flight

# 查看当前正在处理的操作
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok dump_ops_in_flight

# 输出包括:
# - 操作类型
# - 操作持续时间
# - 操作来源客户端

4.2.5 慢操作历史 - dump_historic_ops

# 查看最慢的操作历史
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok dump_historic_ops

# 帮助定位性能瓶颈

4.2.6 操作优先队列 - dump_op_pq_state

# 查看操作优先队列状态
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok dump_op_pq_state

4.2.7 OSD 状态 - osd status

# 查看 OSD 详细状态
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok status

4.2.8 Monitor 状态 - mon_status

# 查看 Monitor 详细状态
docker exec <mon-container> ceph daemon /var/run/ceph/ceph-mon.asok mon_status

# 输出包括:
# - Monitor 映射
# - 选举状态
# - 法定人数信息

4.3 常用诊断场景

4.3.1 OSD 写延迟高

# 查看 filestore 延迟
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok perf dump | grep -A 10 filestore

# 查看 journal 延迟
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok perf dump | grep -A 10 journal

4.3.2 查找阻塞操作

# 查看运行时间最长的操作
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok dump_historic_ops | jq '.[] | select(.duration > 10)'

4.3.3 客户端连接问题

# 查看当前活跃的客户端
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok dump_ops_in_flight

4.4 容器中 Admin Socket 路径

# OSD Socket
/var/run/ceph/ceph-osd.<id>.asok

# Monitor Socket
/var/run/ceph/ceph-mon.<host>.asok

# MGR Socket
/var/run/ceph/ceph-mgr.<host>.asok

# RGW Socket
/var/run/ceph/ceph-client.rgw.<host>.asok

五、网络配置与 Bonding 优化

5.1 网络模式验证

Docker-Ceph 部署必须使用 --net host 模式,确保容器使用宿主机网络栈。

# 验证容器网络模式
docker inspect <container-name> | grep -i hostconfig

# 应该看到 "NetworkMode": "host"

5.2 Bonding 网卡绑定配置

对于使用双网卡或多网卡绑定的场景,正确的 Bonding 配置对于 Ceph 性能至关重要。

5.2.1 查看 Bonding 状态

# 查看 Bond0 状态
cat /proc/net/bonding/bond0

# 查看 Bonding 传输策略
cat /sys/class/net/bond0/bonding/xmit_hash_policy

# 查看网卡状态
ethtool bond0

5.2.2 Bonding 模式说明

mode=4 (802.3ad):IEEE 802.3ad 动态链路聚合(推荐)

mode=0 (balance-rr):轮询模式,数据包顺序传输

mode=1 (active-backup):主备模式,只有一个网卡工作

mode=2 (balance-xor):基于 XOR 哈希的负载均衡

5.2.3 传输哈希策略(xmit_hash_policy)

Ceph 建议根据网络环境选择合适的哈希策略:

layer2:基于源和目的 MAC 地址

layer2+3:基于 MAC 和 IP 地址

layer3+4:基于 IP 和端口(默认)

# 设置 Bonding 哈希策略
echo "layer2+3+4" > /sys/class/net/bond0/bonding/xmit_hash_policy

# 或者在配置文件中设置
BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer2+3+4"

5.2.4 性能测试优化

使用 iperf3 测试双 25G Bonding 网卡时,需要注意:

使用多连接:iperf3 单连接只能跑满一个网卡

# 使用多连接测试(-P 参数)
iperf3 -c <target-ip> -t 60 -P 8

# 双向测试
iperf3 -c <target-ip> -t 60 -P 8 -R

调整哈希策略:如果 layer3+4 无法达到预期带宽,尝试 layer2+3+4

5.3 MTU 配置

Ceph 官方文档建议使用 Jumbo Frames(MTU 9000)以提高网络性能。

# 设置网卡 MTU
ip link set dev <interface> mtu 9000

# 在 Docker 容器中设置
docker run --rm --net host busybox ip link set dev eth0 mtu 9000

5.4 端口检查

Ceph 集群需要开放多个端口:

6789/tcp:Monitor 端口

6800-7100/tcp:OSD 端口范围

# 检查 Monitor 端口
netstat -tlnp | grep 6789

# 检查 OSD 端口
netstat -tlnp | grep 68

# 测试 Monitor 连通性
telnet <mon-ip> 6789

# 使用 nc 测试端口
nc -zv <mon-ip> 6789

六、OSD 故障排查(基于官方文档)

6.1 初始检查步骤

根据 Ceph 官方文档《Troubleshooting OSDs》,在排查 OSD 之前,首先检查:

1. Monitor 状态:确保 Monitor 形成法定人数

2. 网络状态:检查网络连接和丢包情况

3. 集群健康:运行 ceph -s 或 ceph health 命令

# 检查集群状态
ceph -s
ceph health detail

# 检查 Monitor 仲裁
ceph quorum_status

6.2 OSD 容器故障

容器无法启动

# 查看容器日志
docker logs <osd-container>

# 查看容器退出码
docker inspect <osd-container> | grep -i exitcode

# 常见原因:
# 1. 数据目录权限问题
# 2. 磁盘设备问题
# 3. 网络配置问题

OSD 反复重启

# 查看容器重启次数
docker inspect <osd-container> | grep RestartCount

# 查看 OSD 状态
ceph osd tree

# 查看 OSD 日志
docker logs <osd-container> --tail 100

6.3 OSD 状态异常

OSD Down:OSD 进程崩溃或网络中断

OSD Out:OSD 被标记为集群外

OSD Up/In:OSD 正常状态

# 查看 OSD 状态
ceph osd stat

# 查看 OSD 树
ceph osd tree

# 标记 OSD 为 out
ceph osd out <osd-id>

# 标记 OSD 为 in
ceph osd in <osd-id>

6.4 OSD 磁盘故障处理

# 标记故障 OSD 为 out
ceph osd out <osd-id>

# 等待数据迁移完成
ceph -w

# 停止并删除 OSD 容器
docker stop <osd-container>
docker rm <osd-container>

# 在宿主机上清理磁盘
ceph-volume lvm zap /dev/<device> --destroy

# 创建新的 OSD 容器
docker run -d \
  --net host \
  --name osd-new \
  -v /etc/ceph:/etc/ceph \
  -v /var/lib/ceph:/var/lib/ceph \
  -v /dev/<device>:/dev/<device> \
  --privileged \
  ceph/daemon osd

# 验证 OSD 状态
ceph -s
ceph osd tree

七、PG 状态问题处理

7.1 PG 状态说明

active+clean:PG 正常,数据完整

active+degraded:部分副本丢失

active+undersized:副本数不足

active+remapped:PG 正在迁移

stuck inactive:PG 无法访问

7.2 查看 PG 状态

# 查看 PG 统计
ceph pg stat

# 查看所有 PG 状态
ceph pg ls

# 查看卡住的 PG
ceph pg dump_stuck inactive
ceph pg dump_stuck unclean
ceph pg dump_stuck degraded

7.3 PG 修复操作

# 修复 inconsistent PG
ceph pg repair <pgid>

# 执行 scrub 检查
ceph pg scrub <pgid>

# 执行 deep scrub
ceph pg deep-scrub <pgid>

7.4 PG 状态 unknown

如果 PG 状态为 unknown,通常是因为 OSD 无法访问:

# 查看特定 PG 信息
ceph pg <pgid> query

# 查看关联的 OSD
ceph osd map <pool-name> <object-name>

八、性能优化

8.1 CPU 资源优化

Ceph 官方文档建议:

1 core per 200-500 MB/s:吞吐量优化

1 core per 1000-3000 IOPS:IOPS 优化

# 为 OSD 绑定 CPU 核心
docker run -d \
  --name osd-cpu \
  --net host \
  --cpuset-cpus="0-1" \
  -v /etc/ceph:/etc/ceph \
  -v /var/lib/ceph:/var/lib/ceph \
  ceph/daemon osd

8.2 线程配置

根据 Ceph 官方性能优化文档:

# 设置 OSD 操作线程
ceph config set osd osd_op_threads 8

# 设置 OSD 恢复线程
ceph config set osd osd_recovery_threads 4

# 设置 Async Messenger 线程
ceph config set ms_async_op_threads 4

8.3 BlueStore 性能优化

# 优化 BlueStore 缓冲区大小
ceph config set osd bluestore_cache_size 4G

# 优化 RocksDB 缓存
ceph config set osd osd_rocksdb_options "max_open_files=-1,write_buffer_size=268435456"

8.4 网络性能优化

# 禁用 Nagle 算法
ceph config set ms_tcp_nodelay true

# 设置 TCP 缓冲区大小
ceph config set ms_tcp_rcvbuf 1048576
ceph config set ms_tcp_sndbuf 1048576

九、BlueStore 配置

9.1 BlueStore 设备

BlueStore 可以管理一个、两个或三个存储设备:

Primary Device:主存储设备

WAL Device:写前日志设备

DB Device:元数据数据库设备

9.2 配置示例

# 创建 OSD 时指定 WAL 和 DB 设备
docker run -d \
  --net host \
  --name osd-with-devices \
  -v /etc/ceph:/etc/ceph \
  -v /var/lib/ceph:/var/lib/ceph \
  -v /dev/sdb:/dev/sdb \
  -v /dev/nvme0n1:/dev/nvme0n1 \
  --device-wal /dev/nvme0n1p1 \
  --device-db /dev/nvme0n1p2 \
  --privileged \
  ceph/daemon osd

9.3 压缩配置

BlueStore 支持数据压缩:

none:不压缩

passive:被动压缩(默认)

aggressive:主动压缩

force:强制压缩

# 启用存储池压缩
ceph osd pool set <pool-name> compression_mode aggressive

# 设置压缩算法
ceph osd pool set <pool-name> compression_algorithm snappy

十、Docker Compose 部署排查

10.1 启动服务

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs -f

10.2 查看单个服务

# 查看特定服务日志
docker-compose logs -f <service-name>

# 重启特定服务
docker-compose restart <service-name>

# 停止特定服务
docker-compose stop <service-name>

10.3 配置文件检查

# 验证 docker-compose.yml 语法
docker-compose config

# 查看配置详情
docker-compose config --volumes

十一、常见故障场景

11.1 容器启动失败

现象:docker ps 看不到容器,容器创建后立即退出

原因:环境变量错误、挂载目录不存在、权限问题、网络配置错误

排查步骤

# 查看容器日志
docker logs <container-name>

# 查看容器退出码
docker inspect <container-name> | grep -i exitcode

# 检查挂载目录
ls -la /etc/ceph
ls -la /var/lib/ceph

# 检查环境变量
docker inspect <container-name> | grep -i env

11.2 集群状态异常

现象:ceph -s 显示 HEALTH_WARN 或 HEALTH_ERR

排查步骤

# 查看健康详情
docker exec <mon-container> ceph health detail

# 查看 OSD 状态
docker exec <mon-container> ceph osd tree

# 查看 PG 状态
docker exec <mon-container> ceph pg stat

11.3 网络带宽不足

现象:双 25G Bonding 只能跑到 30G,无法达到 50G

原因:layer3+4 哈希策略导致流量分布不均

解决方法

# 1. 调整哈希策略
echo "layer2+3+4" > /sys/class/net/bond0/bonding/xmit_hash_policy

# 2. 使用多连接测试
iperf3 -c <target-ip> -t 60 -P 8

# 3. 确保交换机支持 LACP
# 需要在交换机上配置 Port Channel

11.4 数据丢失风险

现象:多个 OSD 同时故障,PG 无法恢复

处理步骤

# 立即设置 noout 标志
docker exec <mon-container> ceph osd set noout

# 尽力恢复故障 OSD
# 如果无法恢复,考虑从备份恢复数据

11.5 性能问题

现象:集群响应慢,客户端 IO 延迟高

排查步骤

# 查看慢请求
docker exec <mon-container> ceph osd perf

# 使用 Admin Socket 深入诊断
docker exec <osd-container> ceph daemon /var/run/ceph/ceph-osd.0.asok perf dump

# 查看容器资源使用
docker stats

# 查看宿主机磁盘 I/O
iostat -x 1

总结

本文基于 Ceph 官方文档和实际运维经验,详细介绍了 Docker-Ceph 的架构、容器管理、网络配置、OSD 故障排查、PG 状态处理、性能优化等多个方面的内容。

关键要点:

官方文档优先:遵循 Ceph 官方文档的最佳实践

网络配置:正确的 Bonding 配置对性能至关重要

Admin Socket:使用 Admin Socket 进行深入诊断

性能优化:根据硬件资源调整 CPU 和线程配置

BlueStore:合理使用 WAL 和 DB 设备提升性能

通过持续学习和实践,运维人员可以构建稳定可靠的 Docker-Ceph 存储平台。

参考资源

Ceph 官方文档 - Troubleshooting OSDs:https://docs.ceph.com/docs/master/rados/troubleshooting/troubleshooting-osd/

Ceph 官方文档 - Network Configuration:https://docs.ceph.com/docs/master/rados/configuration/network-config-ref/

Ceph 官方文档 - BlueStore Config:https://docs.ceph.com/docs/nautilus/rados/configuration/bluestore-config-ref/

Red Hat Ceph Storage Administration Guide:https://docs.redhat.com/en/documentation/red_hat_ceph_storage/5/html-single/administration_guide/index

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注