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.

Почему Ceph, а не просто NAS или SAN?

Представьте ситуацию: у вас 50 серверов, каждый с несколькими терабайтами данных, виртуальные машины, S3-хранилище для бэкапов, общий файловый ресурс для кластера Kubernetes — и всё это нужно хранить надёжно, быстро и так, чтобы смерть одного (или нескольких) серверов не привела к потере данных и даунтайму.

Традиционные решения здесь ломаются. NAS — единая точка отказа. SAN — дорого, сложно, проприетарно. RAID — не масштабируется за пределы одной машины. Ceph решает эту задачу радикально иначе: он распределяет данные по всем дискам всех серверов одновременно, и любой узел может умереть прямо сейчас, пока вы это читаете, — вы ничего не потеряете.

Ceph используют CERN (те самые, что ищут бозон Хиггса), крупнейшие облачные провайдеры, Proxmox, OpenStack — в общем, люди, которым нельзя терять данные. Давайте разберёмся, как это устроено.


Три уровня хранения в одном кластере

Ceph — это не одна технология, это три совершенно разных интерфейса хранения, построенных поверх одного движка:

┌─────────────────────────────────────────────────┐
│              Приложения и клиенты               │
├──────────────┬──────────────┬───────────────────┤
│   RBD        │   CephFS     │   RGW (S3/Swift)  │
│  Блочное     │  Файловая    │  Объектное         │
│  хранилище   │  система     │  хранилище         │
├──────────────┴──────────────┴───────────────────┤
│                    RADOS                        │
│        (Reliable Autonomic Distributed          │
│              Object Store)                      │
├─────────────────────────────────────────────────┤
│         OSD OSD OSD OSD OSD OSD OSD             │
│         (физические диски/SSD/NVMe)             │
└─────────────────────────────────────────────────┘

RBD (RADOS Block Device) — виртуальный блочный диск. С точки зрения виртуальной машины или Kubernetes pod — это просто диск. Внутри он разбит на объекты по 4 МБ (по умолчанию) и размазан по всему кластеру. Размер — до 16 эксабайт.

CephFS — POSIX-совместимая распределённая файловая система. Монтируется как обычная папка, понимает права доступа, символические ссылки, всё как у людей. Метаданные хранит отдельно от данных через специальный демон MDS.

RGW (RADOS Gateway) — HTTP-интерфейс объектного хранилища, совместимый с Amazon S3 и OpenStack Swift. Загружаете файлы через API, получаете бакеты, версионирование, lifecycle-политики — всё как в S3.

Самое красивое: всё три интерфейса используют один и тот же кластер RADOS. Вы можете одновременно монтировать CephFS на NFS-сервере, раздавать RBD-диски виртуалкам Proxmox и гонять бэкапы в RGW — и все они делят одни и те же физические диски.


Архитектура: четыре типа демонов

Ceph-кластер — это набор демонов, каждый со своей ролью. Никаких монолитов, никакого единого «сервера хранилища».

MON — Monitor (мозг кластера)

MON1  MON2  MON3
  \     |     /
   \    |    /
    кластерная карта
    (cluster map)

Мониторы хранят карту кластера — полное описание топологии: какие OSD существуют, где они физически расположены, здоровы ли они. Это не данные, это метаданные. Мониторы работают по протоколу Paxos и требуют кворума: нужно нечётное число, минимум 3 в продакшне.

Без кворума мониторов — нет записи (но чтение может работать). Мониторы не хранят пользовательские данные вообще — они лёгкие, их можно держать даже на небольших VM.

OSD — Object Storage Daemon (мышцы кластера)

Один OSD = один физический диск (или раздел). OSD хранит данные, обслуживает запросы чтения/записи, участвует в репликации, сам находит соседей для репликации по карте кластера.

Типичный сервер в кластере: 12 дисков = 12 OSD-процессов + небольшой SSD для BlueStore WAL/DB.

OSD общаются напрямую — без центрального сервера хранения. Если клиент пишет данные в pool с репликацией 3x, primary OSD сам синхронно реплицирует на двух соседей и только потом отвечает клиенту «записано».

MDS — Metadata Server

Нужен только для CephFS. Хранит иерархию директорий и метаданные файлов (права, размеры, время). Данные файлов хранятся в обычных RADOS-объектах — MDS только помогает по пути /my/dir/file.txt найти нужные объекты.

Можно запустить несколько MDS для параллелизма — активный-активный режим (multi-MDS).

MGR — Manager

Менеджер собирает статистику, запускает модули (dashboard, prometheus-экспортер, балансировщик), обрабатывает оркестровку через cephadm. Нужно минимум 2 для отказоустойчивости (один active, один standby).


CRUSH: как Ceph решает, куда положить данные

Вот где начинается самое интересное. В обычном RAID контроллер знает: «диск 1, 2, 3». В Ceph нет центрального индекса «где лежит файл» — это было бы узким местом в огромном кластере.

Вместо этого используется алгоритм CRUSH (Controlled Replication Under Scalable Hashing). Зная только имя объекта и карту кластера, CRUSH детерминированно вычисляет, на каких OSD хранить данные — без запросов к какому-либо серверу метаданных.

object "my_file_chunk_0042" 
    │
    ▼
pg_id = hash(object_name) % pg_count
    │
    ▼
CRUSH(pg_id, crush_map) → [OSD.7, OSD.23, OSD.41]

Когда приходит запрос «где лежит объект X» — любой клиент, зная карту кластера, сам вычисляет ответ и идёт напрямую к нужному OSD. Без промежуточных серверов. Это и есть причина масштабируемости.

Placement Groups (PG): промежуточный уровень

Объектов в кластере могут быть миллиарды. Если бы каждый объект CRUSH маппил напрямую на OSD — карта кластера была бы гигантской. Поэтому объекты сначала группируются в Placement Groups (PG), а уже PG маппятся на OSD.

Объект → PG (группа объектов) → OSD

Число PG на pool — важный параметр настройки. Слишком мало — неравномерное распределение, узкое место. Слишком много — накладные расходы. Золотое правило: ~100 PG на OSD в pool.

CRUSH Map: физическая топология

CRUSH знает физику вашего датацентра:

datacenter DC1
├── rack Rack-A
│   ├── host server-01
│   │   ├── osd.0 (weight 1.0)
│   │   ├── osd.1 (weight 1.0)
│   │   └── osd.2 (weight 1.0)
│   └── host server-02
│       ├── osd.3
│       └── osd.4
└── rack Rack-B
    └── host server-03
        ├── osd.5
        └── osd.6

Правило репликации может звучать так: «три копии, каждая на отдельном rack'е». Тогда при смерти целого стойки ни одна PG не потеряет больше одной копии данных.


BlueStore: почему Ceph не использует ext4 или XFS

До Ceph 12 OSD хранил данные на обычной файловой системе (FileStore). Это работало, но было медленно: каждая запись проходила через XFS/ext4 со всеми их накладными расходами, двойным кешированием, лишними syscall'ами.

С Ceph 12 появился BlueStore — кастомный бэкенд хранения, который работает напрямую с блочным устройством, минуя файловую систему. FileStore официально удалён начиная с Reef (18.x).

Архитектура BlueStore

OSD Process
├── BlueStore
│   ├── RocksDB (метаданные объектов, omap)
│   │   └── хранится на быстром SSD/NVMe (BlueFS)
│   ├── WAL (write-ahead log)
│   │   └── тоже лучше на SSD
│   └── данные объектов
│       └── на основном диске (HDD или SSD)
└── BlueFS (микрофайловая система для RocksDB)

В Tentacle (20.x) BlueStore получил улучшенное сжатие и новый, более быстрый WAL — это не маркетинг, а реальные измеримые улучшения для workload'ов с частой записью.

Ключевые преимущества BlueStore:

  • Полный контроль над I/O без лишних слоёв

  • Атомарные транзакции без двойного буферирования

  • Встроенное сжатие (zlib, snappy, zstd, lz4)

  • Checksums для данных и метаданных (обнаружение битрот)

  • Эффективный omap для небольших значений ключ-значение


Репликация vs. Erasure Coding: выбираем стратегию

Репликация (Replication)

Простейший вариант: каждый объект хранится в N копиях на N разных OSD.

Запись "hello.txt":
    [OSD.5 — первичная копия]
        ├── реплицирует → [OSD.12 — копия 2]
        └── реплицирует → [OSD.31 — копия 3]

Плюсы: простота, низкая latency, любой OSD может обслужить чтение. Минусы: 3x overhead по дисковому пространству.

Для продакшна стандарт — size=3, min_size=2. Это значит: нормальный режим — 3 копии, деградированный (когда один OSD умер) — 2 копии, меньше 2 — запись заблокирована.

Erasure Coding (EC)

EC — это как RAID 5/6, но распределённый. Данные разбиваются на K кусков, добавляются M паритетных кусков. Всего K+M кусков на K+M OSD. Для восстановления нужно любые K из K+M кусков.

Пример EC 4+2:
  chunk0 chunk1 chunk2 chunk3 | parity0 parity1
   OSD.1  OSD.2  OSD.3  OSD.4    OSD.5   OSD.6

При смерти OSD.2 и OSD.5 — данные восстанавливаются из оставшихся 4 из 6.

Плюсы: экономия места. EC 4+2 даёт overhead 1.5x против 3x для репликации. Минусы: сложнее, выше latency, CPU overhead на кодирование/декодирование.

EC оптимально для холодного хранилища, S3-бэкапов, больших объектов. Для горячих IOPS-нагруженных данных (БД, VM) — репликация.

FastEC в Tentacle: революция для Erasure Coding

В Ceph Tentacle (20.2.0) появилась долгожданная функция FastEC — принципиально новая реализация I/O для EC пулов с поддержкой partial reads и partial writes.

До FastEC: запись небольшого объекта в EC-пул требовала читать все K кусков, обновлять данные, пересчитывать все паритеты и писать всё обратно. Это называется Read-Modify-Write (RMW) — катастрофа для производительности при мелких записях.

FastEC оптимизирует именно этот случай. По словам разработчиков и независимым тестам, на определённых workload'ах FastEC обгоняет даже репликацию 3x по производительности — при вдвое меньшем расходе места.

Важно: FastEC включается явно на уровне пула командой allow_ec_optimizations:

ceph osd pool set mypool allow_ec_optimizations true

Существующие пулы можно мигрировать без пересоздания данных — достаточно обновить OSD и MON до Tentacle.


Что нового в Ceph Tentacle (20.2.0)

Tentacle вышел 18 ноября 2025 года и является 20-м стабильным релизом Ceph. Это значительный релиз, не косметический. Вот главное:

FastEC — новый движок Erasure Coding

Уже разобрали выше. Переключение плагина по умолчанию с устаревшего Jerasure на ISA-L (Intel ISA-L library) — более быстрый, активно поддерживаемый. Jerasure больше не обслуживается авторами.

SMB-поддержка через Ceph

Ceph теперь умеет создавать SMB-шары прямо из кластера через новый модуль mgr. Технически это Samba поверх CephFS с автоматическим управлением через cephadm. Поддерживает Active Directory и standalone. Работает в кластерном режиме через CTDB.

ceph smb cluster create mysmb active-directory DC=corp,DC=example,DC=com \
  --domain-realm corp.example.com

mgmt-gateway: единая точка входа для управления

Новый сервис mgmt-gateway — nginx reverse proxy с TLS, который объединяет Dashboard, Prometheus, Grafana, Alertmanager под одним адресом. Никаких «зайди на порт 8443 для дашборда, 9090 для Prometheus, 3000 для Grafana».

Плюс интеграция с OAuth 2.0/OIDC для SSO. Настраивается через cephadm в пару команд.

certmgr: автоматические TLS-сертификаты

Подсистема управления сертификатами. Ceph теперь сам выступает корневым CA, выпускает сертификаты для своих сервисов, обновляет их автоматически, предупреждает об истечении. Никаких самоподписанных сертификатов вручную.

Data Availability Score

Новая команда для мониторинга доступности данных:

ceph osd pool availability-status

Показывает «score» для каждого пула — сколько данных доступно прямо сейчас. Пул считается недоступным если любая PG не в состоянии active или есть unfound объекты.

Crimson OSD + SeaStore (Tech Preview)

Crimson — полностью переписанный OSD на основе Seastar (асинхронный, без блокирующих операций). В Tentacle к нему добавили развёртывание SeaStore — нового бэкенда хранения рядом с Crimson. Это всё ещё tech preview, в продакшне не используем — но прогресс виден.

Удаление устаревших модулей

Модули mgr/restful и mgr/zabbix официально удалены. Они были deprecated с 2020 года и имели уязвимости в зависимостях (CVE-2023-46136). Переходите на Dashboard API и Prometheus.


Когда Ceph — правильный выбор

Ceph имеет смысл когда у вас:

  • Минимум 3 физических сервера (иначе нет смысла в распределённости)

  • Объём данных от нескольких терабайт

  • Потребность в нескольких типах хранилища одновременно (block + object + file)

  • Нужна горизонтальная масштабируемость: добавил серверы → ёмкость и производительность выросли

  • Нужна отказоустойчивость без дорогого проприетарного железа

Когда Ceph — не правильный выбор:

  • Один сервер или только два — берите ZFS/BTRFS

  • Небольшой проект: overhead на управление не окупится

  • Нужна очень низкая latency (< 1ms) для транзакционной БД — NVMe All-Flash Array или local SSD в приоритете


Итог: ключевые концепции для запоминания

Концепция

Коротко

RADOS

Нижний уровень — distributed object store

CRUSH

Алгоритм распределения данных без метасервера

OSD

1 демон = 1 диск

PG

Группа объектов, единица репликации

MON

Кворумный регистр карты кластера

BlueStore

Нативный бэкенд OSD без ФС

RBD

Блочный диск поверх RADOS

CephFS

POSIX-ФС поверх RADOS + MDS

RGW

S3/Swift API поверх RADOS

FastEC

Быстрый Erasure Coding в Tentacle

В следующей статье мы разворачиваем реальный кластер с нуля через cephadm, настраиваем пулы и подключаем RBD к Proxmox.

Далее читай - Часть #2

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.