Upload
dmitry-samsonov
View
110
Download
1
Embed Size (px)
Citation preview
Как не положить тысячи серверов с помощью системы
централизованного управления конфигурацией на примере
CFEngine
Дмитрий Самсонов
Дмитрий СамсоновВедущий системный администратор в OK.RU
Компетенция:
● Zabbix
● CFEngine
● Linux tuning
https://www.linkedin.com/in/dmitrysamsonov
Одноклассники>11000 серверов
>150 приложений
>600 кластеров
РазоблачениеЯ предвзят
РазоблачениеЯ предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
РазоблачениеЯ предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
CFEngine не лидер и не аутсайдер рынка
РазоблачениеЯ предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
CFEngine не лидер и не аутсайдер рынка
Я не буду сравнивать configuration management на сегодняшний день
РазоблачениеЯ предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
CFEngine не лидер и не аутсайдер рынка
Я не буду сравнивать configuration management на сегодняшний день
У меня есть опыт использования только CFEngine и Ansible
Классические средства конфигурации
● ssh + scp + winexe
Классические средства конфигурации
● ssh + scp + winexe● dssh-command + dscp + dwinexe-command
Классические средства конфигурации
● ssh + scp + winexe● dssh-command + dscp + dwinexe-command● Образ OS (регулярные обновления)
dssh-command# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"
dssh-command# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"How much is 5 + 8 =
dssh-command# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"How much is 5 + 8 =
50, 100, 200...
dssh-command# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"How much is 5 + 8 = 13Correctsrvd1352:O:0:srvd1352
dssh-command# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"How much is 5 + 8 = 13Correctsrvd1352:O:0:srvd1352Executing: "hostname"Do you want to execute the command on servers in DL? [Yes/No]: Yessrvd1353:O:0:srvd1353
dssh-command# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"How much is 5 + 8 = 13Correctsrvd1352:O:0:srvd1352Executing: "hostname"Do you want to execute the command on servers in DL? [Yes/No]: Yessrvd1353:O:0:srvd1353Executing: "hostname"Do you want to execute the command on servers in M100? [Yes/no]: Yessrve1993:O:0:srve1993srve2765:O:0:srve2765...Full output saved in /tmp/dsshFullOutput_29606_2016-10-14_13-17.log file.
Сервера настроены неправильно
Как мы выбирали и что выбрали в 2012● Интеграция с CMDB● Установка пакетов● Работа с файлами (копирование/редактирование/атрибуты)● Контроль файлов (содержимое/атрибуты)● Управление процессами и сервисами● Ручной запуск политик● Контроль версий, логирование изменений, отчеты● Масштабирование, резервирование● Поддержка Linux и Windows● Проверка на наличие серверов без работающего CM
Как мы выбирали и что выбрали в 2012
● Производительность
Производительность
3000 клиентов
Как мы выбирали и что выбрали в 2012
● Производительность
● Зрелость
Современная история CM“A theory of configuration maintenance was worked out by Mark Burgess with a practical implementation on present day computer systems in the software CFEngine able to perform real time repair as well as preventive maintenance.”
https://en.wikipedia.org/wiki/Configuration_management#Operating_System_configuration_management
Как мы выбирали и что выбрали в 2012
● Зрелость
● Производительность
● Популярность
Популярность CM
CFEngine в Одноклассниках
CFEngine может быть простым
Типичная политика настройки приложения
"app_ok_feed" or => {"cmdb_group_feeds_proxy", “cmdb_group_feeds_cache};...bundle agent app_ok_feed{ vars: "application" string => "ok-feed"; methods: "app_ok" usebundle => app_ok("$(application)");}
Библиотека настройки приложенийbundle agent app_ok(application){ vars: "file[/ok/bin/$(application)][policy]" string => "copy"; "file[/ok/bin/$(application)][mode]" string => "0755";
"file[/ok/conf/$(application).conf][policy]" string => "copy";
"file[/root/ok/ok.properties][policy]" string => "edit"; "file[/root/ok/ok.properties][suffix]" string => "$(application)"; "file[/root/ok/ok.properties][type]" string => "file";
methods: "files" usebundle => files_manage("$(this.bundle).file");}
CFEngine может быть простым в использовании
Добавить пользователя:"user[git][policy]" string => "add";
Запустить сервис:"service[mysql][policy]" string => "start";
Добавить крон:"cron[do_well][cron]" string => "* * * * * do_well";
Установить пакет:"package[rsyslog][policy]" string => "add";
Количество политик по типам
Библиотека
Служебные
Приложения
Возможно всё!● IP routes
● HW RAID Write cache
● SELinux
● IPMI SOL
● Kernel modules
● RSS/RPS/RFS
Чем он нам не нравится● Высокий порог вхождения
Чем он нам не нравится● Высокий порог вхождения
● Сильно отстаёт от конкурентов
Чем он нам не нравится● Высокий порог вхождения
● Сильно отстаёт от конкурентов
● Нет возможности расширять функционал
Чем он нам не нравится● Высокий порог вхождения
● Сильно отстаёт от конкурентов
● Нет возможности расширять функционал
● Плохие шаблоны
Чем примечательна дата4 апреля?
“В одну тихую весеннюю ночь, а именно с 4-го на 5-ое апреля 2013-го года, ничто не предвещало беды — юзеры непринуждённо общались, грузили и комментили фоточки, и собирали урожай, как вдруг всё ё***лось, и что, с**а, характерно, обратно не поднялось. Ни через час, ни через два, ни через три. И даже не через 20 часов! … Что это за централизованная система управления, которая лёгким движением руки позволяет отправить несколько тысяч серверов в /dev/null, знают только её разработчики…”
https://lurkmore.to/Одноклассники
Можно ли было избежать?● Проверка синаксиса● Тестовые окружения● Ревью● Мониторинг ошибок
CFEngine по-прежнему работает постоянно и проверяет политики
каждые 5 минут
Как мы работаем1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
GIT hooks
● Проверка синтаксиса
GIT hooks
● Проверка синтаксиса
● Автокоррекция стиля
GIT hooks
● Проверка синтаксиса
● Автокоррекция стиля
● Автозаполнение и проверка commit message
Как мы работаем1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
Проверка в тестовом окружении
● Unstable - виртуалки
Проверка в тестовом окружении
● Unstable - виртуалки
● Testing - физические сервера
Как мы работаем1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
Stable● Прод сервера
Stable● Прод сервера● От каждого нового кластера
берётся один сервер
Stable● Прод сервера● От каждого нового кластера
берётся один сервер● Все варианты железа и
приложений
Stable● Прод сервера● От каждого нового кластера
берётся один сервер● Все варианты железа и
приложений● Потеря прозрачна для
пользователей
Stable● Прод сервера● От каждого нового кластера
берётся один сервер● Все варианты железа и
приложений● Потеря прозрачна для
пользователей● Обновления плавно в течение
одного часа
Stable● Прод сервера● От каждого нового кластера
берётся один сервер● Все варианты железа и
приложений● Потеря прозрачна для
пользователей● Обновления плавно в течение
одного часа● Для серверов автоматически
контролируется нагрузка
Как мы работаем1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
РевьюРевью политики:
1. Соблюдение style guide (большая часть проверяется pre-commit хуком в git)2. “Адекватность” кода3. Использование последних версий методов4. …
РевьюСоблюдение всех условий для продвижения в прод:
1. Нет ошибок выполнения2. Нет проблем с нагрузкой3. “Промариновалось”
Ещё пара слов про ревью
● Исключение - инциденты!
Ещё пара слов про ревью
● Исключение - инциденты!● Кто ревьювит?
Как мы работаем1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
Production
● Поделен на независимые части
Production
● Поделен на независимые части
● Каждая часть применяет изменения равномерно в течение часа
Production
● Поделен на независимые части
● Каждая часть применяет изменения равномерно в течение часа
● Обновления работают только с 8:00 до 20:00
Как мы работаем1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
План “Б”
● Альтернативный минимальный набор политик
● Изменяется очень редко
План “В”cf-stop - остановка CFEngine на всём проде за несколько минут
cf-update
exitstatus=0
update+execute
executestop
exitstatus=0
batch size x2
continue
Это надо делать обязательно● Тестировать в разных условиях
● Долго тестировать на части прода
● Делать ревью
● Распространять обновления в продакшене плавно и
поэтапно
● Иметь план на случай аварии
Спасибо за внимание!
● Блог Одноклассников на Хабре http://habrahabr.ru/company/odnoklassniki/
● Больше о нас и наших докладахhttp://v.ok.ru/
Дмитрий Самсонов[email protected]
https://www.linkedin.com/in/dmitrysamsonov