Відмовостійкість
OpenTelemetry Collector розроблено з компонентами та конфігураціями, які мінімізують втрату даних під час обробки та експорту телеметрії. Однак, розуміння потенційних сценаріїв, в яких може статися втрата даних, і способів їх мінімізації, має вирішальне значення для забезпечення відмовостійкості конвеєра спостережуваності.
Розуміння відмовостійкості колектора
Відмовостійкий колектор підтримує потік телеметричних даних і можливості обробки навіть за несприятливих умов, гарантуючи, що загальний конвеєр спостережуваності залишається функціональним.
Відмовостійкість колектора в першу чергу залежить від того, як він обробляє дані, коли налаштована точка доступу (місце призначення трейсів, метрик або журналів) стає недоступною або коли сам екземпляр колектора зазнає проблем, таких як збої в роботі.
Черга надсилання (буферизація в памʼяті)
Найпростіша форма відмовостійкості, вбудована в експортери колектора, — це черга надсилання.
Як вона працює: Коли експортер налаштовано, він зазвичай включає чергу надсилання, яка буферизує дані в памʼяті, перш ніж надсилати їх до точки призначення, що знаходиться далі за ланцюжком потоку даних. Якщо точка призначення доступна, дані проходять через неї швидко.
Обробка недоступності точки призначення: Якщо точка призначення стає недоступною, наприклад, через проблеми з мережею або перезавантаження серверної частини, експортер не може негайно надіслати дані. Замість того, щоб видалити дані, він додає їх до черги на надсилання в памʼяті.
Механізм повторної спроби: Колектор використовує механізм повторних спроб з експоненціальною затримкою і відставанням. Він буде повторювати спроби надіслати буферизовані дані після інтервалів очікування. Стандартно, повторні спроби тривають до 5 хвилин.
Сценарій втрати даних:
- Переповнення черги: черга в памʼяті має розмір, що налаштовується ( зазвичай це 1000 пакетів/запитів). Якщо точка доступу залишається недоступною, а нові дані продовжують надходити, черга може переповнитися. Після заповнення черги вхідні дані відкидаються, щоб запобігти вичерпанню памʼяті Колектора.
- Тайм-аут повторів: Якщо точка доступу залишається недоступною довше, ніж налаштована максимальна тривалість повторної спроби (стандартно 5 хвилин), колектор припинить повторні спроби для найстаріших даних у черзі і видалить їх.
Налаштування: Ви можете налаштувати розмір черги та поведінку повторних спроб у налаштуваннях експортера:
exporters: otlp: endpoint: otlp.example.com:4317 sending_queue: storage: file_storage queue_size: 5_000 # Збільшити розмір черги (стандартно 1000) retry_on_failure: initial_interval: 5s max_interval: 30s max_elapsed_time: 10m # Збільшити максимальний час повторної спроби (стандартно 300 секунд)
Увімкніть черги надсилання для всіх експортерів, які надсилають дані мережею. Налаштуйте queue_size та max_elapsed_time на основі очікуваного обсягу даних, доступної памʼяті колектора та допустимого часу простою для точки доступу. Відстежуйте метрики черги (otelcol_exporter_queue_size, otelcol_exporter_queue_capacity).
Постійне сховище (write-ahead log - WAL)
Для захисту від втрати даних у разі збою або перезапуску самого екземпляра колектора, ви можете увімкнути постійне сховище для черги надсилання за допомогою розширення file_storage.
Як це працює: Замість того, щоб просто буферизуватися в памʼяті, черга надсилання записує дані до журналу попереднього запису (Write-Ahead Log, WAL) на диску перед спробою експорту.
Обробка збоїв колектора: Якщо колектор аварійно завершує роботу, коли дані перебувають у черзі, вони зберігаються на диску. Після перезапуску колектор зчитує дані з WAL і відновлює спроби надіслати їх до точки призначення.
Сценарій втрати даних: Втрата даних може статися, якщо диск вийшов з ладу або на ньому закінчилося місце, або якщо точка призначення залишається недоступною за межами ліміту повторних спроб навіть після перезапуску колектора. Гарантії можуть бути не такими надійними, як у випадку з виділеними чергами повідомлень.
Налаштування:
- Визначте розширення
file_storage. - Вкажіть ідентифікатор сховища у конфігурації
sending_queueекспортера.
extensions: file_storage: # Визначте екземпляр розширення directory: /var/lib/otelcol/storage # Виберіть постійну теку exporters: otlp: endpoint: otlp.example.com:4317 sending_queue: storage: file_storage # Посилання на екземпляр розширення сховища service: extensions: [file_storage] # Увімкніть розширення в конвеєрі обслуговування pipelines: traces: receivers: [otlp] exporters: [otlp]- Визначте розширення
Використовуйте постійне сховище для критично важливих колекторів (наприклад, екземплярів Gateway або Агентів, що збирають важливі дані), де втрата даних через збої колекторів є неприпустимою. Переконайтеся, що обрана тека має достатньо місця на диску та відповідні дозволи.
Черги повідомлень
Для забезпечення найвищого рівня відмовостійкості, особливо між різними рівнями колекторів (наприклад, від Агента до Gateway) або між вашою інфраструктурою та бекендом постачальника, ви можете запровадити спеціальну чергу повідомлень, як у Kafka.
- Як це працює: Один екземпляр колектора (агент) експортує дані до топіку Kafka за допомогою експортера Kafka. Інший екземпляр Колектора (Gateway) бере дані з топіка Kafka за допомогою приймача Kafka.
- Обробка недоступності точки доступу/колектора:
- Якщо колектор-споживач (Gateway) не працює, повідомлення просто накопичуються в топіку Kafka (в межах лімітів зберігання Kafka). Поки Kafka працює, це не впливає на колектор (Агента), що надсилає повідомлення, поки Kafka працює.
- Якщо ж колектор (Агент) не працює, нові дані не потрапляють до черги, але споживач може продовжувати обробляти наявні повідомлення.
- Якщо Kafka сам не працює, Колектор-виробник потребує власного механізму відмовостійкості (наприклад, черги надсилання, можливо, з WAL) для буферизації даних, призначених для Kafka.
- Сценарій втрати даних: Втрата даних передусім повʼязана з самим Kafka (збій кластера, неправильна конфігурація топіків, закінчення терміну дії даних) або з нездатністю виробника надсилати дані до Kafka без належної локальної буферизації.
- Конфігурація:
Конфігурація Колектора Агента (Producer):
exporters: kafka: brokers: ['kafka-broker1:9092', 'kafka-broker2:9092'] topic: otlp_traces receivers: otlp: protocols: grpc: service: pipelines: traces: receivers: [otlp] exporters: [kafka]Конфігурація Колектора Gateway (Consumer):
receivers: kafka: brokers: ['kafka-broker1:9092', 'kafka-broker2:9092'] topic: otlp_traces initial_offset: earliest # Обрбка беклогу exporters: otlp: endpoint: otlp.example.com:4317 # Розглянемо чергу/повторну спробу для експорту *з* Gateway до Backend service: pipelines: traces: receivers: [kafka] exporters: [otlp]
Використовуйте чергу повідомлень для критично важливих шляхів передачі даних, що вимагають високої відмовостійкості, особливо через мережеві кордони (наприклад, між центрами обробки даних, зонами доступності або до хмарного постачальника). Цей підхід використовує надійну, вбудовану відмовостійкість таких систем, як Kafka, але додає операційної складності і вимагає досвіду в управлінні системою черги повідомлень.
Обставини втрати даних
Втрата даних може статися за таких обставин:
- Відсутність мережі + тайм-аут: Низхідна (downstream) точка доступу недоступна довше, ніж заданий час
max_elapsed_timeу налаштуванняхretry_on_failure. - Відсутність мережі + переповнення черги: Низхідна точка доступу недоступна, а черга надсилання (в памʼяті або постійна) переповнюється до того, як точка доступу відновлюється. Нові дані втрачаються.
- Збій колектора (без постійного збереження): Екземпляр колектора аварійно завершує свою роботу, а він використовував лише чергу надсилання в памʼяті. Дані в памʼяті втрачено.
- Збій постійного сховища: Диск, який використовується розширенням
file_storage, вийшов з ладу або на ньому закінчилося місце. - Збій у черзі повідомлень: Зовнішня черга повідомлень (наприклад, Kafka) зазнає збою або втрати даних, а колектор, що створює повідомлення, не має достатньої локальної буферизації.
- Неправильна конфігурація: Експортери або приймачі налаштовані неправильно, що перешкоджає потоку даних.
- Відключена відмовостійкість: У конфігурації явно вимкнено черги надсилання або механізми повторних спроб.
Рекомендації щодо запобігання втраті даних
Дотримуйтесь цих рекомендацій, щоб мінімізувати втрату даних і забезпечити надійний збір телеметричних даних:
- Завжди використовуйте черги надсилання: Увімкніть
sending_queueдля експортерів, які надсилають дані мережею. - Відстежуйте метрики колекторів: Активно відстежуйте
otelcol_exporter_queue_size,otelcol_exporter_queue_capacity,otelcol_exporter_send_failed_spans(та еквіваленти для метрик/логів) для раннього виявлення потенційних проблем. - Налаштуйте розмір черги та повторні спроби: Налаштуйте параметри
queue_sizeіretry_on_failureвідповідно до очікуваного навантаження, ресурсів памʼяті/диска та допустимого часу простою точок доступу. - Використовувати постійне сховище (WAL): для агентів або шлюзів, де втрата даних під час перезапуску колектора неприпустима, налаштуйте розширення
file_storageдля черги надсилання. - Подумайте про черги повідомлень: Для забезпечення максимальної довговічності в різних сегментах мережі або для розділення рівнів колектора використовуйте керовану чергу повідомлень, наприклад, Kafka, якщо операційні накладні витрати є прийнятними.
- Використовуйте відповідні шаблони розгортання:
- Використовуйте архітектуру агент + шлюз. Агенти відповідають за локальний збір, а шлюзи — за обробку, пакетну передачу та відмовостійкий експорт.
- Зосередьте зусилля щодо відмовостійкості (черги, WAL, Kafka) на мережевих переходах: Агент -> Шлюз і Шлюз -> Бекенд.
- Стійкість між застосунком (SDK) і локальним агентом (Sidecar/DaemonSet) часто менш критична через надійну локальну мережу; додавання черг тут іноді може негативно вплинути на роботу застосунку, якщо агент недоступний.
Розуміючи ці механізми і застосовуючи відповідні конфігурації, ви можете значно підвищити відмовостійкість вашого розгортання OpenTelemetry Collector і звести до мінімуму втрату даних.
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!