|
20 | 20 | │ ├── danglingchecker.go # Проверка dangling индексов |
21 | 21 | │ ├── extracteddelete.go # Удаление extracted индексов |
22 | 22 | │ ├── sharding.go # Автоматическое шардирование |
| 23 | +│ ├── translog.go # Включение асинхронного translog |
23 | 24 | │ ├── indexpatterns.go # Управление Kibana index patterns |
24 | 25 | │ ├── datasource.go # Создание Kibana data sources |
25 | 26 | │ └── restore.go # Идемпотентный рестор индексов из снапшотов |
|
34 | 35 | │ │ ├── indices.go # Операции с индексами и их настройками |
35 | 36 | │ │ ├── snapshots.go # Работа со снапшотами |
36 | 37 | │ │ ├── restore.go # Рестор, recovery/shards, restore-source |
37 | | -│ │ ├── templates.go # Работа с index templates |
| 38 | +│ │ ├── templates.go # Работа с index templates (composable и legacy) |
| 39 | +│ │ ├── translog.go # Настройки translog у индексов |
38 | 40 | │ │ └── tasks.go # Работа с _tasks API |
39 | 41 | │ ├── kibana/ # Kibana API клиент |
40 | 42 | │ │ ├── client.go # HTTP-клиент |
|
49 | 51 | │ ├── snapshots.go # Работа со снапшотами |
50 | 52 | │ ├── cluster.go # Работа с кластером (утилизация, проверка нод) |
51 | 53 | │ ├── templates.go # Работа с шаблонами |
| 54 | +│ ├── settings.go # Чтение и правка map с настройками индексов |
52 | 55 | │ └── helpers.go # Вспомогательные функции |
53 | 56 | ├── config-example/ # Примеры конфигураций, job и деплойментов |
54 | 57 | ├── Dockerfile |
@@ -305,7 +308,7 @@ osctl/ |
305 | 308 | - Пересчитываем утилизацию через `utils.GetAverageUtilization` с `showDetails=false` (детали не логируются) |
306 | 309 | - **Проверка нод после удаления**: Вызываем `utils.CheckNodesDown` с `showDetails=false` (детали не логируются). Если `retention_check_nodes_down=true` и разница != 0 - прекращаем удаление с логом. Если произошла ошибка и `retention_check_nodes_down=true` - прекращаем удаление с ошибкой. Если `retention_check_nodes_down=false` и произошла ошибка - только логируем предупреждение и продолжаем. |
307 | 310 | - **Останавливаем удаление**, если утилизация стала меньше или равна порогу |
308 | | -10. **Summary**: В конце выводится summary с финальной утилизацией, списком успешно удаленных индексов и списком неудачных удалений |
| 311 | +11. **Summary**: В конце выводится summary с финальной утилизацией, списком успешно удаленных индексов и списком неудачных удалений |
309 | 312 |
|
310 | 313 | **Конфигурация:** |
311 | 314 | - Требует `--snap-repo` для проверки снапшотов |
@@ -697,6 +700,77 @@ osctl restore --snap-repo s3-backup-old --date 2026.07.09 --dry-run |
697 | 700 |
|
698 | 701 |
|
699 | 702 |
|
| 703 | +### 16. **translog** - Включение асинхронного translog |
| 704 | + |
| 705 | +Задача команды - снизить IO кластера: перевести на асинхронный translog индексы, |
| 706 | +в которые идёт запись (по умолчанию сегодняшние), и добавить эти же настройки во |
| 707 | +все существующие шаблоны, чтобы новые индексы создавались уже асинхронными. Команда только **добавляет** настройки, обратно на |
| 708 | +`request` она ничего не переводит |
| 709 | + |
| 710 | +Целевые настройки: |
| 711 | + |
| 712 | +```json |
| 713 | +"translog": { |
| 714 | + "durability": "async", |
| 715 | + "sync_interval": "1s" |
| 716 | +} |
| 717 | +``` |
| 718 | + |
| 719 | +**Алгоритм:** |
| 720 | + |
| 721 | +1. **Проверка флага**: если `--translog-async-enabled=false` (по умолчанию) - логируем и выходим с успехом, ничего не трогая |
| 722 | +2. **Формирование интервала**: `sync_interval = {--translog-sync-interval-seconds}s` (по умолчанию `1s`) |
| 723 | +3. **Определение области работы**: по умолчанию берём только сегодняшние индексы - паттерн `*{today}*`, где дата в формате `date_format`. Именно в сегодняшние индексы идёт запись, а вчерашние и старее уже не пишутся. С флагом `--translog-all-indices` паттерн становится `*`, то есть обрабатываются все индексы кластера |
| 724 | +4. **Получение индексов**: `GET /_cat/indices/{pattern}?h=index,status` |
| 725 | +5. **Получение текущих настроек**: `GET /{pattern}/_settings/index.translog.*?flat_settings=true&expand_wildcards=open` - одним запросом на всю выборку |
| 726 | +6. **Отбор индексов**. Пропускаем: |
| 727 | + - системные индексы (начинающиеся с `.`) |
| 728 | + - индексы не в статусе `open` (в закрытые писать настройки не нужно, они и не пишут на диск) |
| 729 | + - индексы, не подходящие под `--translog-include-regex` или подходящие под `--translog-exclude-regex` |
| 730 | + - индексы, у которых уже стоит `durability=async` и нужный `sync_interval` - **идемпотентность**: при повторном запуске пропуск |
| 731 | +7. **Dry run режим**: выводим список индексов с текущими значениями настроек и выходим |
| 732 | +8. **Применение к индексам**: `PUT /{index1,index2,...}/_settings` пачками по 50 индексов (каждый апдейт - это изменение cluster state, поэтому не по одному индексу и не все сразу): |
| 733 | + - если пачка упала с ошибкой про non dynamic setting (старые кластеры не дают менять `sync_interval` у открытого индекса) - повторяем пачку только с `durability`, дальше работаем так же |
| 734 | + - если пачка упала по другой причине - повторяем по одному индексу, чтобы одна проблема не блокировала остальные, и запоминаем неудачные |
| 735 | + - в режиме `es5_compatibility` `sync_interval` для существующих индексов не отправляется вообще - в ES 5.x он задаётся только при создании индекса, то есть через шаблон |
| 736 | +9. **Composable шаблоны** (если `--translog-templates-enabled=true`, по умолчанию да). Шаблоны обрабатываются все, независимо от `--translog-all-indices`: |
| 737 | + - `GET /_index_template` - шаблоны читаются как есть, «сырыми» мапами, чтобы при обратной записи не потерять поля, о которых osctl не знает (`version`, `_meta`, `data_stream`) |
| 738 | + - пропускаем шаблоны с именем на `.` и не подходящие под include/exclude регексы |
| 739 | + - при `--translog-skip-catchall-templates=true` (по умолчанию) пропускаем шаблоны с паттерном на весь кластер (`index_patterns: ["*"]`, у legacy в ES 5.x это поле `template`), например `default-template` |
| 740 | + - в `template.settings` добавляем `index.translog.durability` и `index.translog.sync_interval`, если их там нет или значения отличаются; нотация настроек в шаблоне сохраняется (плоская `index.translog.durability`, вложенная или смешанная) |
| 741 | + - если ничего менять не нужно - шаблон не трогаем |
| 742 | + - `PUT /_index_template/{name}` с полным телом шаблона |
| 743 | + - в режиме `es5_compatibility` composable шаблоны пропускаются - в ES 5.x их нет |
| 744 | +10. **Legacy шаблоны**: то же самое через `GET /_template` и `PUT /_template/{name}` (их создаёт, например, Jaeger, и в ES 5.x они единственные). Если для одного паттерна есть и composable, и legacy шаблон - применяется composable, но настройка добавляется в оба |
| 745 | +11. **Summary**: список изменённых и неудачных объектов; при наличии неудачных команда завершается с ошибкой |
| 746 | + |
| 747 | +**Почему раз в час:** новые индексы (новый сервис, новые сутки, пересозданный шаблон) |
| 748 | +появляются постоянно, и до следующего запуска они пишут translog синхронно. Час - это |
| 749 | +компромисс между нагрузкой на cluster manager и временем жизни «синхронного» индекса. |
| 750 | + |
| 751 | +**Взаимодействие с `sharding`:** `sharding` при обновлении существующего шаблона |
| 752 | +читает его целиком и меняет только `number_of_shards` и `query.default_field`, |
| 753 | +остальные настройки (включая translog) переносятся как есть - настройки не |
| 754 | +перетираются. Новые шаблоны `sharding` создаёт без translog-настроек, их добавит |
| 755 | +ближайший запуск `translog`. |
| 756 | + |
| 757 | +**Конфигурация:** |
| 758 | +- `--translog-async-enabled` - главный выключатель (по умолчанию `false`) |
| 759 | +- `--translog-sync-interval-seconds` - значение `sync_interval` в секундах (по умолчанию 1, допустимо 1-3600) |
| 760 | +- `--translog-all-indices` - обрабатывать все индексы кластера, а не только сегодняшние (по умолчанию `false`) |
| 761 | +- `--translog-templates-enabled` - обрабатывать ли шаблоны (по умолчанию `true`) |
| 762 | +- `--translog-skip-catchall-templates` - не трогать шаблоны на весь кластер (по умолчанию `true`) |
| 763 | +- `--translog-include-regex` - обрабатывать только индексы и шаблоны, подходящие под регекс |
| 764 | +- `--translog-exclude-regex` - исключить индексы и шаблоны по регексу |
| 765 | +- `--dry-run` - показать изменения без применения |
| 766 | + |
| 767 | +```bash |
| 768 | +osctl translog --translog-async-enabled --dry-run |
| 769 | +osctl translog --translog-async-enabled --translog-all-indices |
| 770 | +osctl translog --translog-async-enabled --translog-sync-interval-seconds 5 |
| 771 | +osctl translog --translog-async-enabled --translog-include-regex '^myapp-' |
| 772 | +``` |
| 773 | + |
700 | 774 | ### Приоритет конфигурации |
701 | 775 |
|
702 | 776 | 1. **CLI флаги** (высший приоритет) |
|
0 commit comments