Ceph — это программно определяемая распределенная файловая система с открытым исходным кодом, лишенная узких мест и единых точек отказа, которая представляет из себя легко масштабируемый до петабайтных размеров кластер узлов, выполняющих различные функции, обеспечивая хранение и репликацию данных, а также распределение нагрузки, что гарантирует высокую доступность и надежность.
Основные термины
OSD (Object Storage Daemon) - устройство хранения объектов в Ceph. Обрабатывает такие состояния PG как replication, recovery, backfilling, rebalancing. Так же предоставляет информацию для мониторинга Ceph. Как правило, один демон OSD соответствует одному физическому диску.
Mon (Monitor) - отслеживает состояние всего кластера путём хранения карты состояния кластера, включая карты OSD, PG и CRUSH.
MDS (Metadata Server) - хранит метаданные файловой системы CephFS. MDS делает возможным обрабатывать запросы пользователей POSIX-файловой системы, не нагружая кластер.
CRUSH Map - содержит список OSD и buckets для объединения OSD, а так же список правил, которые говорят CRUSH, как он должен реплицировать данные в пулах кластера Ceph.
Primary OSD - OSD устройство, которое обрабатывает запросы от клиентов.
Replica OSD - OSD устройство, которое используется только для создания реплик от Primary OSD.
CRUSH (Controlled Replication Under Scalable Hashing) - алгоритм, использующий хэширование для расчёта хранения и извлечения данных в распределенных системах на основе кластерного типа хранения. CRUSH распределяет данные по запоминающим устройствам равномерно, но псевдослучайным образом. Распределение контролируется иерархической картой кластера. Карта, которую настраивает администратор, информирует кластер о структуре и емкости узлов в сети хранения данных. CRUSH был разработан для Ceph, распределенного сетевого хранилища.
PG (Placement Groups) - группа размещения или логическая коллекция объектов в Ceph, которые реплицируются в OSD. Одна группа может сохранять данные на несколько OSD, в зависимости уровня сложности системы. Формула для вычисления групп размещения для Ceph следующая:
При этом результат должен быть округлён до ближайшей степени двойки (например, по формуле = 700, после округления = 512).
PGP (Placement Group for Placement purpose) - группы размещения для целей расположения. Количество должно быть равным общему числу групп размещения.
Pool - логический раздел для хранения объектов. Каждый пул содержит определённое количество групп размещения, которые содержат объекты кластеризованные на OSD. Концепция пула обеспечивает устойчивость. При создании пула можно выбрать только один тип доступности данных - репликации или коды удаления. Пул при записи данных руководствуется наборами правил CRUSH.
RADOS (Reliable Autonomic Distributed Object Store) - безотказное автономное распределённое хранилище объектов. Имеет возможность масштабирования до одной тысячи устройств путем использования программного обеспечения на каждом из отдельных узлов хранения.
RBD (RADOS Block Device) - программное обеспечение с открытым исходным кодом для хранения данных на основе блочного устройства в распределенных системах хранения.
CephFS (Ceph File System) - файловая система, совместимая с POSIX (Portable Operating System Interface), использующая для хранения данных кластер Ceph. CephFS использует для хранения блочные устройства CBD (Ceph Block Device) основанные на RBD.
Состояния Placement Groups
Active - в этом состоянии Ceph может обрабатывать запросы к этой группе.
Backfill - сканирование и синхронизация всего содержимого PG без использования журнала операций. Это частный случай восстановления.
Backfill-toofull - состояние backfill в ожидании, потому что OSD назначения имеет высокий коэффициент заполнения.
Clean - данные группы размещения реплицировались нужное количество раз.
Creating - состояние создания группы.
Degraded - PG имеет нереплицированные данные.
Down - отсутствует реплика с необходимыми данными.
Incomplete - состояние в котором Ceph обнаружил в PG отсутствующую информацию о записи или “больные” копии объекта.
Inconsistent - обнаружены несоответствия в одной или нескольких репликах объекта в PG.
Recovering - синхронизация объектов и их реплик.
Repair - проверка группы на несоответствия и восстановление найденных несоответствий, если это возможно.
Replay - группа ждёт клиентов, чтобы повторить операции после крэша OSD.
Peered - состояние, в котором PG не может обработать запросы клиента, так как не имеет достаточно реплик объект.
Peering - процесс приведения всех OSD одной группы размещения в соглашение о состоянии всех объектов и их метаданных в этой PG.
Remapped - PG временно отображается в другие OSD, в отличие от тех, что указаны в карту CRUSH.
Scrubbing - PG проверяется на несоответствия.
Splitting - состояние расщепления одной PG на несколько PG.
Stale - PG находится в неизвестном состоянии, так как мониторы не получили обновления от неё и её отображение изменилось.
Undersized - PG содержит меньше копий, чем установленный размер пула.
Wait-backfill - в очереди на состояние backfill.
Порядок обновления Ceph
Монитор
OSD
MDS
Шлюз RADOS
Информационные команды
Отобразить дерево OSD
1
ceph osd tree
Отобразить черный список клиентов
1
ceph osd blacklist ls
Отобразить текущие значения PG и PGP
1 2
ceph osd pool get <pool-name> pg_num ceph osd pool get <pool-name> pgp_num
ceph osd pool set <pool-name> pg_num <size> ceph osd pool set <pool-name> pgp_num <size>
Создать новый пул
1
ceph osd pool create <pool-name> <pg-size> <pgp-size>
Создать моментальный снепшот пула
1
ceph osd pool mksnap <pool-name> <snap-name>
Переименовать пул
1
ceph osd pool rename <old-name> <new-name>
Установить новый уровень репилкации
1
ceph osd pool set <pool-name> size <size>
Удалить OSD из карты CRUSH
1
ceph osd crush remove <name>
Удалить ключ авторизации OSD
1
ceph auth del <name>
Исключить OSD из кластера
1
ceph osd out <name>
Полное удаление OSD из кластера
1
ceph osd rm <name>
В идеале мы хотим, чтобы все OSD были одинаковыми с точки зрения производительности и мощности, но это не всегда возможно. Когда OSD отличаются по своим ключевым атрибутам, используйте ceph osd crush reweight, чтобы изменить их вес в CRUSH карте, чтобы кластер был правильно сбалансирован, а OSD разных типов получили правильно настроенное количество запросов ввода/вывода и данных.