Jump to content
View in the app

A better way to browse. Learn more.

T.M.I IThub

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Кластер работает. Теперь начинается настоящая работа: выжать из него максимум производительности, не потерять данные при апгрейде и знать, что делать когда (не «если») что-то сломается.


Часть 1: Планирование железа — правильный старт

Перед тем как тюнить — убедитесь что железо подобрано правильно. Никакой тюнинг не исправит плохую архитектуру.

Сети: разделяйте публичную и кластерную

Худшее что можно сделать — смешать пользовательский трафик и репликацию в одну сеть.

Публичная сеть (client network): клиенты → MON/OSD
Кластерная сеть (cluster network): OSD → OSD (репликация)

Рекомендация:
- Публичная: 10 GbE minimum
- Кластерная: 25 GbE или bond из двух 10 GbE

Конфигурируем при bootstrap:

cephadm bootstrap \
    --mon-ip 192.168.10.11 \
    --cluster-network 192.168.20.0/24
# или после:
ceph config set global cluster_network 192.168.20.0/24

Размещение BlueStore компонентов

BlueStore — три уровня данных с разными требованиями:

Компонент

Что хранит

Требования

Рекомендация

DATA

Тела объектов

Ёмкость

HDD или SSD

DB (RocksDB)

Метаданные объектов

IOPS, latency

NVMe SSD

WAL

Write-Ahead Log

Высокие IOPS

NVMe SSD

Если все компоненты на одном диске — они конкурируют за I/O. Выносим DB и WAL на NVMe:

# osd-spec-nvme.yaml
service_type: osd
service_id: nvme-optimized
placement:
  host_pattern: 'ceph-node*'
data_devices:
  paths:
    - /dev/sdb  # HDD для данных
    - /dev/sdc
db_devices:
  paths:
    - /dev/nvme0n1  # NVMe для DB (разделяется между несколькими OSD)
wal_devices:
  paths:
    - /dev/nvme1n1  # отдельный NVMe для WAL

Золотое правило: один NVMe может обслуживать WAL/DB для 4-6 HDD OSD.

Расчёт оптимального числа OSD на сервер

Больше OSD — больше параллелизма, но больше RAM. Один OSD потребляет:

  • ~1 GB RAM (HDD OSD, небольшие данные)

  • ~2-4 GB RAM (SSD/NVMe OSD под нагрузкой)

  • BlueStore cache: по умолчанию 1/4 RAM на все OSD

# Проверяем потребление памяти OSD
ceph daemon osd.0 dump_mempools
ceph daemon osd.0 perf dump | grep -i mem

Часть 2: Тюнинг производительности

BlueStore: кэш и компрессия

# Размер BlueStore кэша — главный параметр
# По умолчанию: 1/4 от общей RAM (авто)
# Можно задать явно для SSD/NVMe (они меньше нуждаются в кэше)
ceph config set osd bluestore_cache_size_ssd 1073741824  # 1 GB для SSD OSD

# HDD нуждаются в бОльшем кэше
ceph config set osd bluestore_cache_size_hdd 536870912   # 512 MB для HDD OSD

# Компрессия — включаем для cold data
ceph osd pool set mypool compression_mode aggressive  # сжимать всегда
# или
ceph osd pool set mypool compression_mode passive     # сжимать если выгодно

ceph osd pool set mypool compression_algorithm zstd   # лучший ratio
# или snappy — быстрее, но меньше сжимает
# или lz4   — самый быстрый, минимальное сжатие

ceph osd pool set mypool compression_min_blob_size 8192  # мин. размер для сжатия

Настройка очереди I/O — mclock

С Ceph Pacific появился планировщик mclock, дающий QoS на уровне OSD:

# Проверяем текущий планировщик
ceph config get osd osd_op_queue
# должен быть: mclock_scheduler

# Приоритеты для workload'ов:
# client — пользовательские операции
# recovery — восстановление данных
# scrub — фоновая проверка

# Для HDD-кластера снижаем агрессивность recovery
ceph config set osd osd_mclock_scheduler_client_res 1
ceph config set osd osd_mclock_scheduler_recovery_res 1
ceph config set osd osd_mclock_scheduler_scrub_res 1

В Tentacle добавили защиту от нереалистичных значений IOPS capacity для mclock — теперь если измеренное значение IOPS слишком низкое (< 50 для HDD, < 1000 для SSD), планировщик использует последнее валидное значение.

Оптимизация для конкретных workload'ов

Для виртуальных машин (много случайных мелких I/O):

# Увеличиваем число OSD threads
ceph config set osd osd_op_num_shards 8
ceph config set osd osd_op_num_threads_per_shard 2

# Write pipeline
ceph config set osd bluestore_throttle_bytes 67108864  # 64 MB
ceph config set osd bluestore_throttle_deferred_bytes 134217728  # 128 MB

# Для NVMe — отключаем оверхед на большие буферы
ceph config set osd bluestore_max_blob_size_ssd 65536

Для больших последовательных записей (S3, медиа):

# Увеличиваем объект для EC
ceph config set osd osd_max_write_size 512  # MB

# RGW chunk size
ceph config set client rgw_obj_stripe_size 8388608  # 8 MB

Для read-heavy workload'ов:

# Увеличиваем BlueStore cache для чтения
ceph config set osd bluestore_cache_meta_ratio 0.4   # 40% для метаданных
ceph config set osd bluestore_cache_kv_ratio 0.4     # 40% для RocksDB

# Readahead на уровне BlueStore
ceph config set osd bluestore_default_buffered_read true

Настройка RBD для Kubernetes / Proxmox

# Включаем RBD кеширование на стороне клиента
cat >> /etc/ceph/ceph.conf << 'EOF'
[client]
rbd cache = true
rbd cache size = 134217728      # 128 MB
rbd cache max dirty = 100663296 # 96 MB
rbd cache target dirty = 67108864  # 64 MB
rbd cache max dirty age = 5.0
rbd cache writethrough until flush = true
EOF

# Для diskless систем — через librbd
rbd config image set vmpool/myvm-disk01 rbd_cache true
rbd config image set vmpool/myvm-disk01 rbd_cache_size 134217728

Часть 3: FastEC — как правильно использовать

FastEC — главная фича Tentacle для EC пулов. Разберём как мигрировать и что получаем.

Создаём новый EC пул с FastEC

# Профиль с ISA-L (новый дефолт в Tentacle)
ceph osd erasure-code-profile set fastec-profile \
    k=4 m=2 \
    plugin=isa \
    technique=reed_sol_van \
    crush-failure-domain=host

# Создаём пул
ceph osd pool create fastec-pool 64 64 erasure fastec-profile

# Включаем FastEC оптимизации
ceph osd pool set fastec-pool allow_ec_optimizations true

# Проверяем что включилось
ceph osd pool get fastec-pool allow_ec_optimizations

Миграция существующего EC пула

Если у вас был EC пул с Jerasure — миграция возможна без пересоздания данных:

# Обновляем OSD и MON до Tentacle (см. раздел Upgrade)

# После апгрейда — включаем оптимизации
ceph osd pool set oldpool allow_ec_optimizations true

# Следим за состоянием пула во время активации
watch ceph pg stat

Бенчмарк: насколько быстрее FastEC?

Сравниваем производительность:

# Устанавливаем инструменты
apt install ceph-common

# Тест записи в EC пул с FastEC
rados bench -p fastec-pool 60 write --no-cleanup

# Тест чтения
rados bench -p fastec-pool 60 seq

# Сравниваем с репликацией
rados bench -p vmpool 60 write --no-cleanup
rados bench -p vmpool 60 seq

# Очищаем после теста
rados bench -p fastec-pool 60 cleanup
rados bench -p vmpool 60 cleanup

По данным разработчиков и независимым тестам (blog nuvotex.de, 42on.com): FastEC при workload'е с преобладанием чтения и объектами среднего размера (1-4 MB) может превысить производительность репликации 3x при вдвое меньшем расходе места.


Часть 4: Апгрейд с Squid (19.x) до Tentacle (20.x)

Подготовка к апгрейду

Это самый важный раздел. Апгрейд Ceph — процедура, требующая внимания.

# 1. Проверяем здоровье — ОБЯЗАТЕЛЬНО перед началом
ceph status
ceph health detail

# Кластер ДОЛЖЕН быть в HEALTH_OK или HEALTH_WARN (без critical)
# НЕ начинайте при: OSD down, degraded PGs, incomplete PGs

# 2. Проверяем версии клиентов
ceph features  # показывает connected clients и их версии

# 3. Делаем снэпшот всех RBD образов (опционально, но разумно)
for pool in $(ceph osd pool ls); do
    for image in $(rbd ls $pool 2>/dev/null); do
        rbd snap create $pool/$image@pre-upgrade-$(date +%Y%m%d)
    done
done

# 4. Отключаем PG autoscaler на время апгрейда
ceph osd pool set noautoscale

# 5. Устанавливаем noout флаг (предотвращает rebalancing при рестарте OSD)
ceph osd set noout

Апгрейд через cephadm (рекомендуется)

# Запускаем апгрейд — cephadm делает всё сам, rolling update
ceph orch upgrade start --image quay.io/ceph/ceph:v20.2.0

# Мониторим прогресс
ceph orch upgrade status

# Детальный лог
ceph -W cephadm

# В реальном времени
watch ceph versions

Cephadm обновляет в правильном порядке:

  1. MGR (сначала standby, потом active)

  2. MON (по одному, ждёт quorum)

  3. OSD (по одному, ждёт чистых PG после каждого)

  4. MDS, RGW, другие сервисы

Вы можете поставить на паузу и возобновить:

ceph orch upgrade pause
ceph orch upgrade resume

Апгрейд вручную (для не-cephadm кластеров)

# Порядок строго важен!
# 1. MON
for mon_host in ceph-node1 ceph-node2 ceph-node3; do
    echo "Upgrading MON on $mon_host"
    ssh root@$mon_host "apt update && apt install -y ceph-mon"
    ssh root@$mon_host "systemctl restart ceph-mon.target"
    
    # Ждём возврата quorum
    sleep 30
    ceph mon stat
done

# Проверяем что все MON обновились
ceph mon dump | grep min_mon_release
# Должно показать: min_mon_release 20 (tentacle)

# 2. MGR
for mgr_host in ceph-node1 ceph-node2; do
    ssh root@$mgr_host "apt install -y ceph-mgr"
    ssh root@$mgr_host "systemctl restart ceph-mgr.target"
    sleep 10
done

# 3. OSD (по одному за раз!)
for osd_id in $(ceph osd ls); do
    osd_host=$(ceph osd find $osd_id | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['crush_location']['host'])")
    
    echo "Upgrading OSD.$osd_id on $osd_host"
    
    # Устанавливаем новый пакет
    ssh root@$osd_host "apt install -y ceph-osd"
    
    # Рестартуем OSD
    ssh root@$osd_host "systemctl restart ceph-osd@$osd_id"
    
    # Ждём пока OSD поднимется
    sleep 30
    
    # Проверяем что OSD up и PGs чистые
    while ceph pg stat | grep -q "degraded\|recovering"; do
        echo "Waiting for PGs to recover..."
        sleep 30
    done
    
    echo "OSD.$osd_id upgraded successfully"
done

# 4. После всех OSD — финализация
ceph osd require-osd-release tentacle

Финализация апгрейда

# Снимаем noout
ceph osd unset noout

# Включаем PG autoscaler обратно
ceph osd pool unset noautoscale

# Проверяем что все демоны на новой версии
ceph versions

# Убеждаемся что все фичи Tentacle включены
ceph osd dump | grep require_osd_release

# Включаем новые возможности Tentacle
ceph osd pool set mypool allow_ec_optimizations true  # если EC пул

Часть 5: Disaster Recovery — что делать когда всё плохо

Сценарий 1: OSD упал

# Смотрим что произошло
ceph health detail
ceph osd tree | grep -i down

# Оценка: сколько времени OSD уже down?
ceph osd info osd.5 | grep "last_clean_epoch"

# Быстрый рестарт (если проблема временная)
systemctl restart ceph-osd@5
# или через cephadm:
ceph orch daemon restart osd.5

# Если OSD не стартует — смотрим логи
journalctl -u ceph-osd@5 -n 100 --no-pager

# OSD сломан физически — нужно заменить
# Помечаем как out (начнётся rebalancing)
ceph osd out osd.5

# Ждём завершения rebalancing
watch ceph pg stat  # ждём active+clean

# Удаляем из кластера
ceph osd purge osd.5 --yes-i-really-mean-it

# Меняем диск, зачищаем и добавляем обратно
ceph orch daemon add osd ceph-node2:/dev/sdc

Сценарий 2: Целый хост упал

# Если хост не вернётся — убираем его OSD
# Для примера: умер ceph-node2 с OSD 3,4,5

# Помечаем все OSD хоста как out
ceph osd host-down-out ceph-node2  # если есть команда
# или вручную:
for osd in 3 4 5; do ceph osd out osd.$osd; done

# После rebalancing — удаляем
for osd in 3 4 5; do
    ceph osd purge osd.$osd --yes-i-really-mean-it
done

# Удаляем MON если он был на этом хосте
ceph mon remove ceph-node2

# Удаляем хост из оркестратора
ceph orch host drain ceph-node2
ceph orch host rm ceph-node2 --force

# Проверяем здоровье после
ceph status

Сценарий 3: PG застряла в inconsistent/corrupt

# Находим проблемные PG
ceph pg dump | grep -v "active+clean"

# Запускаем repair
ceph pg repair 3.1a

# Если repair не помогает — более агрессивно
ceph osd set nodeep-scrub  # временно отключаем deep-scrub

# Смотрим детали PG
ceph pg 3.1a query

# OSD с повреждёнными данными
ceph osd tree
ceph pg 3.1a get  # какие OSD участвуют

# Принудительное восстановление из другой реплики
# (осторожно! только если уверены что данные на primary повреждены)
ceph pg force-recovery 3.1a

Сценарий 4: MON потерял quorum

# Проверяем статус MON
ceph mon stat
ceph mon dump

# Если 1 из 3 MON не отвечает — quorum ещё есть (2 из 3)
# Рестартуем проблемный
systemctl restart ceph-mon@ceph-node2

# Если quorum потерян (0 из 3 доступны) — режим аварийного восстановления
# Это серьёзная ситуация

# На одном живом MON:
ceph-mon -i ceph-node1 --extract-monmap /tmp/monmap
monmaptool --print /tmp/monmap

# Удаляем недостижимые MON из карты
monmaptool --rm ceph-node2 /tmp/monmap
monmaptool --rm ceph-node3 /tmp/monmap

# Инжектируем исправленную monmap
ceph-mon -i ceph-node1 --inject-monmap /tmp/monmap

# Запускаем с одним MON
ceph-mon -i ceph-node1

# Добавляем новые MON после стабилизации
ceph orch apply mon ceph-node1,ceph-node2,ceph-node3

Сценарий 5: Восстановление удалённого RBD образа

# Если образ удалён — проверяем trash
rbd trash ls vmpool

# Восстанавливаем из trash (образы там держатся delay_seconds)
rbd trash restore vmpool/trash-id

# Если включён rbd-mirror с журналированием — восстановление из журнала
# В крайнем случае — восстановление из снэпшота
rbd snap ls vmpool/myvm-disk01
rbd snap rollback vmpool/myvm-disk01@pre-upgrade-20241201

# Восстановление из бэкапа через export
rbd export vmpool/myvm-disk01 /mnt/backup/myvm-disk01.raw
# Восстановление:
rbd import /mnt/backup/myvm-disk01.raw vmpool/myvm-disk01-restored

Часть 6: Продвинутые возможности Tentacle

SMB shares из CephFS

# Создаём SMB кластер (Active Directory интеграция)
ceph smb cluster create mysmb \
    active-directory \
    --domain DC=corp,DC=example,DC=com \
    --realm CORP.EXAMPLE.COM \
    --dns-server 192.168.1.10

# Добавляем CephFS share
ceph smb share create mysmb myshare \
    --cephfs-volume myfs \
    --cephfs-path /shares/myshare

# Проверяем
ceph smb cluster ls
ceph smb share ls

# Через Dashboard — аналогично с GUI

RBD Live Migration — новинка Tentacle

Мгновенный импорт образов из других кластеров без копирования данных:

# Импорт из другого Ceph кластера (native format)
rbd migration prepare \
    --source-spec '{"type":"native","cluster_name":"src-cluster","pool_name":"vmpool","image_name":"myvm"}' \
    dstpool/myvm-imported

# Импорт через NBD (из любого источника)
rbd migration prepare \
    --source-spec '{"type":"nbd","uri":"nbd://192.168.1.100:10809/disk"}' \
    dstpool/imported-disk

# Запускаем миграцию (фоновая копия данных)
rbd migration execute dstpool/myvm-imported

# Когда завершится — фиксируем
rbd migration commit dstpool/myvm-imported

Магия в том, что образ доступен для чтения и записи немедленно — пока данные копируются в фоне, читаются напрямую с источника.

Data Availability Score — новый инструмент мониторинга

# Включаем tracking
ceph config set global enable_availability_tracking true

# Проверяем score для каждого пула
ceph osd pool availability-status

# Вывод:
# POOL    AVAILABLE  SCORE
# vmpool  yes        1.00
# ecpool  yes        0.99   ← одна PG в не-clean состоянии

# Очищаем статус для пула после устранения проблемы
ceph osd pool clear-availability-status vmpool

Scrub: планирование глубоких проверок

# Принудительный scrub для конкретной PG
ceph pg scrub 1.a3
ceph pg deep-scrub 1.a3

# Scrub всего пула
ceph osd pool scrub vmpool

# Планирование — ограничиваем scrub нерабочим временем
ceph config set osd osd_scrub_begin_hour 1    # с 1:00
ceph config set osd osd_scrub_end_hour 6      # до 6:00
ceph config set osd osd_scrub_min_interval 86400   # не чаще раза в день
ceph config set osd osd_deep_scrub_interval 604800  # deep-scrub раз в неделю

# Статус scrub
ceph pg dump | awk '{print $1, $16, $17}' | head -30
# PG_ID | LAST_SCRUB | LAST_DEEP_SCRUB

Часть 7: Capacity planning и масштабирование

Добавление нового хоста и OSD

# Добавляем хост
ceph orch host add ceph-node4 192.168.10.14

# Добавляем OSD
ceph orch daemon add osd ceph-node4:/dev/sdb
ceph orch daemon add osd ceph-node4:/dev/sdc

# Автоматическая ребалансировка начнётся сразу
# Следим за прогрессом
ceph progress
watch ceph df

Расчёт сырого хранилища

Полезное место = (Общий объём) / overhead_factor

Репликация 3x: overhead = 3.0
EC 4+2:         overhead = 1.5
EC 6+3:         overhead = 1.5
EC 8+3:         overhead = 1.375

Для кластера с 9 × 4TB HDD и репликацией 3x:
- Сырое: 36 TB
- Полезное: 36 / 3 = 12 TB (минус ~10% overhead Ceph = ~10.8 TB)

Правило большого пальца: не заполняйте более 80% полезного места!
При 80%+ производительность падает из-за фрагментации и задержек recovery.

Мониторинг через Prometheus

# ceph exporter уже встроен, prometheus конечные точки:
# http://ceph-node1:9283/metrics  - MGR prometheus module

# Ключевые метрики для алертов:
# ceph_health_status != 0          — нездоровый кластер
# ceph_osd_in == 0                 — OSD out
# ceph_pg_degraded > 0             — деградированные PG
# ceph_osd_available_bytes < 20%   — заканчивается место
# ceph_osd_apply_latency_ms > 50   — высокая задержка записи

# Пример alertmanager rule:
cat >> /etc/prometheus/rules/ceph.yml << 'EOF'
groups:
- name: ceph
  rules:
  - alert: CephHealthError
    expr: ceph_health_status == 2
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Ceph cluster is in ERROR state"

  - alert: CephOSDDown  
    expr: ceph_osd_up == 0
    for: 2m
    labels:
      severity: warning

  - alert: CephDiskAlmostFull
    expr: (ceph_osd_stat_bytes_used / ceph_osd_stat_bytes) > 0.80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Ceph OSD {{ $labels.ceph_daemon }} is {{ $value | humanizePercentage }} full"
EOF

Чеклист: Ceph в продакшне

До разворачивания:

  • [ ] Минимум 3 физических хоста (лучше 5+ для отказоустойчивости)

  • [ ] Отдельные сети для публичного и кластерного трафика (10 GbE+)

  • [ ] NTP синхронизирован на всех узлах

  • [ ] SSD/NVMe для BlueStore DB и WAL

  • [ ] Резервные диски наготове для горячей замены

  • [ ] CRUSH map настроен с учётом физической топологии (стойки, ЦОД)

Оперативный мониторинг:

  • [ ] Prometheus + Grafana с Ceph дашбордами

  • [ ] Алерты на HEALTH_ERR, OSD down, PG degraded, диск >80%

  • [ ] mgmt-gateway настроен (Tentacle 20.x)

  • [ ] certmgr управляет TLS сертификатами

Регулярные процедуры:

  • [ ] Ежедневная проверка ceph status

  • [ ] Еженедельный deep-scrub (автоматически через cron)

  • [ ] Тестирование восстановления из снэпшотов раз в квартал

  • [ ] Обновления безопасности: следим за ceph-announce

Перед апгрейдом:

  • [ ] Кластер в HEALTH_OK

  • [ ] Снэпшоты критичных RBD образов

  • [ ] ceph osd set noout

  • [ ] Тест в staging среде

  • [ ] Откат-план: как вернуться на предыдущую версию (downgrade невозможен, нужен rollback через снэпшоты)


Где учиться дальше

Официальная документация:

  • docs.ceph.com — эталонная документация, всегда актуальная

  • ceph.io/en/news/blog — официальный блог с release notes и углублёнными техническими статьями

Сообщество:

  • ceph-users@ceph.io — рассылка для пользователей

  • irc.oftc.net #ceph — IRC канал

  • Cephalocon — ежегодная конференция сообщества

Практика:

  • Vagrant + VirtualBox: поднимите тестовый кластер на ноутбуке (cephadm работает в VM)

  • Rook — Ceph оператор для Kubernetes, хороший способ изучить интеграцию

  • Proxmox VE имеет встроенный Ceph — отличная песочница

Ceph — это не инструмент «поставил и забыл». Это живая система, требующая понимания и регулярного внимания. Но когда вы научитесь с ней работать — получаете petabyte-scale хранилище корпоративного уровня на обычном commodity железе. Это стоит вложенных усилий.

User Feedback

Create an account or sign in to leave a review

There are no reviews to display.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.