集群运维实战

概述

Ceph集群运维是确保分布式存储系统稳定运行的关键环节。本文将从日常监控、故障处理、性能优化、扩容缩容等方面,全面介绍Ceph集群运维的最佳实践和实用技巧。

Cephadm 集群管理

Cephadm 简介

Cephadm是Ceph官方提供的集群管理工具,基于容器技术实现Ceph集群的部署和管理。它简化了集群的安装、升级和维护过程。

Cephadm 优势

  • 容器化部署: 所有Ceph组件运行在容器中
  • 简化管理: 统一的命令行界面
  • 自动化运维: 自动处理节点故障和恢复
  • 版本管理: 支持滚动升级和回滚

集群初始化

安装 Cephadm

# 安装cephadm
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/pacific/src/cephadm/cephadm
chmod +x cephadm
sudo mv cephadm /usr/local/bin/

# 或者使用包管理器安装
sudo dnf install -y cephadm

引导集群

# 初始化集群
sudo cephadm bootstrap --mon-ip 192.168.1.100

# 指定集群名称
sudo cephadm bootstrap --mon-ip 192.168.1.100 --cluster-name myceph

# 指定容器镜像
sudo cephadm bootstrap --mon-ip 192.168.1.100 --image quay.io/ceph/ceph:v16.2.7

获取集群信息

# 获取管理员密钥
sudo cephadm shell -- ceph auth get client.admin

# 获取Dashboard访问信息
sudo cephadm shell -- ceph mgr module ls | grep dashboard
sudo cephadm shell -- ceph dashboard ac-user-show admin

节点管理

添加节点

# 在新节点上安装SSH密钥
ssh-copy-id -f -i /etc/ceph/ceph.pub root@new-node

# 添加节点到集群
sudo cephadm shell -- ceph orch host add new-node 192.168.1.101

# 添加节点并指定标签
sudo cephadm shell -- ceph orch host add new-node 192.168.1.101 --labels _admin,mon,osd

查看节点状态

# 查看所有节点
sudo cephadm shell -- ceph orch host ls

# 查看节点详细信息
sudo cephadm shell -- ceph orch host ls --detail

# 查看节点标签
sudo cephadm shell -- ceph orch host ls --format json | jq '.[] | {hostname: .hostname, labels: .labels}'

管理节点标签

# 添加标签
sudo cephadm shell -- ceph orch host label add node1 mon
sudo cephadm shell -- ceph orch host label add node2 osd

# 移除标签
sudo cephadm shell -- ceph orch host label rm node1 mon

# 设置维护模式
sudo cephadm shell -- ceph orch host maintenance enter node1
sudo cephadm shell -- ceph orch host maintenance exit node1

服务管理

部署 Monitor

# 部署Monitor到指定节点
sudo cephadm shell -- ceph orch apply mon --placement="node1,node2,node3"

# 部署Monitor到带标签的节点
sudo cephadm shell -- ceph orch apply mon --placement="label:mon"

# 指定Monitor数量
sudo cephadm shell -- ceph orch apply mon 3

部署 Manager

# 部署Manager
sudo cephadm shell -- ceph orch apply mgr --placement="node1,node2"

# 部署Manager到带标签的节点
sudo cephadm shell -- ceph orch apply mgr --placement="label:mgr"

部署 OSD

# 自动发现并部署所有可用磁盘
sudo cephadm shell -- ceph orch apply osd --all-available-devices

# 在特定节点部署OSD
sudo cephadm shell -- ceph orch daemon add osd node1:/dev/sdb

# 使用设备规格部署OSD
sudo cephadm shell -- ceph orch apply osd --data-devices /dev/sdb --db-devices /dev/sdc1

查看服务状态

# 查看所有服务
sudo cephadm shell -- ceph orch ls

# 查看特定服务
sudo cephadm shell -- ceph orch ls --service_name mon

# 查看服务详细信息
sudo cephadm shell -- ceph orch ps

# 查看特定守护进程
sudo cephadm shell -- ceph orch ps --daemon_type osd

守护进程管理

守护进程操作

# 重启守护进程
sudo cephadm shell -- ceph orch daemon restart osd.1

# 停止守护进程
sudo cephadm shell -- ceph orch daemon stop osd.1

# 启动守护进程
sudo cephadm shell -- ceph orch daemon start osd.1

# 重新配置守护进程
sudo cephadm shell -- ceph orch daemon redeploy osd.1

守护进程日志

# 查看守护进程日志
sudo cephadm shell -- ceph orch daemon logs osd.1

# 实时查看日志
sudo cephadm shell -- ceph orch daemon logs osd.1 --follow

# 查看最近的日志
sudo cephadm shell -- ceph orch daemon logs osd.1 --lines 100

存储管理

磁盘发现

# 查看可用设备
sudo cephadm shell -- ceph orch device ls

# 查看特定节点的设备
sudo cephadm shell -- ceph orch device ls node1

# 查看设备详细信息
sudo cephadm shell -- ceph orch device ls --wide --refresh

OSD 管理

# 创建OSD
sudo cephadm shell -- ceph orch daemon add osd node1:/dev/sdb

# 移除OSD
sudo cephadm shell -- ceph orch daemon rm osd.1 --force

# 更换OSD
sudo cephadm shell -- ceph orch osd rm osd.1 --replace --force

存储规格

# 创建存储规格
sudo cephadm shell -- ceph orch apply osd --data-devices /dev/sdb --wal-devices /dev/sdc --db-devices /dev/sdd

# 使用YAML文件定义规格
cat > osd-spec.yaml << EOF
service_type: osd
service_id: default_drive_group
placement:
  host_pattern: 'node*'
spec:
  data_devices:
    paths:
      - /dev/sdb
  db_devices:
    paths:
      - /dev/sdc1
  wal_devices:
    paths:
      - /dev/sdc2
EOF

sudo cephadm shell -- ceph orch apply -i osd-spec.yaml

监控和告警

启用监控模块

# 启用Prometheus
sudo cephadm shell -- ceph mgr module enable prometheus

# 部署Prometheus
sudo cephadm shell -- ceph orch apply prometheus

# 部署Grafana
sudo cephadm shell -- ceph orch apply grafana

# 部署Alertmanager
sudo cephadm shell -- ceph orch apply alertmanager

配置监控

# 查看监控服务
sudo cephadm shell -- ceph orch ls | grep -E "(prometheus|grafana|alertmanager)"

# 获取Grafana访问信息
sudo cephadm shell -- ceph dashboard grafana-api-url
sudo cephadm shell -- ceph dashboard grafana-api-username
sudo cephadm shell -- ceph dashboard grafana-api-password

Cephadm 配置管理

集群配置

# 查看集群配置
sudo cephadm shell -- ceph config dump

# 修改配置
sudo cephadm shell -- ceph config set global mon_allow_pool_delete true
sudo cephadm shell -- ceph config set osd osd_memory_target 4294967296

# 生成配置文件
sudo cephadm shell -- ceph config generate-minimal-conf

部署规格管理

# 查看当前规格
sudo cephadm shell -- ceph orch ls --export

# 导出规格到文件
sudo cephadm shell -- ceph orch ls --export > cluster-spec.yaml

# 应用规格文件
sudo cephadm shell -- ceph orch apply -i cluster-spec.yaml

升级管理

版本管理

# 查看当前版本
sudo cephadm shell -- ceph versions

# 查看可用版本
sudo cephadm shell -- ceph orch upgrade ls

# 开始升级
sudo cephadm shell -- ceph orch upgrade start --ceph-version 16.2.7

# 暂停升级
sudo cephadm shell -- ceph orch upgrade pause

# 恢复升级
sudo cephadm shell -- ceph orch upgrade resume

升级监控

# 查看升级状态
sudo cephadm shell -- ceph orch upgrade status

# 查看升级历史
sudo cephadm shell -- ceph orch upgrade ls --historic

# 停止升级
sudo cephadm shell -- ceph orch upgrade stop

Cephadm 故障处理

节点故障

# 查看离线节点
sudo cephadm shell -- ceph orch host ls | grep -i offline

# 强制移除故障节点
sudo cephadm shell -- ceph orch host rm node1 --force

# 清理故障节点
sudo cephadm shell -- ceph orch host drain node1

守护进程故障

# 查看失败的守护进程
sudo cephadm shell -- ceph orch ps | grep -i error

# 重新部署失败的守护进程
sudo cephadm shell -- ceph orch daemon redeploy osd.1

# 查看守护进程事件
sudo cephadm shell -- ceph orch daemon events osd.1

Cephadm 备份和恢复

集群状态备份

# 导出集群规格
sudo cephadm shell -- ceph orch ls --export > /backup/cluster-spec.yaml

# 备份集群配置
sudo cephadm shell -- ceph config dump > /backup/cluster-config.conf

# 备份认证信息
sudo cephadm shell -- ceph auth export > /backup/cluster-auth.keyring

容器镜像管理

# 查看容器镜像
sudo cephadm shell -- ceph orch upgrade ls

# 预拉取镜像
sudo cephadm shell -- ceph orch upgrade start --image quay.io/ceph/ceph:v16.2.7 --dry-run

# 设置默认镜像
sudo cephadm shell -- ceph config set mgr mgr/cephadm/container_image_base quay.io/ceph/ceph

高级配置

自定义容器配置

# 设置容器资源限制
sudo cephadm shell -- ceph orch daemon add osd node1:/dev/sdb --memory-limit 8G --cpus 4

# 设置容器环境变量
sudo cephadm shell -- ceph orch apply osd --extra-container-args="-e CEPH_ARGS='--osd-objectstore=bluestore'"

网络配置

# 设置公共网络
sudo cephadm shell -- ceph config set global public_network 192.168.1.0/24

# 设置集群网络
sudo cephadm shell -- ceph config set global cluster_network 10.0.0.0/24

# 配置防火墙
sudo cephadm shell -- ceph orch apply firewall

Cephadm 最佳实践

部署建议

  1. 节点标签管理: 合理使用标签来组织节点角色
  2. 资源规划: 根据工作负载设置合适的资源限制
  3. 网络隔离: 分离公共网络和集群网络
  4. 监控集成: 部署完整的监控堆栈

运维建议

  1. 定期备份: 定期导出集群规格和配置
  2. 滚动更新: 使用cephadm的滚动升级功能
  3. 健康检查: 定期检查集群和守护进程状态
  4. 日志监控: 监控守护进程日志以发现问题

故障处理建议

  1. 快速响应: 利用cephadm的自动重启功能
  2. 节点隔离: 使用维护模式隔离故障节点
  3. 服务迁移: 利用placement规则实现服务迁移
  4. 数据保护: 在移除节点前确保数据完整性

常用命令速查

# 集群状态
sudo cephadm shell -- ceph -s
sudo cephadm shell -- ceph health detail

# 节点管理
sudo cephadm shell -- ceph orch host ls
sudo cephadm shell -- ceph orch host add <host> <ip>
sudo cephadm shell -- ceph orch host rm <host>

# 服务管理
sudo cephadm shell -- ceph orch ls
sudo cephadm shell -- ceph orch ps
sudo cephadm shell -- ceph orch daemon restart <daemon>

# 存储管理
sudo cephadm shell -- ceph orch device ls
sudo cephadm shell -- ceph osd tree
sudo cephadm shell -- ceph osd df

# 升级管理
sudo cephadm shell -- ceph orch upgrade status
sudo cephadm shell -- ceph orch upgrade start --ceph-version <version>
sudo cephadm shell -- ceph orch upgrade pause

通过使用Cephadm,Ceph集群的部署和管理变得更加简单和可靠。它提供了统一的管理界面,支持容器化部署,并且具有强大的自动化运维能力。

集群状态监控

基础状态检查

整体集群状态

# 查看集群整体状态
ceph -s

# 查看详细状态
ceph status

# 查看集群健康状态
ceph health
ceph health detail

集群容量信息

# 查看集群容量使用情况
ceph df

# 查看各个存储池的使用情况
ceph df detail

# 查看OSD使用情况
ceph osd df

组件状态监控

Monitor监控

# 查看Monitor状态
ceph mon stat
ceph mon dump

# 查看Monitor的法定人数
ceph quorum_status

# 查看Monitor的详细信息
ceph daemon mon.{id} mon_status

OSD监控

# 查看OSD状态
ceph osd stat
ceph osd tree
ceph osd dump

# 查看OSD的详细信息
ceph osd find {osd-id}
ceph daemon osd.{id} status

# 查看OSD性能统计
ceph daemon osd.{id} perf dump

PG监控

# 查看PG状态
ceph pg stat
ceph pg dump

# 查看异常PG
ceph pg dump_stuck
ceph pg dump_stuck inactive
ceph pg dump_stuck unclean

# 查看特定PG的详细信息
ceph pg {pg-id} query

性能监控

集群性能指标

# 查看集群实时性能
ceph -w

# 查看IOPS和带宽
ceph osd pool stats

# 查看延迟统计
ceph daemon osd.{id} dump_op_pq_state

监控工具集成

# 启用内置监控模块
ceph mgr module enable prometheus
ceph mgr module enable dashboard

# 配置Prometheus监控
ceph config set mgr mgr/prometheus/server_addr 0.0.0.0
ceph config set mgr mgr/prometheus/server_port 9283

日常运维操作

配置管理

查看和修改配置

# 查看配置
ceph config dump
ceph config show osd.{id}

# 修改配置
ceph config set osd osd_max_backfills 2
ceph config set global mon_allow_pool_delete true

# 重置配置
ceph config rm osd osd_max_backfills

配置文件管理

# 生成配置文件
ceph config generate-minimal-conf > /etc/ceph/ceph.conf

# 同步配置到所有节点
ceph orch apply osd --dry-run

认证管理

用户管理

# 创建用户
ceph auth get-or-create client.backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backup'

# 查看用户权限
ceph auth list
ceph auth get client.backup

# 删除用户
ceph auth del client.backup

密钥管理

# 导出密钥
ceph auth export client.backup > backup.keyring

# 导入密钥
ceph auth import -i backup.keyring

存储池管理

存储池操作

# 创建存储池
ceph osd pool create mypool 128 128

# 设置存储池配置
ceph osd pool set mypool size 3
ceph osd pool set mypool min_size 2
ceph osd pool set mypool crush_rule replicated_rule

# 查看存储池配置
ceph osd pool get mypool all

# 删除存储池
ceph osd pool rm mypool mypool --yes-i-really-really-mean-it

PG管理

# 调整PG数量
ceph osd pool set mypool pg_num 256
ceph osd pool set mypool pgp_num 256

# 查看PG分布
ceph pg dump_pools_json | jq '.pools[] | {pool_name: .pool_name, pg_num: .pg_num}'

故障处理

常见故障诊断

OSD故障

# 查看故障OSD
ceph osd tree | grep down

# 查看OSD日志
journalctl -u ceph-osd@{id} -f

# 重启OSD
systemctl restart ceph-osd@{id}

# 标记OSD为out(触发数据重平衡)
ceph osd out {id}

# 标记OSD为in
ceph osd in {id}

Monitor故障

# 查看Monitor状态
ceph mon stat

# 重启Monitor
systemctl restart ceph-mon@{hostname}

# 添加Monitor
ceph mon add {hostname} {ip}:{port}

# 移除Monitor
ceph mon remove {hostname}

PG异常处理

# 修复stuck PG
ceph pg {pg-id} mark_unfound_lost revert

# 强制清理PG
ceph pg {pg-id} mark_unfound_lost delete

# 手动触发PG恢复
ceph pg force-recovery {pg-id}
ceph pg force-backfill {pg-id}

数据恢复

深度清理

# 启动深度清理
ceph pg deep-scrub {pg-id}

# 检查所有PG
ceph pg scrub {pg-id}

# 查看清理状态
ceph pg dump | grep scrub

数据一致性检查

# 检查对象一致性
rados -p {pool-name} ls | head -10 | xargs -I {} rados -p {pool-name} stat {}

# 比较副本数据
ceph pg {pg-id} query | jq '.peer_info'

性能优化

硬件优化

磁盘优化

# 检查磁盘性能
fio --name=random-rw --ioengine=libaio --rw=randrw --bs=4k --direct=1 --numjobs=1 --runtime=60 --filename=/dev/sdb

# 优化磁盘调度器
echo mq-deadline > /sys/block/sdb/queue/scheduler

# 设置磁盘读写队列
echo 256 > /sys/block/sdb/queue/nr_requests

网络优化

# 检查网络延迟
ceph daemon osd.{id} dump_op_pq_state | jq '.ops[] | select(.description | contains("waiting for"))'

# 优化网络参数
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
sysctl -p

配置优化

OSD配置优化

# 优化OSD性能参数
ceph config set osd osd_op_threads 8
ceph config set osd osd_disk_threads 4
ceph config set osd osd_recovery_max_active 5
ceph config set osd osd_max_backfills 2

# 优化BlueStore
ceph config set osd bluestore_cache_size 1073741824
ceph config set osd bluestore_cache_meta_ratio 0.4

网络配置优化

# 分离公网和集群网络
ceph config set global public_network 192.168.1.0/24
ceph config set global cluster_network 10.0.0.0/24

# 优化网络消息
ceph config set global ms_tcp_nodelay true
ceph config set global ms_tcp_rcvbuf 65536

监控配置优化

# 调整监控频率
ceph config set mgr mgr/prometheus/scrape_interval 15
ceph config set mon mon_osd_down_out_interval 300

扩容和缩容

扩容操作

添加OSD

# 准备磁盘
ceph-volume lvm prepare --data /dev/sdc
ceph-volume lvm activate {osd-id} {osd-fsid}

# 使用ceph-deploy添加OSD
ceph-deploy osd create {hostname}:{disk-path}

# 检查新OSD状态
ceph osd tree

添加Monitor

# 添加Monitor
ceph mon add {hostname} {ip}:{port}

# 验证Monitor状态
ceph mon stat
ceph quorum_status

添加新节点

# 添加新节点到集群
ceph orch host add {hostname} {ip}

# 在新节点上部署OSD
ceph orch daemon add osd {hostname}:{disk-path}

缩容操作

移除OSD

# 停止OSD
ceph osd out {osd-id}

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

# 停止OSD服务
systemctl stop ceph-osd@{osd-id}

# 从集群中移除OSD
ceph osd purge {osd-id} --yes-i-really-mean-it

移除Monitor

# 移除Monitor
ceph mon remove {hostname}

# 验证Monitor状态
ceph mon stat

备份和恢复

数据备份

RBD备份

# 创建RBD快照
rbd snap create {pool-name}/{image-name}@{snap-name}

# 导出RBD镜像
rbd export {pool-name}/{image-name} /backup/image.img

# 差异备份
rbd export-diff {pool-name}/{image-name}@{snap-name} /backup/image.diff

CephFS备份

# 创建CephFS快照
mkdir /mnt/cephfs/.snap/{snap-name}

# 使用rsync备份
rsync -av /mnt/cephfs/ /backup/cephfs/

对象存储备份

# 使用rados备份
rados -p {pool-name} export /backup/pool.backup

# 使用s3cmd备份
s3cmd sync s3://bucket/ /backup/s3/

配置备份

导出集群配置

# 导出Monitor map
ceph mon getmap -o /backup/monmap

# 导出OSD map
ceph osd getmap -o /backup/osdmap

# 导出CRUSH map
ceph osd getcrushmap -o /backup/crushmap

# 导出认证信息
ceph auth export > /backup/auth.backup

恢复配置

# 恢复认证信息
ceph auth import -i /backup/auth.backup

# 恢复CRUSH map
ceph osd setcrushmap -i /backup/crushmap

日志管理

日志收集

系统日志

# 查看Ceph相关日志
journalctl -u ceph-mon@{hostname} -f
journalctl -u ceph-osd@{id} -f
journalctl -u ceph-mgr@{hostname} -f

# 查看所有Ceph服务日志
journalctl -u 'ceph-*' -f

应用日志

# 查看OSD日志
tail -f /var/log/ceph/ceph-osd.{id}.log

# 查看Monitor日志
tail -f /var/log/ceph/ceph-mon.{hostname}.log

# 查看管理器日志
tail -f /var/log/ceph/ceph-mgr.{hostname}.log

日志分析

性能分析

# 查看慢操作
ceph daemon osd.{id} dump_historic_ops

# 分析操作延迟
ceph daemon osd.{id} dump_op_pq_state | jq '.ops[] | select(.duration > 1)'

错误分析

# 搜索错误日志
grep -i error /var/log/ceph/*.log

# 分析崩溃日志
ceph crash ls
ceph crash info {crash-id}

监控告警

告警规则

集群健康告警

# 设置健康检查
ceph config set global mon_health_to_clog_tick_interval 60

# 配置告警阈值
ceph config set global mon_osd_down_out_subtree_limit host
ceph config set global mon_osd_min_down_reporters 2

容量告警

# 设置容量告警阈值
ceph config set global mon_osd_full_ratio 0.95
ceph config set global mon_osd_backfillfull_ratio 0.90
ceph config set global mon_osd_nearfull_ratio 0.85

最佳实践

部署最佳实践

硬件配置

  • Monitor节点: 高可用性,建议3/5/7个节点
  • OSD节点: 推荐1个OSD对应1个磁盘
  • 网络: 分离公网和集群网络,使用万兆网络
  • 存储: SSD用于日志/DB,HDD用于数据存储

配置建议

# 推荐的基础配置
ceph config set global osd_pool_default_size 3
ceph config set global osd_pool_default_min_size 2
ceph config set global osd_pool_default_pg_num 128
ceph config set global mon_osd_full_ratio 0.95
ceph config set global mon_osd_nearfull_ratio 0.85

运维最佳实践

监控策略

  • 实时监控集群健康状态
  • 定期检查性能指标
  • 设置合适的告警阈值
  • 定期进行数据一致性检查

维护策略

  • 定期备份配置和数据
  • 制定详细的故障处理流程
  • 定期进行灾难恢复演练
  • 保持文档更新

安全策略

  • 使用认证机制
  • 限制网络访问
  • 定期更新安全补丁
  • 监控异常访问

故障排查清单

常见问题清单

集群无法启动

  1. 检查Monitor状态和法定人数
  2. 检查网络连接
  3. 检查磁盘空间
  4. 检查配置文件

性能问题

  1. 检查磁盘I/O性能
  2. 检查网络延迟
  3. 检查CPU和内存使用
  4. 检查PG分布

数据不一致

  1. 运行scrub检查
  2. 检查副本状态
  3. 检查磁盘错误
  4. 检查网络稳定性

紧急处理流程

集群不可用

  1. 立即检查Monitor状态
  2. 尝试重启关键服务
  3. 检查硬件故障
  4. 联系技术支持

数据丢失风险

  1. 停止所有写操作
  2. 评估数据完整性
  3. 准备恢复方案
  4. 执行数据恢复

总结

Ceph集群运维是一个复杂但系统性的工作,需要从多个维度进行管理:

核心要素

  1. 监控体系: 全面的监控和告警机制
  2. 故障处理: 快速的故障定位和恢复能力
  3. 性能优化: 持续的性能调优和容量规划
  4. 自动化: 减少人工操作,提高运维效率

成功关键

  1. 预防为主: 通过监控和预警避免问题发生
  2. 快速响应: 建立完善的故障处理流程
  3. 持续改进: 根据运维经验不断优化
  4. 文档管理: 保持运维文档的完整性和时效性