Skip to content

Commit de12843

Browse files
author
anton.voskresensky
committed
add async translog cronjob
1 parent 361f993 commit de12843

15 files changed

Lines changed: 968 additions & 3 deletions

File tree

ARCHITECTURE.md

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ osctl/
2020
│ ├── danglingchecker.go # Проверка dangling индексов
2121
│ ├── extracteddelete.go # Удаление extracted индексов
2222
│ ├── sharding.go # Автоматическое шардирование
23+
│ ├── translog.go # Включение асинхронного translog
2324
│ ├── indexpatterns.go # Управление Kibana index patterns
2425
│ ├── datasource.go # Создание Kibana data sources
2526
│ └── restore.go # Идемпотентный рестор индексов из снапшотов
@@ -34,7 +35,8 @@ osctl/
3435
│ │ ├── indices.go # Операции с индексами и их настройками
3536
│ │ ├── snapshots.go # Работа со снапшотами
3637
│ │ ├── restore.go # Рестор, recovery/shards, restore-source
37-
│ │ ├── templates.go # Работа с index templates
38+
│ │ ├── templates.go # Работа с index templates (composable и legacy)
39+
│ │ ├── translog.go # Настройки translog у индексов
3840
│ │ └── tasks.go # Работа с _tasks API
3941
│ ├── kibana/ # Kibana API клиент
4042
│ │ ├── client.go # HTTP-клиент
@@ -49,6 +51,7 @@ osctl/
4951
│ ├── snapshots.go # Работа со снапшотами
5052
│ ├── cluster.go # Работа с кластером (утилизация, проверка нод)
5153
│ ├── templates.go # Работа с шаблонами
54+
│ ├── settings.go # Чтение и правка map с настройками индексов
5255
│ └── helpers.go # Вспомогательные функции
5356
├── config-example/ # Примеры конфигураций, job и деплойментов
5457
├── Dockerfile
@@ -305,7 +308,7 @@ osctl/
305308
- Пересчитываем утилизацию через `utils.GetAverageUtilization` с `showDetails=false` (детали не логируются)
306309
- **Проверка нод после удаления**: Вызываем `utils.CheckNodesDown` с `showDetails=false` (детали не логируются). Если `retention_check_nodes_down=true` и разница != 0 - прекращаем удаление с логом. Если произошла ошибка и `retention_check_nodes_down=true` - прекращаем удаление с ошибкой. Если `retention_check_nodes_down=false` и произошла ошибка - только логируем предупреждение и продолжаем.
307310
- **Останавливаем удаление**, если утилизация стала меньше или равна порогу
308-
10. **Summary**: В конце выводится summary с финальной утилизацией, списком успешно удаленных индексов и списком неудачных удалений
311+
11. **Summary**: В конце выводится summary с финальной утилизацией, списком успешно удаленных индексов и списком неудачных удалений
309312

310313
**Конфигурация:**
311314
- Требует `--snap-repo` для проверки снапшотов
@@ -697,6 +700,77 @@ osctl restore --snap-repo s3-backup-old --date 2026.07.09 --dry-run
697700

698701

699702

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+
700774
### Приоритет конфигурации
701775

702776
1. **CLI флаги** (высший приоритет)

ENVIRONMENT_VARIABLES_AND_FLAGS.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
- `extracteddelete`
5757
- `danglingchecker`
5858
- `sharding`
59+
- `translog`
5960
- `indexpatterns`
6061
- `datasource`
6162

@@ -175,6 +176,34 @@ osctl --action=snapshot
175176
- `exclude_sharding`
176177
- `sharding_routing_allocation_temp`
177178

179+
### `translog`
180+
181+
Включает асинхронный translog у индексов кластера и добавляет эти настройки во все существующие шаблоны (composable и legacy). Только добавляет настройки, обратно на `request` не переводит. Предполагается запуск раз в час.
182+
183+
По умолчанию обрабатываются только сегодняшние индексы (дата в имени по `date_format`) - именно в них идёт запись. Флаг `--translog-all-indices` включает обработку всех индексов кластера. Шаблоны обрабатываются всегда все, независимо от этого флага.
184+
185+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
186+
|------|---------------------|----------|--------------|
187+
| `--translog-async-enabled` | `TRANSLOG_ASYNC_ENABLED` | Включает работу команды; при `false` команда ничего не делает | `false` |
188+
| `--translog-sync-interval-seconds` | `TRANSLOG_SYNC_INTERVAL_SECONDS` | Значение `index.translog.sync_interval` в секундах (1-3600) | `1` |
189+
| `--translog-all-indices` | `TRANSLOG_ALL_INDICES` | Обрабатывать все индексы кластера, а не только сегодняшние | `false` |
190+
| `--translog-templates-enabled` | `TRANSLOG_TEMPLATES_ENABLED` | Добавлять настройки в существующие шаблоны | `true` |
191+
| `--translog-skip-catchall-templates` | `TRANSLOG_SKIP_CATCHALL_TEMPLATES` | Не трогать шаблоны на весь кластер (`index_patterns: ["*"]`), например `default-template` | `true` |
192+
| `--translog-include-regex` | `TRANSLOG_INCLUDE_REGEX` | Обрабатывать только индексы и шаблоны, подходящие под регекс | (пусто) |
193+
| `--translog-exclude-regex` | `TRANSLOG_EXCLUDE_REGEX` | Регекс для исключения индексов и шаблонов | (пусто) |
194+
| `--dry-run` | `DRY_RUN` | Показать изменения без применения | `false` |
195+
196+
Системные индексы и шаблоны (имя начинается с `.`), а также закрытые индексы не обрабатываются. Шаблоны с паттерном на весь кластер (`*`) по умолчанию тоже пропускаются: они общие для всего и обычно раскатываются чартом.
197+
198+
**Ключи в конфиг файле:**
199+
- `translog_async_enabled`
200+
- `translog_all_indices`
201+
- `translog_sync_interval_seconds`
202+
- `translog_templates_enabled`
203+
- `translog_skip_catchall_templates`
204+
- `translog_include_regex`
205+
- `translog_exclude_regex`
206+
178207
### `indexpatterns`
179208

180209
Управляет index patterns в Kibana через OpenSearch API (индекс `.kibana`)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
| `extracteddelete` | Удаление extracted индексов |
2525
| `danglingchecker` | Проверка dangling индексов |
2626
| `sharding` | Автоматическое выставление оптимального числа шардов |
27+
| `translog` | Включение асинхронного translog у индексов и шаблонов |
2728
| `indexpatterns` | Управление index patterns в Kibana |
2829
| `datasource` | Создание Kibana data-source ( рековерер) |
2930
| `snapshot-manual | Создание только одного снапшота для индексов с определенным паттерном |

commands/root.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ func executeActionCommand(action string, args []string) error {
113113
targetCmd = danglingCheckerCmd
114114
case "sharding":
115115
targetCmd = shardingCmd
116+
case "translog":
117+
targetCmd = translogCmd
116118
case "indexpatterns":
117119
targetCmd = indexPatternsCmd
118120
case "datasource":
@@ -139,6 +141,7 @@ func init() {
139141
indicesDeleteCmd,
140142
retentionCmd,
141143
shardingCmd,
144+
translogCmd,
142145
indexPatternsCmd,
143146
dataSourceCmd,
144147
dereplicatorCmd,

0 commit comments

Comments
 (0)