Как не положить тысячи серверов с помощью системы...

Post on 16-Apr-2017

115 views 1 download

Transcript of Как не положить тысячи серверов с помощью системы...

Дмитрий СамсоновВедущий системный администратор в OK.RU

Компетенция:

● Zabbix

● CFEngine

● Linux tuning

dmitry.samsonov@odnoklassniki.ru

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/

Дмитрий Самсоновdmitry.samsonov@odnoklassniki.ru

https://www.linkedin.com/in/dmitrysamsonov