Docker-Ceph 故障排查完全指南:基于官方文档的实战方案
Docker-Ceph 故障排查完全指南:基于官方文档的实战方案
Docker 部署 Ceph 是一种快速、灵活的容器化存储方案,特别适合测试、开发和小规模生产环境。本文基于 Ceph 官方文档和实际运维经验,详细介绍 Docker 部署的 Ceph 集群故障排查方法,涵盖网络配置、存储卷、组件故障、性能优化等多个方面。
目录
二、容器管理命令
八、性能优化
十一、常见故障场景
一、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






