diff --git a/docs/config/osd.en.md b/docs/config/osd.en.md index 0624eb48..f5b0739a 100644 --- a/docs/config/osd.en.md +++ b/docs/config/osd.en.md @@ -39,6 +39,13 @@ them, even without restarting by updating configuration in etcd. - [throttle_target_parallelism](#throttle_target_parallelism) - [throttle_threshold_us](#throttle_threshold_us) - [osd_memlock](#osd_memlock) +- [no_scrub](#no_scrub) +- [auto_scrub](#auto_scrub) +- [scrub_interval](#scrub_interval) +- [scrub_queue_depth](#scrub_queue_depth) +- [scrub_sleep](#scrub_sleep) +- [scrub_list_limit](#scrub_list_limit) +- [scrub_ec_max_bruteforce](#scrub_ec_max_bruteforce) ## etcd_report_interval @@ -332,4 +339,81 @@ doesn't need to be changed. - Type: boolean - Default: false -Lock all OSD memory to prevent it from being unloaded into swap with mlockall(). Requires sufficient ulimit -l (max locked memory). +Lock all OSD memory to prevent it from being unloaded into swap with +mlockall(). Requires sufficient ulimit -l (max locked memory). + +## no_scrub + +- Type: boolean +- Default: false +- Can be changed online: yes + +Disable data scrubbing (background consistency check), even if it is scheduled. + +## auto_scrub + +- Type: boolean +- Default: false +- Can be changed online: yes + +Schedule data scrubbing to run every `scrub_interval` automatically. You can +start/schedule scrubbing manually by updating `next_scrub` key in +`/pg/history/...` values in etcd if it is disabled. + +## scrub_interval + +- Type: string +- Default: 30d +- Can be changed online: yes + +Default automatic scrubbing interval for all pools. Numbers without suffix +are treated as seconds, possible unit suffixes include 's' (seconds), +'m' (minutes), 'h' (hours), 'd' (days), 'M' (months) and 'y' (years). + +## scrub_queue_depth + +- Type: integer +- Default: 1 +- Can be changed online: yes + +Number of parallel scrubbing operations per one OSD. + +## scrub_sleep + +- Type: milliseconds +- Default: 0 +- Can be changed online: yes + +Additional interval between two consecutive scrubbing operations on one OSD. +Can be used to slow down scrubbing if it affects user load too much. + +## scrub_list_limit + +- Type: integer +- Default: 1000 +- Can be changed online: yes + +Number of objects to list in one listing operation during scrub. + +## scrub_ec_max_bruteforce + +- Type: integer +- Default: 100 +- Can be changed online: yes + +Vitastor can locate corrupted chunks in EC setups with more than 1 parity +chunk by brute-forcing all possible error locations. This configuration +value limits the maximum number of checked combinations. You can try to +increase it if you have EC N+K setup with N and K large enough for +combination count `C(N+K-1, K-1) = (N+K-1)! / (K-1)! / N!` to be greater +than the default 100. + +If there are too many possible combinations or if multiple combinations give +correct results then objects are marked inconsistent and aren't recovered +automatically. + +In replicated setups bruteforcing isn't needed, Vitastor just assumes that +the variant with most available equal copies is correct. For example, if +you have 3 replicas and 1 of them differs, this one is considered to be +corrupted. But if there is no "best" version with more copies than all +others have then the object is also marked as inconsistent. diff --git a/docs/config/osd.ru.md b/docs/config/osd.ru.md index 8e193931..65801e5c 100644 --- a/docs/config/osd.ru.md +++ b/docs/config/osd.ru.md @@ -40,6 +40,13 @@ - [throttle_target_parallelism](#throttle_target_parallelism) - [throttle_threshold_us](#throttle_threshold_us) - [osd_memlock](#osd_memlock) +- [no_scrub](#no_scrub) +- [auto_scrub](#auto_scrub) +- [scrub_interval](#scrub_interval) +- [scrub_queue_depth](#scrub_queue_depth) +- [scrub_sleep](#scrub_sleep) +- [scrub_list_limit](#scrub_list_limit) +- [scrub_ec_max_bruteforce](#scrub_ec_max_bruteforce) ## etcd_report_interval @@ -346,4 +353,88 @@ Flusher - это микро-поток (корутина), которая коп - Тип: булево (да/нет) - Значение по умолчанию: false -Блокировать всю память OSD с помощью mlockall, чтобы запретить её выгрузку в пространство подкачки. Требует достаточного значения ulimit -l (лимита заблокированной памяти). +Блокировать всю память OSD с помощью mlockall, чтобы запретить её выгрузку +в пространство подкачки. Требует достаточного значения ulimit -l (лимита +заблокированной памяти). + +## no_scrub + +- Тип: булево (да/нет) +- Значение по умолчанию: false +- Можно менять на лету: да + +Отключить скрабы (фоновую проверку данных), даже если она запланирована. + +## auto_scrub + +- Тип: булево (да/нет) +- Значение по умолчанию: false +- Можно менять на лету: да + +Автоматически планировать фоновую проверку данных раз в `scrub_interval`. Вы +можете запустить или запланировать проверку вручную, обновляя значение ключа +`next_scrub` внутри значений `/pg/history/...` в etcd, если автоматическое +планирование отключено. + +## scrub_interval + +- Тип: строка +- Значение по умолчанию: 30d +- Можно менять на лету: да + +Интервал автоматической фоновой проверки по умолчанию для всех пулов. +Значения без указанной единицы измерения считаются в секундах, допустимые +символы единиц измерения в конце: 's' (секунды), +'m' (минуты), 'h' (часы), 'd' (дни), 'M' (месяца) или 'y' (годы). + +## scrub_queue_depth + +- Тип: целое число +- Значение по умолчанию: 1 +- Можно менять на лету: да + +Число параллельных операций фоновой проверки на один OSD. + +## scrub_sleep + +- Тип: миллисекунды +- Значение по умолчанию: 0 +- Можно менять на лету: да + +Дополнительный интервал ожидания после фоновой проверки каждого объекта на +одном OSD. Может использоваться для замедления скраба, если он слишком +сильно влияет на пользовательскую нагрузку. + +## scrub_list_limit + +- Тип: целое число +- Значение по умолчанию: 1000 +- Можно менять на лету: да + +Размер загружаемых за одну операцию списков объектов в процессе фоновой +проверки. + +## scrub_ec_max_bruteforce + +- Тип: целое число +- Значение по умолчанию: 100 +- Можно менять на лету: да + +Vitastor старается определить повреждённые части объектов при использовании +EC (кодов коррекции ошибок) с более, чем 1 диском чётности, путём перебора +всех возможных комбинаций ошибочных частей. Данное значение конфигурации +ограничивает число перебираемых комбинаций. Вы можете попробовать поднять +его, если используете схему кодирования EC N+K с N и K, достаточно большими +для того, чтобы число сочетаний `C(N+K-1, K-1) = (N+K-1)! / (K-1)! / N!` +было больше, чем стандартное значение 100. + +Если возможных комбинаций слишком много или если корректная комбинаций не +определяется однозначно, объекты помечаются неконсистентными (inconsistent) +и не восстанавливаются автоматически. + +При использовании репликации перебор не нужен, Vitastor просто предполагает, +что вариант объекта с наибольшим количеством одинаковых копий корректен. +Например, если вы используете 3 реплики и 1 из них отличается, эта 1 копия +считается некорректной. Однако, если "лучшую" версию с числом доступных +копий большим, чем у всех других версий, найти невозможно, то объект тоже +маркируется неконсистентным. diff --git a/docs/config/pool.en.md b/docs/config/pool.en.md index 931fafa6..ef7a8e4d 100644 --- a/docs/config/pool.en.md +++ b/docs/config/pool.en.md @@ -40,6 +40,7 @@ Parameters: - [root_node](#root_node) - [osd_tags](#osd_tags) - [primary_affinity_tags](#primary_affinity_tags) +- [scrub_interval](#scrub_interval) Examples: @@ -272,6 +273,13 @@ Specifies OSD tags to prefer putting primary OSDs in this pool to. Note that for EC/XOR pools Vitastor always prefers to put primary OSD on one of the OSDs containing a data chunk for a PG. +## scrub_interval + +- Type: time interval (number + unit s/m/h/d/M/y) + +Automatic scrubbing interval for this pool. Overrides +[global scrub_interval setting](osd.en.md#scrub_interval). + # Examples ## Replicated pool diff --git a/docs/config/pool.ru.md b/docs/config/pool.ru.md index c7082269..a6eb360d 100644 --- a/docs/config/pool.ru.md +++ b/docs/config/pool.ru.md @@ -39,6 +39,7 @@ - [root_node](#root_node) - [osd_tags](#osd_tags) - [primary_affinity_tags](#primary_affinity_tags) +- [scrub_interval](#scrub_interval) Примеры: @@ -276,6 +277,13 @@ PG в Vitastor эферемерны, то есть вы можете менят для PG этого пула. Имейте в виду, что для EC-пулов Vitastor также всегда предпочитает помещать первичный OSD на один из OSD с данными, а не с чётностью. +## scrub_interval + +- Тип: временной интервал (число + единица измерения s/m/h/d/M/y) + +Интервал скраба, то есть, автоматической фоновой проверки данных для данного пула. +Переопределяет [глобальную настройку scrub_interval](osd.ru.md#scrub_interval). + # Примеры ## Реплицированный пул diff --git a/docs/config/src/osd.yml b/docs/config/src/osd.yml index 33994718..cdd2af68 100644 --- a/docs/config/src/osd.yml +++ b/docs/config/src/osd.yml @@ -375,10 +375,112 @@ - name: osd_memlock type: bool default: false - info: > + info: | Lock all OSD memory to prevent it from being unloaded into swap with mlockall(). Requires sufficient ulimit -l (max locked memory). - info_ru: > + info_ru: | Блокировать всю память OSD с помощью mlockall, чтобы запретить её выгрузку в пространство подкачки. Требует достаточного значения ulimit -l (лимита заблокированной памяти). +- name: no_scrub + type: bool + default: false + online: true + info: | + Disable data scrubbing (background consistency check), even if it is scheduled. + info_ru: | + Отключить скрабы (фоновую проверку данных), даже если она запланирована. +- name: auto_scrub + type: bool + default: false + online: true + info: | + Schedule data scrubbing to run every `scrub_interval` automatically. You can + start/schedule scrubbing manually by updating `next_scrub` key in + `/pg/history/...` values in etcd if it is disabled. + info_ru: | + Автоматически планировать фоновую проверку данных раз в `scrub_interval`. Вы + можете запустить или запланировать проверку вручную, обновляя значение ключа + `next_scrub` внутри значений `/pg/history/...` в etcd, если автоматическое + планирование отключено. +- name: scrub_interval + type: string + default: 30d + online: true + info: | + Default automatic scrubbing interval for all pools. Numbers without suffix + are treated as seconds, possible unit suffixes include 's' (seconds), + 'm' (minutes), 'h' (hours), 'd' (days), 'M' (months) and 'y' (years). + info_ru: | + Интервал автоматической фоновой проверки по умолчанию для всех пулов. + Значения без указанной единицы измерения считаются в секундах, допустимые + символы единиц измерения в конце: 's' (секунды), + 'm' (минуты), 'h' (часы), 'd' (дни), 'M' (месяца) или 'y' (годы). +- name: scrub_queue_depth + type: int + default: 1 + online: true + info: | + Number of parallel scrubbing operations per one OSD. + info_ru: | + Число параллельных операций фоновой проверки на один OSD. +- name: scrub_sleep + type: ms + default: 0 + online: true + info: | + Additional interval between two consecutive scrubbing operations on one OSD. + Can be used to slow down scrubbing if it affects user load too much. + info_ru: | + Дополнительный интервал ожидания после фоновой проверки каждого объекта на + одном OSD. Может использоваться для замедления скраба, если он слишком + сильно влияет на пользовательскую нагрузку. +- name: scrub_list_limit + type: int + default: 1000 + online: true + info: | + Number of objects to list in one listing operation during scrub. + info_ru: | + Размер загружаемых за одну операцию списков объектов в процессе фоновой + проверки. +- name: scrub_ec_max_bruteforce + type: int + default: 100 + online: true + info: | + Vitastor can locate corrupted chunks in EC setups with more than 1 parity + chunk by brute-forcing all possible error locations. This configuration + value limits the maximum number of checked combinations. You can try to + increase it if you have EC N+K setup with N and K large enough for + combination count `C(N+K-1, K-1) = (N+K-1)! / (K-1)! / N!` to be greater + than the default 100. + + If there are too many possible combinations or if multiple combinations give + correct results then objects are marked inconsistent and aren't recovered + automatically. + + In replicated setups bruteforcing isn't needed, Vitastor just assumes that + the variant with most available equal copies is correct. For example, if + you have 3 replicas and 1 of them differs, this one is considered to be + corrupted. But if there is no "best" version with more copies than all + others have then the object is also marked as inconsistent. + info_ru: | + Vitastor старается определить повреждённые части объектов при использовании + EC (кодов коррекции ошибок) с более, чем 1 диском чётности, путём перебора + всех возможных комбинаций ошибочных частей. Данное значение конфигурации + ограничивает число перебираемых комбинаций. Вы можете попробовать поднять + его, если используете схему кодирования EC N+K с N и K, достаточно большими + для того, чтобы число сочетаний `C(N+K-1, K-1) = (N+K-1)! / (K-1)! / N!` + было больше, чем стандартное значение 100. + + Если возможных комбинаций слишком много или если корректная комбинаций не + определяется однозначно, объекты помечаются неконсистентными (inconsistent) + и не восстанавливаются автоматически. + + При использовании репликации перебор не нужен, Vitastor просто предполагает, + что вариант объекта с наибольшим количеством одинаковых копий корректен. + Например, если вы используете 3 реплики и 1 из них отличается, эта 1 копия + считается некорректной. Однако, если "лучшую" версию с числом доступных + копий большим, чем у всех других версий, найти невозможно, то объект тоже + маркируется неконсистентным. diff --git a/docs/intro/features.en.md b/docs/intro/features.en.md index 19947510..ef435c2b 100644 --- a/docs/intro/features.en.md +++ b/docs/intro/features.en.md @@ -29,6 +29,7 @@ - Snapshots and copy-on-write image clones - [Write throttling to smooth random write workloads in SSD+HDD configurations](../config/osd.en.md#throttle_small_writes) - [RDMA/RoCEv2 support via libibverbs](../config/network.en.md#rdma_device) +- [Scrubbing without checksums](../config/osd.en.md#no_scrub) (verification of copies) ## Plugins and tools @@ -54,7 +55,6 @@ The following features are planned for the future: - iSCSI proxy - Multi-threaded client - Faster failover -- Scrubbing without checksums (verification of replicas) - Checksums - Tiered storage (SSD caching) - NVDIMM support diff --git a/docs/intro/features.ru.md b/docs/intro/features.ru.md index b11b3baa..dc5fa693 100644 --- a/docs/intro/features.ru.md +++ b/docs/intro/features.ru.md @@ -31,6 +31,7 @@ - Снапшоты и copy-on-write клоны - [Сглаживание производительности случайной записи в SSD+HDD конфигурациях](../config/osd.ru.md#throttle_small_writes) - [Поддержка RDMA/RoCEv2 через libibverbs](../config/network.ru.md#rdma_device) +- [Фоновая проверка целостности без контрольных сумм](../config/osd.ru.md#no_scrub) (сверка копий) ## Драйверы и инструменты @@ -54,7 +55,6 @@ - iSCSI-прокси - Многопоточный клиент - Более быстрое переключение при отказах -- Фоновая проверка целостности без контрольных сумм (сверка реплик) - Контрольные суммы - Поддержка SSD-кэширования (tiered storage) - Поддержка NVDIMM diff --git a/docs/usage/cli.en.md b/docs/usage/cli.en.md index 94be749f..8e504e2b 100644 --- a/docs/usage/cli.en.md +++ b/docs/usage/cli.en.md @@ -20,6 +20,8 @@ It supports the following commands: - [flatten](#flatten) - [rm-data](#rm-data) - [merge-data](#merge-data) +- [describe](#describe) +- [fix](#fix) - [alloc-osd](#alloc-osd) - [rm-osd](#rm-osd) @@ -174,6 +176,51 @@ Merge layer data without changing metadata. Merge ``..`` to `` `` must be a child of `` and `` may be one of the layers between `` and ``, including `` and ``. +## describe + +`vitastor-cli describe [--osds ] [--object-state ] [--pool ] + [--inode ] [--min-inode ] [--max-inode ] + [--min-offset ] [--max-offset ]` + +Describe unclean object locations in the cluster. + +``` +--osds + Only list objects from primary OSD(s) . +--object-state + Only list objects in given state(s). State(s) may include: + degraded, misplaced, incomplete, corrupted, inconsistent. +--pool + Only list objects in the given pool. +--inode, --min-inode, --max-inode + Restrict listing to specific inode numbers. +--min-offset, --max-offset + Restrict listing to specific offsets inside inodes. +``` + +## fix + +`vitastor-cli fix [--objects ] [--bad-osds ] [--part ] [--check no]` + +Fix inconsistent objects in the cluster by deleting some copies. + +``` +--objects + Objects to fix, either in plain text or JSON format. If not specified, + object list will be read from STDIN in one of the same formats. + Plain text format: 0x:0x 0x:0x ... + JSON format: [{"inode":"0x...","stripe":"0x..."},...] +--bad-osds + Remove inconsistent copies/parts of objects from these OSDs, effectively + marking them bad and allowing Vitastor to recover objects from other copies. +--part + Only remove EC part (from 0 to pg_size-1), required for extreme + edge cases where one OSD has multiple parts of a EC object. +--check no + Do not recheck that requested objects are actually inconsistent, + delete requested copies/parts anyway. +``` + ## alloc-osd `vitastor-cli alloc-osd` diff --git a/docs/usage/cli.ru.md b/docs/usage/cli.ru.md index 87a51da5..f91ee21f 100644 --- a/docs/usage/cli.ru.md +++ b/docs/usage/cli.ru.md @@ -184,6 +184,59 @@ vitastor-cli snap-create [-p|--pool ] @ в целевой образ ``. `` должен быть дочерним образом ``, а `` должен быть одним из слоёв между `` и ``, включая сами `` и ``. +## describe + +`vitastor-cli describe [--osds ] [--object-state <состояния>] [--pool <пул>] + [--inode <номер>] [--min-inode <номер>] [--max-inode <номер>] + [--min-offset <смещение>] [--max-offset <смещение>]` + +Описать состояние "грязных" объектов в кластере, то есть таких объектов, копии +или части которых хранятся на наборе OSD, не равном целевому. + +``` +--osds + Перечислять только объекты с первичных OSD из списка . +--object-state <состояния> + Перечислять только объекты в указанных состояниях. Возможные состояния + объектов: + - degraded - деградированная избыточность + - misplaced - перемещённый + - incomplete - нечитаемый из-за потери большего числа частей, чем допустимо + - corrupted - с одной или более повреждённой частью + - inconsistent - неконсистентный, с неоднозначным расхождением копий/частей +--pool <имя или ID пула> + Перечислять только объекты из заданного пула. +--inode, --min-inode, --max-inode + Перечислять только объекты из указанных номеров инодов (образов). +--min-offset, --max-offset + Перечислять только объекты с заданных смещений внутри образов. +``` + +## fix + +`vitastor-cli fix [--objects <объекты>] [--bad-osds ] [--part <номер>] [--check no]` + +Исправить неконсистентные (неоднозначные) объекты путём удаления части копий. + +``` +--objects <объекты> + Объекты для исправления - в простом текстовом или JSON формате. Если опция + не указана, список объектов читается со стандартного ввода в тех же форматах. + Простой формат: 0x<инод>:0x<смещение> <любой разделитель> 0x<инод>:0x<смещение> ... + Формат JSON: [{"inode":"0x<инод>","stripe":"0x<смещение>"},...] +--bad-osds + Удалить неконсистентные копии/части объектов с данных OSD, таким образом + признавая потерю этих копий и позволяя Vitastor-у восстановить объекты из + других копий. +--part <номер> + Удалить только части EC с заданным номером (от 0 до pg_size-1). Нужно только + в редких граничных случаях, когда один и тот же OSD содержит несколько частей + одного EC-объекта. +--check no + Не перепроверять, что заданные объекты действительно в неконсистентном + состоянии и просто удалять заданные части. +``` + ## alloc-osd `vitastor-cli alloc-osd` diff --git a/mon/mon.js b/mon/mon.js index 9e4e2e46..ac2e7c70 100644 --- a/mon/mon.js +++ b/mon/mon.js @@ -111,6 +111,7 @@ const etcd_tree = { print_stats_interval: 3, slow_log_interval: 10, inode_vanish_time: 60, + no_scrub: false, auto_scrub: false, scrub_interval: '30d', // 1s/1m/1h/1d scrub_queue_depth: 1, diff --git a/src/cli.cpp b/src/cli.cpp index 5d9bb912..dbfd993b 100644 --- a/src/cli.cpp +++ b/src/cli.cpp @@ -76,7 +76,7 @@ static const char* help_text = "vitastor-cli describe [--osds ] [--object-state ] [--pool ] [--inode ] [--min-inode ] [--max-inode ] [--min-offset ] [--max-offset ]\n" " Describe unclean object locations in the cluster.\n" " --osds \n" - " Only list objects from master OSD(s) .\n" + " Only list objects from primary OSD(s) .\n" " --object-state \n" " Only list objects in given state(s). State(s) may include:\n" " degraded, misplaced, incomplete, corrupted, inconsistent.\n" @@ -87,7 +87,7 @@ static const char* help_text = " --min-offset, --max-offset\n" " Restrict listing to specific offsets inside inodes.\n" "\n" - "vitastor-cli fix [--objects ] [--bad-osds ] [--check no]\n" + "vitastor-cli fix [--objects ] [--bad-osds ] [--part ] [--check no]\n" " Fix inconsistent objects in the cluster by deleting some copies.\n" " --objects \n" " Objects to fix, either in plain text or JSON format. If not specified,\n" @@ -95,11 +95,11 @@ static const char* help_text = " Plain text format: 0x:0x 0x:0x ...\n" " JSON format: [{\"inode\":\"0x...\",\"stripe\":\"0x...\"},...]\n" " --bad-osds \n" - " Remove inconsistent copies/parts of objects from these OSDs,\n" - " effectively marking them bad and allowing Vitastor to recover.\n" + " Remove inconsistent copies/parts of objects from these OSDs, effectively\n" + " marking them bad and allowing Vitastor to recover objects from other copies.\n" " --part \n" - " Only remove EC part , required for extreme edge cases\n" - " where one OSD has multiple parts of a EC object.\n" + " Only remove EC part (from 0 to pg_size-1), required for extreme\n" + " edge cases where one OSD has multiple parts of a EC object.\n" " --check no\n" " Do not recheck that requested objects are actually inconsistent,\n" " delete requested copies/parts anyway.\n"