Рубрики
Uncategorized

Строительство устойчивых услуг в Prime Video с инженерным хаосом

Крупномасштабные распределенные программные системы состоят из нескольких отдельных подсистем, таких как CDN … Tagged with AWS, OpenSource, DevOps, Tuperial.

Крупномасштабные распределенные программные системы состоят из нескольких отдельных подсистем, таких как 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 требует, чтобы практика приняла практики для выявления взаимодействий в распределенных системах и связанных сбоя, а также требует реализации и проверки контрмеров. Они могут быть реализованы с использованием инженерных экспериментов в хаосе.

Типичные инженерные эксперименты в хаосе:

  1. Ресурс истощение : Например, истощение процессора, виртуальная память, пространство диска и т. Д. Эти сбои часто встречаются и часто вызваны неудачными развертываниями, утечками памяти или неожиданными скачками трафика. Эксперименты по хаосу, которые контролируют истощение ресурсов, подтверждают, что существует достаточный мониторинг для обнаружения таких сбоев и надлежащих контрмеров (например, автоматическое масштаб, автоматическое восстановление и т. Д.) Чтобы система восстановилась автоматически.
  2. Неудача или медленная сетевая зависимость : Например, база данных, доступная по сети, медленно реагирует, или его частота отказов высока. Эти сбои могут произойти, когда сеть испытывает прерывистые проблемы или когда зависимости находятся в деградированном состоянии. Тайм -ауты , Политики повторения и выключатели трассы являются типичными контрмерами для этих неудач; Тем не менее, они редко проходят адекватно, так как тесты на единицу или интеграции, как правило, не могут подтвердить их с высокой уверенностью. Эксперименты по хаосу, которые вводят задержку или неисправности в пути кода зависимости, хороши для доказывания времени эффективности, повторных и выключателей контрмеров.

Для более подробного обзора 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 следующим образом:

  1. Создайте документ 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 по сети. Тестирование тайм-аутов, повторений и конфигураций цепного выключателя, используемых этой службой, считалась критической, потому что:

  1. Эти пути кода трудно проверить с помощью устройств, интеграции и сквозных тестов.
  2. Проблемы в конфигурациях обычно обнаруживаются во время отключения, когда эти контрмеры 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 помогает предотвратить потенциальные проблемы, влияющие на клиента, которые трудно точно определить, используя традиционные методы тестирования.

Ресурсы

  1. PrinciplesOfChaos.org
  2. Хаос инженер: Искусство разрыва вещей целенаправленно Коллекция блога на среднем
  3. Awesome Chaos Engineering Коллекция Ресурсов для чтения на GitHub

Первоначально опубликовано в https://aws.amazon.com 18 августа 2020 года.

Оригинал: «https://dev.to/aws/building-resilient-services-at-prime-video-with-chaos-engineering-2hka»