Крупномасштабные распределенные программные системы состоят из нескольких отдельных подсистем, таких как CDN, балансировщики нагрузки и базы данных и их взаимодействия. Эти взаимодействия иногда имеют непредсказуемые результаты, вызванные непредвиденными турбулентными событиями (например, сбой сети). Эти события могут привести к общенациональным сбоям.
Chaos Engineering — это дисциплина экспериментов по распределенной системе, чтобы укрепить уверенность в способности системы противостоять турбулентным событиям. Chaos Engineering требует упорства внедрения практики для упорства в распределенных системах и связанных с этим сбоев, а также требует реализации и проверки контрмеров. Ключом к хаосу инженерной инженерии является отказ контролируемым образом.
В этом посте мы представляем простой подход для впрыскивания неисправностей в системах, использующих Amazon Elastic Compute Cloud (Amazon EC2) и Amazon Elastic Contaster Service (Amazon ECS), и его интеграция с набором тестирования нагрузки для проверки контрмеров, созданных для предотвращения зависимости и сбоев истощения ресурсов. Типичным экспериментом по хаосу может быть генерирование базовой нагрузки (трафик) против системы, добавляя задержку ко всем сетевым вызовам в базовую базу данных, а затем проверка тайм -аутов и повторений. Мы объясним, как ввести такой сбой (добавление задержки к вызовам базы данных), почему проверка контрмеров (тайм-аут и повторения) под нагрузкой имеет важное значение и как выполнить его в системе на основе Amazon EC2.
Мы начнем с краткого знакомства с инженерией Chaos, а затем погрузимся в инъекцию неудачи, используя AWS Systems Manager Анкет Затем мы представим нашу библиотеку с открытым исходным кодом, AWSSSMCHAOSRUNNER Анкет Это было вдохновлено Адриан Хорнсби «Инъекция хаоса в Amazon EC2 с использованием системного диспетчера AWS» Сообщение блога.
Наконец, мы приведем пример интеграции и объясним, как Prime Video Используйте эту библиотеку, чтобы предотвратить потенциально отключения, влияющие на клиента.
Хаос инженерный введение
Программное обеспечение обычно включает в себя реализацию и автоматизацию модульных тестов, интеграционные тесты и сквозные тесты. Хотя эти тесты имеют решающее значение, они не охватывают более широкий спектр сбоев, возможных в распределенной системе (например, отключение зоны доступности, сбой зависимости, отключение сети и т. Д.).
Как правило, поведение программных систем для этих сценариев остается неизвестным. Например, что произойдет, если экземпляр Amazon EC2 в сервисном парке поддерживает высокое потребление процессора? Такая ситуация может произойти из -за неожиданного увеличения трафика или неправильно реализованного цикла в коде. Установить уверенность в программных системах сложно, не подвергая их стрессу. Вопросы для рассмотрения:
- Вы проверяли, как ведет себя система, когда в основных случаях есть устойчивый всплеск процессора?
- Является ли поведение системы под различным стрессом?
- Достаточно ли мониторинг?
- Были ли подтверждены тревоги?
- Существуют ли какие -либо контрмеры? Например, настраивается ли автоматическая масштаба, и ведут ли он ведущий как ожидалось? Уместны ли тайм -ауты и повторения?
Как упоминалось ранее, Chaos Engineering требует, чтобы практика приняла практики для выявления взаимодействий в распределенных системах и связанных сбоя, а также требует реализации и проверки контрмеров. Они могут быть реализованы с использованием инженерных экспериментов в хаосе.
Типичные инженерные эксперименты в хаосе:
- Ресурс истощение : Например, истощение процессора, виртуальная память, пространство диска и т. Д. Эти сбои часто встречаются и часто вызваны неудачными развертываниями, утечками памяти или неожиданными скачками трафика. Эксперименты по хаосу, которые контролируют истощение ресурсов, подтверждают, что существует достаточный мониторинг для обнаружения таких сбоев и надлежащих контрмеров (например, автоматическое масштаб, автоматическое восстановление и т. Д.) Чтобы система восстановилась автоматически.
- Неудача или медленная сетевая зависимость : Например, база данных, доступная по сети, медленно реагирует, или его частота отказов высока. Эти сбои могут произойти, когда сеть испытывает прерывистые проблемы или когда зависимости находятся в деградированном состоянии. Тайм -ауты , Политики повторения и выключатели трассы являются типичными контрмерами для этих неудач; Тем не менее, они редко проходят адекватно, так как тесты на единицу или интеграции, как правило, не могут подтвердить их с высокой уверенностью. Эксперименты по хаосу, которые вводят задержку или неисправности в пути кода зависимости, хороши для доказывания времени эффективности, повторных и выключателей контрмеров.
Для более подробного обзора Chaos Engineering, пожалуйста, посмотрите ресурсы в конце этой статьи.
AWSSSMCHAOSRUNNER: Библиотека для инъекции сбоя с использованием AWS Systems Manager
Далее, давайте рассмотрим Essential Systems Manager Concepts: AWS Systems Manager Агент (Агент SSM), SendCommand API и AWS Systems Manager документы.
AWS Systems Manager
AWS Systems Manager это служба, используемая для просмотра эксплуатационных данных из нескольких служб AWS и для автоматизации эксплуатационных задач в ваших ресурсах AWS. Полный список возможностей системного менеджера можно найти в Руководство пользователя Анкет
Для экземпляров Amazon EC2, AWS Systems Manager предлагает SSM агент выполнять действия внутри экземпляров или серверов. Эта возможность обычно используется в большинстве экземпляров Amazon EC2 для исправления операционной системы и для Управление сеансами SSH Анкет
AWS Systems Manager Agent
Агент SSM — открытый исходный код Amazon Software, выпущенное в соответствии с Apache License 2.0, которое может быть установлено и настроено на экземпляр Amazon EC2. Agent SSM позволяет Systems Manager обновлять, управлять и настраивать эти ресурсы. Агент SSM предварительно установлен по умолчанию на экземпляры, созданные из следующих изображений Amazon Machine (AMIS): Windows Server 2008–2012 R2 Amis, опубликованные в ноябре 2016 года или позже, Windows Server 2016 и 2019, Amazon Linux, Amazon Linux 2, Ubuntu Server 16.04, Ubuntu Server 18.04 и Amazon ECS-оптимизированный.
Для инструкций по установке и конфигурации см. Руководство пользователя Анкет
SendCommand API
AWS SSM SendCommand API Позволяет программно выполнять команды на одном или нескольких экземплярах через агент SSM.
Пример : ‘Привет, мир!’ SendCommand с использованием AWS CLI
- Указанный экземпляр, -1234567890ABCDEF0, будет работать «Эхо привет, мир!» как сценарий оболочки. Цели могут использоваться для указания отдельных экземпляров или групп экземпляров с помощью тегов экземпляра (например, группа автоматического масштабирования).
- Выполнение SendCommand пройдет через 10 секунд.
- Любые журналы из команды будут отправлены в Группа журналов CloudWatch Названный тест.
aws ssm send-command \ --document-name "AWS-RunShellScript" \ --parameters 'commands=["echo Hello, World!"]' \ --targets "Key=instanceids,Values=i-1234567890abcdef0" \ --comment "echo Hello, World!" --timeout-seconds 10 --cloud-watch-output-config "CloudWatchOutputEnabled=true,CloudWatchLogGroupName=test"
Командные документы SSM
AWS Systems Manager Document (Документ SSM) может использоваться для указания сложных команд в форме сценариев оболочки, которые будут выполнены в экземпляре или группах экземпляров. Вы можете запустить документы SSM через консоль AWS Systems Manager или API SendCommand.
Пример : Документ SSM для Маршрутизация черной дыры Весь исходящий трафик на данном порте UDP или TCP
- Этот документ указан в формате YAML, но также может быть указан с помощью JSON.
- Параметры команды определяются отдельно, как переменные.
- Действие: AWS: RunShellScript Указывает, что шаги (поддерживающие) являются частью сценария оболочки.
--- schemaVersion: '2.2' description: Blackhole a protocol/port on an instance parameters: prtl: type: String description: Specify the protocol to blackhole. (Required) allowedValues: - tcp - udp port: type: String description: Specify the port to blackhole. (Required) duration: type: String description: The duration - in seconds - of the blackhole. (Required) default: "60" mainSteps: - action: aws:runShellScript name: ChaosBlackholeAttack inputs: runCommand: - iptables -A OUTPUT -p {{ prtl }} --dport {{ port }} -j DROP - sleep {{ duration }} - iptables -D OUTPUT -p {{ prtl }} --dport {{ port }} -j DROP
AWSSSMCHAOSRUNNER
Предполагая, что агент SSM установлен на экземплярах Amazon EC2 и настроен с правильными разрешениями, AWS Systems Manager может использоваться для впрыска на сбое на экземплярах Amazon EC2 следующим образом:
- Создайте документ SSM через консоль AWS Systems Manager или AWS CLI.
- Сценарий оболочки, включенный в документ SSM, должен быть исполняется в основных случаях.
2. Позвоните в API SSM SendCommand через консоль AWS Systems Manager или AWS CLI.
- Флот Amazon EC2 может быть определен с использованием соответствующих тегов для целевого параметра.
- Должны быть указаны параметры базового сценария оболочки (продолжительность/порт/протокол в приведенном выше примере).
- Группа журналов CloudWatch должна быть настроена и указана для просмотра журналов из всего флота Amazon EC2 в одном месте.
Если вышеуказанные шаги успешны, все указанные хосты Amazon EC2 будут вводить сбой. Например, хосты EC2 будут исходящим трафиком черного цвета в данном порте UDP/TCP. Тем не менее, никакие запросы не могут попасть в службу, в которую вы вносите неудачу; Либо это период с низким трафиком или парк развития. В этом случае влияние инъекции сбоя может быть минимальным или хуже, вообще не воспринимаемое. Таким образом, будет трудно подтвердить противодействие, введенные в действие. Третий шаг необходим.
3. Создайте трафик в службу, используя генераторы нагрузки для моделирования реального трафика в системе.
Запуск вышеупомянутых шагов вручную склонна к ошибкам конфигурации, рискованно и занимает много времени. Эти шаги могут быть автоматизированы с недавно выпущенным Библиотека AWSSMCHAOSRUNNER , как показано на изображении ниже.
Эта библиотека абстрагирует создание документов SSM и вызывает SSM SendCommand и предоставляет проверенные и протестированные документы SSM для экспериментов по хаосу. Эта библиотека открыта под Apache-2.0 Лицензия и доступен на GitHub и Maven Central Анкет
amzn/awsssmchaosrunner
Инъекции неудачи
Инъекции сбоев, в настоящее время доступные в библиотеке AWSSMCHAOSRunner:
- NetworkInterfaceLatency : Добавляет задержку всем входящим/исходящим вызовам к данному сетевому интерфейсу.
- Зависимость зажигания : Добавляет задержку в входящие/исходящие вызовы к данной внешней зависимости.
- DEVIVENCYPACKETLOSSATTACK : Отбрасывает пакеты на входящих/исходящих вызовах на данную внешнюю зависимость.
- MemoryHog : Виртуальная память Hogs на флоте.
- ЦПУхог : Hogs CPU на флоте.
- Diskhog : Божеводы на дисковом пространстве на флоте.
- Awsservicelatencyattack : Добавляет задержку в службу AWS, используя диапазоны CIDR, возвращенные из ip-ranges.amazonaws.com . Это необходимо для таких услуг, как Amazon Simple Service (Amazon S3) или Amazon Dynamodb , где разрешенный IP -адрес может измениться во время эксперимента по хаосу.
- Awsservicepacketlossattack : Отбрасывает пакеты в сервис AWS, используя диапазоны CIDR, возвращаемые из ip-ranges.amazonaws.com . Это необходимо для таких услуг, как Amazon S3 или Amazon DynamoDB, где разрешенный IP -адрес может измениться во время эксперимента в хаосе.
- MultiipaddresslatencyAttack : Добавляет задержку всем вызовам в список IP -адреса. Это может быть полезно для маршрутизатора → Хост своего рода настройки.
- MultiipadDressPacketLossAttack : Отбрасывает пакеты из всех вызовов в список iPaddress. Это может быть полезно для маршрутизатора → Хост своего рода настройки.
Хаос тестирование услуги EC2
Возьмите, к примеру, услугу, работающую в Amazon EC2. (Обычно рекомендуемые компоненты, такие как CDN, балансировщики нагрузки и VPC, были опущены для упрощения).
Эта служба получает запросы клиентов, применяет бизнес -логику и доступ к базе данных (или любой внешней зависимости). Давайте узнаем, как применить библиотеку AWSSMCHAOSRunner к этой услуге.
Предварительные условия
- Знакомство с IAM Concepts , такие как политика IAM, роли и пользователи.
- Тесты на услугу написаны в Java, Kotlin или Scala. Библиотека AWSSSMCHAOSRunner доступна только для этих языков.
- Здоровье обслуживания и поведение должно быть приведено в силу и контролируется с помощью Метрики или журналы Анкет Без мониторинга эффект инъекций сбоя не может наблюдаться.
- Некоторый базовый трафик (нагрузка) генерируется в службу из тестов, в то время как эксперимент по хаосу выполняется. Генерация трафика поможет подтвердить гипотезу эксперимента.
Шаг 1. Установите разрешения для вызова AWS Systems Manager из пакета Tests.
Хотя внедрение этой части по -разному возможно, описанный здесь подход генерирует временные учетные данные для диспетчера AWS Systems при каждом заезде тестов.
Сначала вы должны создать пользователя IAM и роль IAM, которую он может принять. Следующее IAM Policy Должен быть привязан к этой роли.
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sts:AssumeRole", "ssm:CancelCommand", "ssm:CreateDocument", "ssm:DeleteDocument", "ssm:DescribeDocument", "ssm:DescribeInstanceInformation", "ssm:DescribeDocumentParameters", "ssm:DescribeInstanceProperties", "ssm:GetDocument", "ssm:ListTagsForResource", "ssm:ListDocuments", "ssm:ListDocumentVersions", "ssm:SendCommand" ], "Resource": [ "\*" ], "Effect": "Allow" }, { "Action": [ "ec2:DescribeInstances", "iam:PassRole", "iam:ListRoles" ], "Resource": [ "\*" ], "Effect": "Allow" }, { "Action": [ "ssm:StopAutomationExecution", "ssm:StartAutomationExecution", "ssm:DescribeAutomationExecutions", "ssm:GetAutomationExecution" ], "Resource": [ "\*" ], "Effect": "Allow" } ] }
Шаг 2. Инициализируйте клиент AWS Systems Manager.
Этот код должен быть вызван во время инициализации тестов (то есть, где бы ни создавались синглтоны).
//Kotlin @Bean open fun awsSecurityTokenService( credentialsProvider: AWSCredentialsProvider, awsRegion: String ): AWSSecurityTokenService { return AWSSecurityTokenServiceClientBuilder.standard() .withCredentials(credentialsProvider) .withRegion(awsRegion) .build() } @Bean open fun awsSimpleSystemsManagement( securityTokenService: AWSSecurityTokenService, awsAccountId: String, chaosRunnerRoleName: String ): AWSSimpleSystemsManagement { val chaosRunnerRoleArn = "arn:aws:iam::$awsAccountId:role/$chaosRunnerRoleName" val credentialsProvider = STSAssumeRoleSessionCredentialsProvider .Builder(chaosRunnerRoleArn, "ChaosRunnerSession") .withStsClient(securityTokenService).build() return AWSSimpleSystemsManagementClientBuilder.standard() .withCredentials(credentialsProvider) .build() }
Шаг 3. Начните атаку впрыскивания неисправности перед началом теста и остановите ее после теста.
Данный тест отправляет трафик в службу.
//Kotlin @Before override fun initialise(args: Array) { if (shouldExecuteChaosRunner()) { ssm = applicationContext.getBean(AWSSimpleSystemsManagement::class.java) ssmAttack = getAttack(ssm, attackConfiguration) command = ssmAttack.start() } } @Test fun `given failure injection generate calls to the service`(int: duration) { // This test should call an endpoint of the service and keep repeating this for the duration of the test. // Additional logging can be added or service dashboards can be monitored for an overview. val startTime = LocalDateTime.now() while(getElapsedSeconds(startTime) <= duration){ serviceClient.callEndpoint() } } @After override fun destroy() { ssmAttack.stop(command) }
Шаг 4. Запустить тест.
Выполните команду, чтобы запустить приведенный выше тест.
ПРИМЕЧАНИЕ. AWSSSMCHAOSRUNNER также можно использовать для службы на основе EC2+ECS с одним шагом настройки перед вышеуказанными шагами. Пожалуйста, смотрите GitHub readme Больше подробностей.
Prime Video использует AWSSSMCHAOSRunner, чтобы предотвратить потенциальный отключение
В марте 2020 года Prime Video запустило Prime Video Profiles который позволяет Prime Video Persions получить доступ к отдельным рекомендациям, прогрессу в сезоне и списке наблюдения, поскольку они основаны на индивидуальной активности профиля. Этот новый опыт работы с клиентами требовал разработки и внедрения новых услуг с использованием Amazon EC2.
Главные профили видео
Эти услуги являются частью распределенной системы, и они называют другие внутренние услуги Amazon по сети. Тестирование тайм-аутов, повторений и конфигураций цепного выключателя, используемых этой службой, считалась критической, потому что:
- Эти пути кода трудно проверить с помощью устройств, интеграции и сквозных тестов.
- Проблемы в конфигурациях обычно обнаруживаются во время отключения, когда эти контрмеры Timeouts, повторения и выключателя с цепи.
Prime Video реализовало этот инженерный эксперимент в хаосе с использованием AWSSSMCHAOSRUNNER’S Зависимость зажигания атака и генерируя нагрузку против сервиса, моделируя трафик, когда зависимости демонстрируют высокую задержку.
Были обнаружены метрики вызова услуг к услугам, и, в результате, были подтверждены тайм-ауты, повторные издержки и конфигурация цепного выключателя.
Теперь давайте рассмотрим результат одного из этих экспериментов по хаосу и выясним, как он помог нам активно обнаружить потенциальному вопросу, влияющему на клиента.
Эксперимент: проверка тайм -аута Elasticache
Эксперимент по хаосу настроен следующим образом:
- Гипотеза эксперимента : Тайм -аут для обслуживания → вызов Elasticache установлен как 40 миллисекунд. Это будет подтверждено путем наблюдения за сервисом → Elasticach Intency во время эксперимента.
- Инъекция неудачи : Две секунды задержки добавляются в сервис → Elasticach Call с использованием AWSSSMCHAOSRUNNER.
- Генерировать базовую нагрузку против сервиса : 1000 запросов в секунду генерируются против Сервиса. Как обсуждалось ранее, управление инженерными экспериментами в хаосе во время загрузки системы имеет решающее значение.
Результат эксперимента
На приведенном выше изображении показано, что задержка службы → задержка Elasticach выходит за рамки настроенного тайм -аута 40 мс. Таким образом, Конфигурация тайм -аута ElasticAche не удастся Анкет
Следуя этим результатам, мы исправили ошибку в конфигурации тайм -аута.
Чтобы подтвердить наше исправление, мы впоследствии перезапустили тот же эксперимент.
Иллюстрация показывает, что максимальная задержка обслуживания → задержка Elasticach ограничена на 40 миллисекунд, настраиваемое значение тайм -аута. Это происходит, несмотря на дополнительную задержку двух секунд, введенных в этот путь к эксперименту. Этот результат подтверждает, что сервис будет быстро пройти время, если Elasticach будет медленно отвечать или если у этого сетевого пути есть некоторые проблемы.
Запуск этого эксперимента по хаосу привел к обнаружению ошибки в контрмезаре для деградации зависимостей (т.е. Timeout Elasticache). Исправление ошибки предотвратило потенциальную неудачу, способствующую влиянию клиентов.
Вывод
Тестирование временных ресурсов, повторных и конфигураций седых и зависимости службы имеет важное значение. В этом посте мы представили подход с открытым исходным кодом к инъекции отказа на Amazon EC2 Используя AWS Systems Manager, и мы продемонстрировали, как Prime Video сочетает его с нагрузочным тестированием для достижения более высоких уровней устойчивости. В этом основном видео примере показано, как HAOSE Engineering помогает предотвратить потенциальные проблемы, влияющие на клиента, которые трудно точно определить, используя традиционные методы тестирования.
Ресурсы
- PrinciplesOfChaos.org
- Хаос инженер: Искусство разрыва вещей целенаправленно Коллекция блога на среднем
- Awesome Chaos Engineering Коллекция Ресурсов для чтения на GitHub
Первоначально опубликовано в https://aws.amazon.com 18 августа 2020 года.
Оригинал: «https://dev.to/aws/building-resilient-services-at-prime-video-with-chaos-engineering-2hka»