Forwarded from Евгений Козлов пишет про IT (Eugene Kozlov)
Прохожу Школу СТО Стратоплана. Часть №2.1. Делегирование.
Обещанный пост с новой порцией конспектов с курса.
———
Самая главная проблема из-за которой нам в принципе сложно что-либо делегировать это отсутствие доверия.
Для того чтобы можно было безопасно делегировать нужно развивать контроллинг - процесс построения инфраструктуры которая позволит нам вместо контроля конкретных задач отслеживать общий статус по процессам департамента / команды.
———
Как реализовывать делегирование? - через процессы (четкие инструкции, четкие критерии результата, возможность контроля, принятие важных решений в наших руках)
Для того чтобы правильно это выстроить полезен подход RACI, его цель — разграничить ответственности участников процесса через четыре ключевые роли:
- кто выполняет (Responsible) — один или несколько сотрудников, которые занимаются непосредственно работой;
- кто утверждает (Accountable) — ответственный за итог, может не только принимать работу, но и исполнять её вместе с R;
- кто консультирует (Consulted) — советчик по процессам;
- кто информирован (Informed) — заинтересованные лица, которые хотят получать информацию по проекту.
Если приводить примеры инструментов руководителя для реализации делегирования то это в основном 4 штуки:
- Правила и инструкции
- Наличие в процессе обязательного финального аппрува от нас.
- Любые необходимые для реализации процесса метрики и KPI.
———
Какой еще вариант делегирование доступен нам? - делегирование через бюджеты.
"Делегирование через бюджет" — это управленческий подход, при котором руководитель не просто поручает задачи, но и передаёт подчинённому (или команде) ответственность за принятие решений в рамках определённого бюджета. Это своего рода делегирование полномочий с финансовыми рамками.
———
Метрики - основной инструмент руководителя. Без них просто невозможно отслеживать изменения и руководить командами отделами и департаментами. Их довольно много и зависят от того какие конкретно инструменты в компании используются (например Kanban или Scrum). Верхнеуровнено важно отслеживать метрики по PMBOK (про бюджеты, сроки, стоимость).
Хороший пример фреймворка который отслеживает удовлетворенность пользователей - HEART Framework
Дополнительные ссылки:
- Kanban Metrics
- Scrum Metrics
- Метрики продукта
Обещанный пост с новой порцией конспектов с курса.
———
Самая главная проблема из-за которой нам в принципе сложно что-либо делегировать это отсутствие доверия.
Для того чтобы можно было безопасно делегировать нужно развивать контроллинг - процесс построения инфраструктуры которая позволит нам вместо контроля конкретных задач отслеживать общий статус по процессам департамента / команды.
———
Как реализовывать делегирование? - через процессы (четкие инструкции, четкие критерии результата, возможность контроля, принятие важных решений в наших руках)
Для того чтобы правильно это выстроить полезен подход RACI, его цель — разграничить ответственности участников процесса через четыре ключевые роли:
- кто выполняет (Responsible) — один или несколько сотрудников, которые занимаются непосредственно работой;
- кто утверждает (Accountable) — ответственный за итог, может не только принимать работу, но и исполнять её вместе с R;
- кто консультирует (Consulted) — советчик по процессам;
- кто информирован (Informed) — заинтересованные лица, которые хотят получать информацию по проекту.
Если приводить примеры инструментов руководителя для реализации делегирования то это в основном 4 штуки:
- Правила и инструкции
- Наличие в процессе обязательного финального аппрува от нас.
- Любые необходимые для реализации процесса метрики и KPI.
———
Какой еще вариант делегирование доступен нам? - делегирование через бюджеты.
"Делегирование через бюджет" — это управленческий подход, при котором руководитель не просто поручает задачи, но и передаёт подчинённому (или команде) ответственность за принятие решений в рамках определённого бюджета. Это своего рода делегирование полномочий с финансовыми рамками.
———
Метрики - основной инструмент руководителя. Без них просто невозможно отслеживать изменения и руководить командами отделами и департаментами. Их довольно много и зависят от того какие конкретно инструменты в компании используются (например Kanban или Scrum). Верхнеуровнено важно отслеживать метрики по PMBOK (про бюджеты, сроки, стоимость).
Хороший пример фреймворка который отслеживает удовлетворенность пользователей - HEART Framework
Дополнительные ссылки:
- Kanban Metrics
- Scrum Metrics
- Метрики продукта
👎5
Forwarded from Евгений Козлов пишет про IT (Eugene Kozlov)
Решил сделать перерыв от высоких менеджерских материй и попостить простой годноты, которую встречаю в day by day работе.
Сегодняшний лот - статья с подробнейшим разбором такого понятия как CPU Throttling.
Под катом:
- Что такое CPU Throttling, какое влияние оказывает на сервис под нагрузкой?
- Как в K8s работают CPU limits?
- Как можно столкнуться с CPU Throttling на примере Golang?
- K8s limits, requests + GOMAXPROCS
- Milliseconds vs Cores, что будет если установить программе в K8s лимиты < 1?
Очень советую к прочтению, если не сталкивались, это важная и полезная база. И, конечно, проверьте дашборды сервисов на наличие панелек с индикаторами троттлинга, нужная штука при разборе инцидентов.
https://kanishk.io/posts/cpu-throttling-in-containerized-go-apps/
-----
Делитесь в комментариях своим опытом связанным с CPU нагрузками, где и чего оптимизировали, как избавлялись от троттлинга сервисов?😊
Сегодняшний лот - статья с подробнейшим разбором такого понятия как CPU Throttling.
Под катом:
- Что такое CPU Throttling, какое влияние оказывает на сервис под нагрузкой?
- Как в K8s работают CPU limits?
- Как можно столкнуться с CPU Throttling на примере Golang?
- K8s limits, requests + GOMAXPROCS
- Milliseconds vs Cores, что будет если установить программе в K8s лимиты < 1?
Очень советую к прочтению, если не сталкивались, это важная и полезная база. И, конечно, проверьте дашборды сервисов на наличие панелек с индикаторами троттлинга, нужная штука при разборе инцидентов.
https://kanishk.io/posts/cpu-throttling-in-containerized-go-apps/
-----
Делитесь в комментариях своим опытом связанным с CPU нагрузками, где и чего оптимизировали, как избавлялись от троттлинга сервисов?😊
Forwarded from Sysadmin Tools 🇺🇦
Prometheus: How We Slashed Memory Usage
https://devoriales.com/post/384/prometheus-how-we-slashed-memory-usage
#prometheus #monitoring #observability
https://devoriales.com/post/384/prometheus-how-we-slashed-memory-usage
#prometheus #monitoring #observability
Forwarded from Мониторим ИТ
Prometheus Monitoring: Functions, Subqueries, Operators, and Modifiers
Статья из блога VictoriaMetrics о функциях, подзапросах, операторах и модификаторах.
Статья из блога VictoriaMetrics о функциях, подзапросах, операторах и модификаторах.
👍1
Forwarded from DevOps
⚡️ Composerize — мгновенное преобразование docker run в docker-compose. Composerize решает проблему нечитаемых строк с десятками флагов одним движением — конвертирует запуск контейнера через CLI в аккуратный
Инструмент доступен как, так и npm-пакет. Под капотом — парсинг флагов с их корректным переносом в YAML-структуру. Проект особенно удобен, когда нужно интегрировать новый сервис в существующий стек: Composerize умеет мержить конфиги, поддерживает разные версии Compose и даже настраивает отступы.
🤖 GitHub
@DevopsDocker
compose.yaml.
Инструмент доступен как, так и npm-пакет. Под капотом — парсинг флагов с их корректным переносом в YAML-структуру. Проект особенно удобен, когда нужно интегрировать новый сервис в существующий стек: Composerize умеет мержить конфиги, поддерживает разные версии Compose и даже настраивает отступы.
🤖 GitHub
@DevopsDocker
👍6👎4❤1
Исследование состояния DevOps в России 2025
Дорогие друзья, мы рады сообщить, что «Экспресс 42» при поддержке генеральных партнеров запустила ежегодное исследование состояния DevOps 2025! Мы планируем опросить больше 4000 представителей индустрии, связанных с DevOps: инженеров, разработчиков, администраторов, тестировщиков, техлидов и тимлидов, CIO и CTO.
Если тема DevOps вам не безразлична — пройдите опрос и внесите свой вклад в развитие индустрии. Важно мнение каждого респондента!
📊 Ключевой темой исследования в 2025 году становится Developer Experience (DX) — то, насколько опыт разработчиков влияет на эффективность команд и успех компании.
🎁 По завершении опроса вы сможете поучаствовать в лотерее с розыгрышем классных призов от организатора исследования и генеральных партнёров.
Заполнить анкету 👉 по ссылке
Дорогие друзья, мы рады сообщить, что «Экспресс 42» при поддержке генеральных партнеров запустила ежегодное исследование состояния DevOps 2025! Мы планируем опросить больше 4000 представителей индустрии, связанных с DevOps: инженеров, разработчиков, администраторов, тестировщиков, техлидов и тимлидов, CIO и CTO.
Если тема DevOps вам не безразлична — пройдите опрос и внесите свой вклад в развитие индустрии. Важно мнение каждого респондента!
📊 Ключевой темой исследования в 2025 году становится Developer Experience (DX) — то, насколько опыт разработчиков влияет на эффективность команд и успех компании.
🎁 По завершении опроса вы сможете поучаствовать в лотерее с розыгрышем классных призов от организатора исследования и генеральных партнёров.
Заполнить анкету 👉 по ссылке
👎2
Forwarded from Человек и машина
#машины_разное
Рассказал на Tech Internals Conf, он же англоязычная вариация Highload++, про миграции API.
Рекомендуется к просмотру аудитории любой степени подготовки.
Рассказал на Tech Internals Conf, он же англоязычная вариация Highload++, про миграции API.
Рекомендуется к просмотру аудитории любой степени подготовки.
YouTube
Migrations at Scale / Karen Tovmasyan (Uber)
What happens when your internal API becomes too outdated or complex to maintain? In this talk, you’ll learn how to safely and reliably migrate large volumes of internal API consumers — even when your system has evolved organically with legacy baggage. Discover…
Forwarded from Мониторим ИТ
The Lost Fourth Pillar of Observability - Config Data Monitoring
Уже много было написано о журналах, метриках и трассировках, они действительно являются ключевыми компонентами в наблюдаемости, мониторинге приложений и систем. Однако, часто упускают из виду данные конфигурации и их наблюдаемость. В этой статье рассмотрено, что такое данные конфигурации, чем они отличаются от журналов, метрик и трассировок, и обсуждается, какая архитектура необходима для хранения этого типа данных и в каких сценариях она представляет ценность. Читать дальше.
Уже много было написано о журналах, метриках и трассировках, они действительно являются ключевыми компонентами в наблюдаемости, мониторинге приложений и систем. Однако, часто упускают из виду данные конфигурации и их наблюдаемость. В этой статье рассмотрено, что такое данные конфигурации, чем они отличаются от журналов, метрик и трассировок, и обсуждается, какая архитектура необходима для хранения этого типа данных и в каких сценариях она представляет ценность. Читать дальше.
Forwarded from Go Library
nerdlog
https://github.com/dimonomid/nerdlog
Nerdlog is a fast, remote-first, multi-host TUI log viewer with timeline histogram and no central server. Loosely inspired by Graylog/Kibana, but without the bloat. Pretty much no setup needed, either.
https://github.com/dimonomid/nerdlog
Forwarded from DevOps
This media is not supported in your browser
VIEW IN TELEGRAM
🍏 Apple внезапно выпустила свой аналог Docker — и почти никто не заметил
Сразу после WWDC Apple тихо выложила новый проект —
Что важно:
● Написан на Swift и оптимизирован под Apple Silicon
● Использует собственный механизм контейнеризации и лёгкие виртуалки
● Поддерживает стандартные OCI-образы (совместим с Docker/Podman)
Полезный и нативный способ запускать контейнеры прямо на Mac.
Наконец‑то альтернатива Docker, сделанная самими Apple.
📦 Два пакета:
1. `containerization` — низкоуровневый API:
• управление образами,
• загрузка из репозиториев,
• создание Ext4 rootFS,
• запуск изолированных процессов в vminitd.
2. `container` — высокоуровневый инструмент в стиле Docker:
• команды для запуска, остановки и управления,
• интеграция с launchd.
⚡️ Быстрый запуск VM (<1 сек) достигается за счёт оптимизированного ядра и init-системы vminitd. Обмен с VM происходит через gRPC поверх vsock.
📌 Совместимость:
• Работает в macOS 15 и новее, но рекомендуется macOS 15.6 Beta 1 — только там:
• корректно работает с сетями,
• поддерживается IP-перевязка.
• Только Apple Silicon (Intel — не поддерживается).
• Поддержка Rosetta 2 позволяет запускать x86-контейнеры.
🔓 Инструмент уже доступен на GitHub и открыт для разработчиков.
container system start
➡️ Гайд по работе
Сразу после WWDC Apple тихо выложила новый проект —
container
. Это инструмент для создания и запуска Linux-контейнеров на macOS.Что важно:
● Написан на Swift и оптимизирован под Apple Silicon
● Использует собственный механизм контейнеризации и лёгкие виртуалки
● Поддерживает стандартные OCI-образы (совместим с Docker/Podman)
Полезный и нативный способ запускать контейнеры прямо на Mac.
Наконец‑то альтернатива Docker, сделанная самими Apple.
📦 Два пакета:
1. `containerization` — низкоуровневый API:
• управление образами,
• загрузка из репозиториев,
• создание Ext4 rootFS,
• запуск изолированных процессов в vminitd.
2. `container` — высокоуровневый инструмент в стиле Docker:
• команды для запуска, остановки и управления,
• интеграция с launchd.
⚡️ Быстрый запуск VM (<1 сек) достигается за счёт оптимизированного ядра и init-системы vminitd. Обмен с VM происходит через gRPC поверх vsock.
📌 Совместимость:
• Работает в macOS 15 и новее, но рекомендуется macOS 15.6 Beta 1 — только там:
• корректно работает с сетями,
• поддерживается IP-перевязка.
• Только Apple Silicon (Intel — не поддерживается).
• Поддержка Rosetta 2 позволяет запускать x86-контейнеры.
🔓 Инструмент уже доступен на GitHub и открыт для разработчиков.
container system start
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3👎1
Forwarded from запуск завтра
Гугл опубликовал пост-мортем по позавчерашнему падению. Обычные ошибки, только на инфраструктуре планетарного масштаба.
У них есть внутренний сервис, который проверяет доступы (бабки, квоты и т. д.) перед тем, как API запрос доходит до любого продукта.
Эта программа берет из специальной глобальной базы данных правила, по которым проверяет каждый запрос и отвечает, пропускать его или нет.
В эту программу добавили поддержку нового типа квот. Программист допустил небрежность в новом коде и не проверял, насколько корректно записано это правило в базе, перед тем, как пытаться положить его в память. Обращение к несуществующей памяти — смертный грех, за такое программа мгновенно завершается (если программист не предусмотрел, что такое может случиться, а это не наш случай). При этом я бы не назвал это ошибкой, все мы люди, мы не идеальны и поэтому придумываем механизмы защиты от своей природы. В этом суть инженерного подхода.
Экземпляр этой программы работает в каждом регионе Гугла. Так как это серьезный, ключевой сервис, его выкатывают не во все регионы сразу, а по одному, внимательно отслеживая, не внесли ли программисты новые ошибки.
Более того, весь новый функционал специально помечают и сначала запускают только для внутреннего пользования, чтобы, даже при наличии ошибки, она не задела внешних клиентов. Этот механизм называется фича-флагами.
К сожалению, программист забыл настроить фича-флаги для этого кода. Кусочек программы с ошибкой запустился на всех пользователей сразу. Удивительно, что это не заметили на этапе code review!
Итак, проходит время, и вот программа с ошибкой запущена во всех регионах для всех пользователей. Кто-то добавляет в базу данных новое правило с новым типом квот, с пустым полем. Эта запись в течение десятков миллисекунд копируется во все регионы, и в каждом регионе программа проверки считывает новое правило, пытается обратиться к несуществующей памяти, падает, перезапускается и снова падает.
Тут в дело вступает, на мой взгляд, первая ошибка (а не просто человеческая небрежность) инженеров — система контроля доступа настроена так, что при отсутствии ответа от программы проверок она отклоняет запрос. Так называемый fail closed. Хорошо для замков на банковских сейфах, плохо для пожарных выходов.
В нашем случае система не пропускает ни один запрос.
Дежурные инженеры замечают проблему в течение 2 минут, за 10 минут находят причину (дежурная система и дежурные инженеры у Гугла достойны восхищения) и нажимают большую красную кнопку, которая должна выключить эту часть программы (ее программисты сделали). Ее включение занимает еще 30 минут. (Не понятно, почему этот механизм занимает 30 минут, а не 20 миллисекунд, но движемся дальше).
Система заработала, но из-за того, что она лежала 40 минут, накопилось много желающих отправить запрос еще раз, и они создали эффект толпы, которая набежала и перегрузила остальные соседние сервисы через наш сервис проверок. Оказалось, что он не ждет какое-то время, если нужный сервис отказывается ответить на запрос (для этого есть красивая схема exponential back off), а долбит до упаду, тем самым не давая системе возможности восстановиться. Пришлось руками ограничивать число запросов. На постепенную, ручную разгрузку очередей ушло еще 2 часа.
Ко всему прочему, Гугл час не мог опубликовать уведомление о проблеме, потому что сервис публикации статус-страниц зависит от системы, которая упала.
Как вывод, Гугл обещает пройтись по всем сервисам и убедиться, что они, во-первых, fail open, то есть пропускают запросы, когда падают, во-вторых, реализуют exponential back off, если на их запрос не отвечают, а не добивают лежачего, и, наконец, в-третьих, что даже глобальные добавления правил должны прилетать во все регионы не сразу, а с некоторыми задержками. Ещё обещают добавить эти проверки в свои статические анализаторы кода, завидую!
Первые два пункта можно и нужно использовать в каждом проекте, даже если ты не Гугл.
У них есть внутренний сервис, который проверяет доступы (бабки, квоты и т. д.) перед тем, как API запрос доходит до любого продукта.
Эта программа берет из специальной глобальной базы данных правила, по которым проверяет каждый запрос и отвечает, пропускать его или нет.
В эту программу добавили поддержку нового типа квот. Программист допустил небрежность в новом коде и не проверял, насколько корректно записано это правило в базе, перед тем, как пытаться положить его в память. Обращение к несуществующей памяти — смертный грех, за такое программа мгновенно завершается (если программист не предусмотрел, что такое может случиться, а это не наш случай). При этом я бы не назвал это ошибкой, все мы люди, мы не идеальны и поэтому придумываем механизмы защиты от своей природы. В этом суть инженерного подхода.
Экземпляр этой программы работает в каждом регионе Гугла. Так как это серьезный, ключевой сервис, его выкатывают не во все регионы сразу, а по одному, внимательно отслеживая, не внесли ли программисты новые ошибки.
Более того, весь новый функционал специально помечают и сначала запускают только для внутреннего пользования, чтобы, даже при наличии ошибки, она не задела внешних клиентов. Этот механизм называется фича-флагами.
К сожалению, программист забыл настроить фича-флаги для этого кода. Кусочек программы с ошибкой запустился на всех пользователей сразу. Удивительно, что это не заметили на этапе code review!
Итак, проходит время, и вот программа с ошибкой запущена во всех регионах для всех пользователей. Кто-то добавляет в базу данных новое правило с новым типом квот, с пустым полем. Эта запись в течение десятков миллисекунд копируется во все регионы, и в каждом регионе программа проверки считывает новое правило, пытается обратиться к несуществующей памяти, падает, перезапускается и снова падает.
Тут в дело вступает, на мой взгляд, первая ошибка (а не просто человеческая небрежность) инженеров — система контроля доступа настроена так, что при отсутствии ответа от программы проверок она отклоняет запрос. Так называемый fail closed. Хорошо для замков на банковских сейфах, плохо для пожарных выходов.
В нашем случае система не пропускает ни один запрос.
Дежурные инженеры замечают проблему в течение 2 минут, за 10 минут находят причину (дежурная система и дежурные инженеры у Гугла достойны восхищения) и нажимают большую красную кнопку, которая должна выключить эту часть программы (ее программисты сделали). Ее включение занимает еще 30 минут. (Не понятно, почему этот механизм занимает 30 минут, а не 20 миллисекунд, но движемся дальше).
Система заработала, но из-за того, что она лежала 40 минут, накопилось много желающих отправить запрос еще раз, и они создали эффект толпы, которая набежала и перегрузила остальные соседние сервисы через наш сервис проверок. Оказалось, что он не ждет какое-то время, если нужный сервис отказывается ответить на запрос (для этого есть красивая схема exponential back off), а долбит до упаду, тем самым не давая системе возможности восстановиться. Пришлось руками ограничивать число запросов. На постепенную, ручную разгрузку очередей ушло еще 2 часа.
Ко всему прочему, Гугл час не мог опубликовать уведомление о проблеме, потому что сервис публикации статус-страниц зависит от системы, которая упала.
Как вывод, Гугл обещает пройтись по всем сервисам и убедиться, что они, во-первых, fail open, то есть пропускают запросы, когда падают, во-вторых, реализуют exponential back off, если на их запрос не отвечают, а не добивают лежачего, и, наконец, в-третьих, что даже глобальные добавления правил должны прилетать во все регионы не сразу, а с некоторыми задержками. Ещё обещают добавить эти проверки в свои статические анализаторы кода, завидую!
Первые два пункта можно и нужно использовать в каждом проекте, даже если ты не Гугл.
👍17🔥1
Forwarded from Кубертатный период
Ранее уже писал про шаринг GPU в Kubernetes и репостил про сложности мониторинга. Сейчас наткнулся на более зрелый проект — k8s-vGPU-scheduler, который теперь называется Project HAMi (Heterogeneous AI Computing Virtualization Middleware).
- Time slicing — просто в конфигурации, но нет изоляции и плохо с производительностью.
- MPS — поддерживает параллельные вычисления, но снова нет изоляции.
- MIG — есть изоляция, но нужна статичная конфигурация ноды, и работает только на дорогих картах.
- vGPU — платное, требует виртуализации, не вписывается в kubernetes-native подход.
- Использование vGPU с любым значением памяти
- Гибкая конфигурация нагрузок: тип карты, affinity и т.д.
- Метрики GPU на уровне контейнеров с готовыми дашбордами
- Динамический MIG — без ребутов и статических настроек
- Работает с любыми видеокартами, не только A100
- Поддержка NVLink уже на подходе
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Forwarded from Мониторим ИТ
Terraforming Your Grafana Alerts for Kubernetes Clusters
Дашборды в Grafana не всегда можно удачно затеррарформить, а вот оповещения вполне себе. В этой статье автор разбирает примеры алертинга для кластера Kubernetes.
❗️Статья на medium.com
Дашборды в Grafana не всегда можно удачно затеррарформить, а вот оповещения вполне себе. В этой статье автор разбирает примеры алертинга для кластера Kubernetes.
❗️Статья на medium.com
Forwarded from System Design & Highload (Alexey Rybak)
Прикрутим персистентность - I
Давайте сделаем упражнение в "системном дизайне". Предположим, мы написали простенькое in-memory хранилище, но нас не устраивает, что данные теряются при рестартах, надо прикрутить "сбоку" персистентность. Строгая консистентность вам не очень нужна, но желательна. Как добавить эту персистентность?
Можно делать снепшотирование: fork(), запись на диск. Можно писать лог обновлений на диск (сразу, или нет - в зависимости от требуемых гарантий). Можно использовать комбинированные методы. Давайте обсудим, мне кажется, хорошее упражнение на понимание архитектурной “внутрянки”.
Допустим мы снепшотируемся через fork(). Что происходит сразу же: copy-on-write. Это такая оптимизационная стратегия управления памятью, при которой копирование объекта откладывается до тех пор, пока одна из сторон не попытается его изменить. Если данные не меняются, читаем одно и то же из “пошеренной” страницы. При изменении создаётся копия. Поэтому после fork() ядро дублирует страницу только в тот момент, когда соотвествующий участок памяти обновляется в родительском процессе нашего kv—хранилища: мы же продолжаем принимать апдейты от клиентов.
Если наше kv-хранилище получает апдейтов много, то в самом плохом случае нам может понадобится в два раза больше памяти: ядро при каждом обновлении страницы начнёт создавать копию, а максимальное количество копий даст удвоение по памяти. Именно поэтому для Redis рекомендуется держать свободными десятки (!) процентов памяти, иначе может быть больно - и это абсолютно смешное требования с точки зрения любой “нормальной” СУБД. Буквально несколько недель назад я вот так угандошил кластер Redis на демо, и даже сходу не разобрался почему 🙂
Несмотря на такую прожорливость по памяти, метод снэпшотирования через fork() удобен. Во-первых, он очень простой и программируется левой ногой. Во-вторых, мы получаем консистентный (насколько это возможно в отсутствие транзакций) снэпшот: ведь любой изменение после старта снэпшотирования меняет копию, а не снэпшотируемую страницу. До сих пор Redis снэпшотировались именно так (чуть сложнее, но полный снэпшот всё равно делается, и это происходит через fork()).
Про остальные методы прикручивания персистентности напишу позже.
——
Учись, пока AI тебя не заменил: Производительность и наблюдаемость бэкенда (3 июня), Redis и Valkey: от основ к хайлоаду (9 июня)
Давайте сделаем упражнение в "системном дизайне". Предположим, мы написали простенькое in-memory хранилище, но нас не устраивает, что данные теряются при рестартах, надо прикрутить "сбоку" персистентность. Строгая консистентность вам не очень нужна, но желательна. Как добавить эту персистентность?
Можно делать снепшотирование: fork(), запись на диск. Можно писать лог обновлений на диск (сразу, или нет - в зависимости от требуемых гарантий). Можно использовать комбинированные методы. Давайте обсудим, мне кажется, хорошее упражнение на понимание архитектурной “внутрянки”.
Допустим мы снепшотируемся через fork(). Что происходит сразу же: copy-on-write. Это такая оптимизационная стратегия управления памятью, при которой копирование объекта откладывается до тех пор, пока одна из сторон не попытается его изменить. Если данные не меняются, читаем одно и то же из “пошеренной” страницы. При изменении создаётся копия. Поэтому после fork() ядро дублирует страницу только в тот момент, когда соотвествующий участок памяти обновляется в родительском процессе нашего kv—хранилища: мы же продолжаем принимать апдейты от клиентов.
Если наше kv-хранилище получает апдейтов много, то в самом плохом случае нам может понадобится в два раза больше памяти: ядро при каждом обновлении страницы начнёт создавать копию, а максимальное количество копий даст удвоение по памяти. Именно поэтому для Redis рекомендуется держать свободными десятки (!) процентов памяти, иначе может быть больно - и это абсолютно смешное требования с точки зрения любой “нормальной” СУБД. Буквально несколько недель назад я вот так угандошил кластер Redis на демо, и даже сходу не разобрался почему 🙂
Несмотря на такую прожорливость по памяти, метод снэпшотирования через fork() удобен. Во-первых, он очень простой и программируется левой ногой. Во-вторых, мы получаем консистентный (насколько это возможно в отсутствие транзакций) снэпшот: ведь любой изменение после старта снэпшотирования меняет копию, а не снэпшотируемую страницу. До сих пор Redis снэпшотировались именно так (чуть сложнее, но полный снэпшот всё равно делается, и это происходит через fork()).
Про остальные методы прикручивания персистентности напишу позже.
——
Учись, пока AI тебя не заменил: Производительность и наблюдаемость бэкенда (3 июня), Redis и Valkey: от основ к хайлоаду (9 июня)
👍3
Forwarded from DevOps FM
#devops #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Forwarded from DevOps
digital-periodic-table-of-devsecops.png
615.1 KB
Полезная таблица инструментов DevSecOps
Если ты учишься с нуля, устраняешь пробелы или заменяешь существующие инструменты, начни с Периодической таблицы, чтобы подобрать оптимальные решения для своей DevOps-пайплайна.
#devops #девопс
@devopsitsec
Если ты учишься с нуля, устраняешь пробелы или заменяешь существующие инструменты, начни с Периодической таблицы, чтобы подобрать оптимальные решения для своей DevOps-пайплайна.
#devops #девопс
@devopsitsec
Forwarded from Человек и машина
#машины_разное
Я думаю, все и так достаточно рассосали падение Гугла, поэтому давайте расскажу в нескольких постах подробнее про feature flag’и, и какие у них есть полезности.
Из очевидного - безопасность сервиса. Представьте себе мечтуАндрея Синицы DevOps и SRE любителей, где в секунду выкатываются десятки изменений.
Если в релизный цикл попадет баг, и нужно будет откатиться, то вы откатите не только свое изменение, но и другие (а там могли быть критические фиксы!), и будете делать это долго: плохие экземпляры потуши, старые релизные подними, трафик перенаправь, а если это делается глобально, то и сам релиз откатываться начнет не сразу (смотря как быстро алерт сработает), да и возвращаться будет долго.
В целом запуск бинаря в контейнере даже в самых современных оркестрациях занимает десятки секунд, что непростительно много, а даже самый чуткий алерт выстрелит в лучшем случае через минуту.
С флагами вы можете спокойно донести баговое решение до прода и спать крепко - до тех пор, пока флаг неактивен, плохой код исполняться не будет.
Более того, выкатку флага тоже можно и нужно контролировать с таким же усердием, как и сам релиз. Например, повесить на флаг те же алерты, что и на сервис, включить флаг для 1% запросов в canary, и смотреть как та пищит. Если у нас выстрелил алерт по SLO доступности, то дело скорее всего в фиче, и система выкатки так же умно его откатит назад.
Инженеру остается проанализировать логи, написать фикс и повторить итерацию.
Позже расскажу про как флаги позволяют контролировать выполнение кода, но пока поспекулирую, что флаги пропускают либо когда очень спешат (а в нынешней экономике все очень спешат), либо когда риск изменения низкий. А ваш покорный прилично инцидентов просмотрел, триггерами которых являлись «низкорисковые» изменения. :)
Я думаю, все и так достаточно рассосали падение Гугла, поэтому давайте расскажу в нескольких постах подробнее про feature flag’и, и какие у них есть полезности.
Из очевидного - безопасность сервиса. Представьте себе мечту
Если в релизный цикл попадет баг, и нужно будет откатиться, то вы откатите не только свое изменение, но и другие (а там могли быть критические фиксы!), и будете делать это долго: плохие экземпляры потуши, старые релизные подними, трафик перенаправь, а если это делается глобально, то и сам релиз откатываться начнет не сразу (смотря как быстро алерт сработает), да и возвращаться будет долго.
В целом запуск бинаря в контейнере даже в самых современных оркестрациях занимает десятки секунд, что непростительно много, а даже самый чуткий алерт выстрелит в лучшем случае через минуту.
С флагами вы можете спокойно донести баговое решение до прода и спать крепко - до тех пор, пока флаг неактивен, плохой код исполняться не будет.
Более того, выкатку флага тоже можно и нужно контролировать с таким же усердием, как и сам релиз. Например, повесить на флаг те же алерты, что и на сервис, включить флаг для 1% запросов в canary, и смотреть как та пищит. Если у нас выстрелил алерт по SLO доступности, то дело скорее всего в фиче, и система выкатки так же умно его откатит назад.
Инженеру остается проанализировать логи, написать фикс и повторить итерацию.
Позже расскажу про как флаги позволяют контролировать выполнение кода, но пока поспекулирую, что флаги пропускают либо когда очень спешат (а в нынешней экономике все очень спешат), либо когда риск изменения низкий. А ваш покорный прилично инцидентов просмотрел, триггерами которых являлись «низкорисковые» изменения. :)
Forwarded from Человек и машина
#машины_разное
Само понятие «флаг» может произвести впечатление, что это какой-то тумблер «вкл/выкл», который захотел включил, захотел выключил.
Самый простой флажок будет выглядеть именно так, но ✨настоящая магия ✨ прячется за условиями выполнения, которые могут быть статическими и динамическими! Давайте на примере расскажу про Configuration Driven Development (далее CDD).
Итак, у нас есть флаг и есть часть кода, где мы спрашиваем значение флага. Флаг всегда возвращает «да» или «нет» или строку с числом, но логика внутри флага может быть умнее.
Самый простой флаг, который определяет какой адрес базы дать на базе энва будет таким псевдокодом на YAML:
Опытный инженер увидит подозрительное default, которое может нагнать страх, и этот страх вполне оправдан. Выбирая между «передаем по умолчанию прод, и возможно не тот енв получит доступ» и «передаем null, и приложение упадет», я бы выбралвторо- исходя из ситуации.
А что если нам нужно обслуживать тестовый трафик в промышленной среде? Тогда можно опираться на заголовки запроса и обогатить нашу логику.
А что, если нам нужно обеспечить теневой трафик, который живет в рамках теста, но нуждается в "живых" данных? Тогда можно использовать использовать логическое умножение:
Тут вы наверняка скажите: «Карен, ты упоролся, connection string к базе инициализируется на старте приложения, а ты предлагаешь это делать на каждый запрос?!», а я вам отвечу: «Не душните, взял самый наглядный пример, чтоб всем было понятно!»
У CDD очевидно есть и бизнес применение, например решать в какой PSP передать платеж на базе параметров платежного поручения. Представьте себе такое:
Количество таких параметров ограничивается вашей фантазией, а вы на базе десятков таких конфигураций сделали самый что ни на есть платежный маршрутизатор! Причем новые маршруты можно добавлять не трогая приложение вообще.
Я не зря оговорился о разношерстных параметрах, ведь диверсификация параметров это необходимая составляющая экспериментов!
У вас бывало такое, что вы запускаете любое мобильное приложение, а оно ПОЧЕМУ-ТО ведет себя иначе? А потом точно так же ПОЧЕМУ-ТО ведет себя как раньше?
Это означает, что вы попали под эксперимент. Эксперименты это целые наборы флагов, которые принимают в качестве параметров… да вообще что угодно, от страны и устройства до пола, возраста, и последних 10 пролайканных фоток. Эксперименты проверяют жизнеспособность фич и их полезность, поэтому ставятся на длительный период и измеряют бизнес метрики навроде конверсии. Если цифры идут вверх, расширяем поле экспериментов дальше, пока не уйдем на 100%.
Платформа экспериментации - красивая обертка над системой конфигураций, feature flag’ов, мониторинга и механизмов раскатки, и стоит на вооружении у всех больших дядечек и тетечек.
В следующем посте постараюсь собрать для вас подходящие инструменты, с которыми вы можете использовать feature flag’и с минимальным ущербом для здоровья.
Само понятие «флаг» может произвести впечатление, что это какой-то тумблер «вкл/выкл», который захотел включил, захотел выключил.
Самый простой флажок будет выглядеть именно так, но ✨настоящая магия ✨ прячется за условиями выполнения, которые могут быть статическими и динамическими! Давайте на примере расскажу про Configuration Driven Development (далее CDD).
Итак, у нас есть флаг и есть часть кода, где мы спрашиваем значение флага. Флаг всегда возвращает «да» или «нет» или строку с числом, но логика внутри флага может быть умнее.
Самый простой флаг, который определяет какой адрес базы дать на базе энва будет таким псевдокодом на YAML:
default: prod-db
flags:
- test:
if:
- env = testing
then: test-db
- prod:
if:
- env = production
then: prod-db
Опытный инженер увидит подозрительное default, которое может нагнать страх, и этот страх вполне оправдан. Выбирая между «передаем по умолчанию прод, и возможно не тот енв получит доступ» и «передаем null, и приложение упадет», я бы выбрал
А что если нам нужно обслуживать тестовый трафик в промышленной среде? Тогда можно опираться на заголовки запроса и обогатить нашу логику.
default: prod-db
flags:
- test:
if-one-of:
- env = testing
- req-tenancy = test
then: test-db
- prod:
if-one-of:
- env = production
- req-tenancy = prod
then: prod-db
А что, если нам нужно обеспечить теневой трафик, который живет в рамках теста, но нуждается в "живых" данных? Тогда можно использовать использовать логическое умножение:
default: prod-db
flags:
- shadow:
if-all-of:
- env = testing
- req-tenancy = shadow
then: prod-db
Тут вы наверняка скажите: «Карен, ты упоролся, connection string к базе инициализируется на старте приложения, а ты предлагаешь это делать на каждый запрос?!», а я вам отвечу: «Не душните, взял самый наглядный пример, чтоб всем было понятно!»
У CDD очевидно есть и бизнес применение, например решать в какой PSP передать платеж на базе параметров платежного поручения. Представьте себе такое:
flags:
- dest1:
if-all-of:
- country-code = BR
- payment-method = payment_card
- card-type = debit
then: psp1
Количество таких параметров ограничивается вашей фантазией, а вы на базе десятков таких конфигураций сделали самый что ни на есть платежный маршрутизатор! Причем новые маршруты можно добавлять не трогая приложение вообще.
Я не зря оговорился о разношерстных параметрах, ведь диверсификация параметров это необходимая составляющая экспериментов!
У вас бывало такое, что вы запускаете любое мобильное приложение, а оно ПОЧЕМУ-ТО ведет себя иначе? А потом точно так же ПОЧЕМУ-ТО ведет себя как раньше?
Это означает, что вы попали под эксперимент. Эксперименты это целые наборы флагов, которые принимают в качестве параметров… да вообще что угодно, от страны и устройства до пола, возраста, и последних 10 пролайканных фоток. Эксперименты проверяют жизнеспособность фич и их полезность, поэтому ставятся на длительный период и измеряют бизнес метрики навроде конверсии. Если цифры идут вверх, расширяем поле экспериментов дальше, пока не уйдем на 100%.
Платформа экспериментации - красивая обертка над системой конфигураций, feature flag’ов, мониторинга и механизмов раскатки, и стоит на вооружении у всех больших дядечек и тетечек.
В следующем посте постараюсь собрать для вас подходящие инструменты, с которыми вы можете использовать feature flag’и с минимальным ущербом для здоровья.
👍2🔥1
Forwarded from DevOps Deflope News
Подборка, в которой мы хотим поделиться новыми тулами из мира Kubernetes. Тут Portainer запустила дистрибутив для 200 МБ RAM, k0s попал в CNCF Sandbox, а новые инструменты упрощают управление мультикластерными средами. Смотрите сами.
Портативный Kubernetes для минимальных ресурсов
Portainer представила KubeSolo — ультралегковесный дистрибутив Kubernetes, который работает всего с 200 МБ RAM. Без кластеризации и etcd, идеально подходит для ограниченных сред.
Мультикластерное управление
kubectl-foreach позволяет выполнять kubectl-команды параллельно в нескольких кластерах одновременно.
k0s присоединился к CNCF Sandbox
Легковесный дистрибутив Kubernetes от Mirantis получил официальное признание в CNCF. k0s выделяется единым бинарным файлом со всеми компонентами Kubernetes, а ещё он подходит для edge-вычислений и ресурсоограниченных сред.
Редакция ждёт появления Kubernetes в чайниках и стиральных машинах, уж слишком много портативных куберов появилось. Ну а если серьёзно, то уже очевидно, что стандарт поставки в Kubernetes уже совсем стандарт, а станут ли его использовать в портативных устройствах — узнаем в течение нескольких лет.
Портативный Kubernetes для минимальных ресурсов
Portainer представила KubeSolo — ультралегковесный дистрибутив Kubernetes, который работает всего с 200 МБ RAM. Без кластеризации и etcd, идеально подходит для ограниченных сред.
Мультикластерное управление
kubectl-foreach позволяет выполнять kubectl-команды параллельно в нескольких кластерах одновременно.
k0s присоединился к CNCF Sandbox
Легковесный дистрибутив Kubernetes от Mirantis получил официальное признание в CNCF. k0s выделяется единым бинарным файлом со всеми компонентами Kubernetes, а ещё он подходит для edge-вычислений и ресурсоограниченных сред.
Редакция ждёт появления Kubernetes в чайниках и стиральных машинах, уж слишком много портативных куберов появилось. Ну а если серьёзно, то уже очевидно, что стандарт поставки в Kubernetes уже совсем стандарт, а станут ли его использовать в портативных устройствах — узнаем в течение нескольких лет.
👍4❤1
Forwarded from /usr/bin
Как работает DNS в Linux. Часть 1: от getaddrinfo до resolv.conf
Когда мы вводим в браузере имя сервера или доменное имя сайта, выполняем ping или запускаем любое удаленное приложение, операционная система должна преобразовать указанные имена в IP-адреса. Этот процесс называется разрешением доменного имени. На первый взгляд он может показаться весьма прозрачным, однако за ним скрывается многослойный механизм.
Данная статья — начало серии, посвященной низкоуровневой архитектуре разрешения имен. Поговорим о том, как устроен этот процесс в Linux на уровне ядра, различных библиотек C и системных вызовов.
Когда мы вводим в браузере имя сервера или доменное имя сайта, выполняем ping или запускаем любое удаленное приложение, операционная система должна преобразовать указанные имена в IP-адреса. Этот процесс называется разрешением доменного имени. На первый взгляд он может показаться весьма прозрачным, однако за ним скрывается многослойный механизм.
Данная статья — начало серии, посвященной низкоуровневой архитектуре разрешения имен. Поговорим о том, как устроен этот процесс в Linux на уровне ядра, различных библиотек C и системных вызовов.
👍3