Подтвердить что ты не робот

Как автоматически масштабировать пропускную способность Amazon DynamoDB?

Amazon DynamoDB не предоставляет встроенные возможности автоматической настройки пропускной способности на основе динамической нагрузки. Он обеспечивает API для увеличения или уменьшения пропускной способности. Клиенты получают почасовую плату за предоставленную пропускную способность для чтения и записи.

Каковы различные способы изменения пропускной способности dynamodb и достижения преимуществ экономии?

4b9b3361

Ответ 1

Ответ Криса - это точный ответ. Просто добавьте несколько пунктов из предыдущего опыта, используя DynamoDB...

Ситуация с DynamoDB отличается от ситуации EC2. У службы эластичных вычислений есть API, поддерживаемый непосредственно в качестве веб-службы Amazon, чтобы вы могли программировать, как масштабироваться вверх или вниз по некоторой логике, например, сколько требуется. Вы программируете это, определяя порог мониторинга и автоматически запуская создание или удаление экземпляров в группе.

Серверы данных не работают одинаково с триггерами, чтобы настроить их емкость. Но способность DynamoDB очень гибкая и может контролироваться, как отметил Крис. API для обеспечения этого достаточно хорош, чтобы отменить изменения. Или эквивалентные изменения вручную с консоли.

Различные языковые привязки к действиям по созданию и обновлению программ с помощью DynamoDB находятся здесь...

http://docs.aws.amazon.com/cli/latest/reference/dynamodb/index.html

Важная операция для изменения емкости здесь...

http://docs.aws.amazon.com/cli/latest/reference/dynamodb/update-table.html

Таким образом, это дает вам возможность увеличивать или уменьшать значения ReadCapacityUnits или WriteCapacityUnits ProvisionedThroughput.

Это нормально для прогнозируемого или одноразового изменения. Но это не то же самое, что инструмент гибкости, позволяющий автоматически запускать изменение.

Программно, что вы, скорее всего, захотите сделать, это настроить мощность в ответ на изменение использования в предыдущем временном интервале. В частности, вам может потребоваться быстрое масштабирование в ответ на волну спроса, определяя соответствующий временной интервал и нижний и верхний пороги для запуска.

Более полное решение для этого описано здесь...

https://aws.amazon.com/blogs/aws/auto-scale-dynamodb-with-dynamic-dynamodb/

Решение поддерживается Себастьяном Далгреном и может быть найдено со всеми инструкциями в...

https://github.com/sebdah/dynamic-dynamodb

Я вижу, что текущая версия 1.18.5, которая более поздняя, ​​чем когда я в последний раз ее использовал.

Судя по более ранним выпускам, его легко настроить с помощью файла стиля свойств dynamodb.conf...

Предоставив учетные данные и регион, наиболее важными параметрами являются

  • check-interval - проверить пропускную способность в секундах
  • min-provisioned-reads, max-provisioned-reads; reads-upper-threshold, reads-lower-threshold; increase-reads-with, decrease-reads-with - все проценты
  • min-provisioned-writes, max-provisioned-writes; writes-upper-threshold, writes-lower-threshold; increase-writes-with, decrease-writes-with - это все проценты

Обновлена ​​ли эта информация?

Хорошо, если вы посмотрите http://aws.amazon.com/new/, вы увидите только одно недавнее изменение, влияющее на DynamoDB, которое влияет на сохраненные документы. Запись Dynamic DynamoDB является последней опубликованной записью, посвященной действиям масштабирования. Таким образом, это лучшее поддерживающее автоматическое масштабирование DynamoDB в настоящее время.

Ответ 2

Я только что открыл этот проект, который будет автомасштабировать вверх и вниз по Dynamodb и выглядит лучше Dynamic Dynamo, поскольку он использует функции Lambda, а не экземпляры EC2:

https://github.com/channl/dynamodb-lambda-autoscale

  • 5-минутный процесс настройки
  • Безсервисная конструкция
  • Стиль гибкого кода по конфигурации
  • Автомасштабирование таблицы и глобальных вторичных индексов
  • Автомасштабирование нескольких таблиц
  • Автомасштабирование с помощью фиксированных настроек
  • Автомасштабирование за счет использования загруженной мощности
  • Автомасштабирование по показателям дросселирования событий
  • Оптимизирован для больших всплесков в использовании и проблемах с горячими клавишами, включая показатели дросселированных событий.
  • Оптимизированная производительность с использованием параллельных запросов
  • RateLimitedDecrement, наложенное AWS
  • Статистика через "измеренный"
  • Конфигурация учетных данных AWS через "dotenv"
  • Оптимизированный пакет лямбда через "webpack"
  • Код ES7
  • 100% Flow охват проверки статического типа

Ответ 3

Amazon просто добавила автомасштабирование для dynamodb, см. подробности здесь

Ответ 4

Вы можете программно управлять пропускной способностью через API обновления Tables или вручную через консоль.

Там также есть инструменты, такие как Dynamic DynamoDB, хотя вы также можете использовать свою собственную версию: вы должны использовать API updateTable и иметь некоторые фоновый процесс для обнаружения этих обстоятельств и при необходимости вызывать updateTable.

Некоторые вещи, которые следует учитывать при изменении масштаба DynamoDB:

  • Вы получаете счет за выделенную пропускную способность, независимо от того, используете ли вы ее или нет.
  • Вэнь вы увеличиваете масштаб, Dynamo может выделять вам новые разделы - но он не удаляет их, когда он масштабируется. Это может привести к неожиданным горячим хеш-ключам, где у вас много разделов, но очень низкая пропускная способность для каждого из них.

Ответ 5

Я думаю, что другие ответы проделали отличную работу, но у меня есть другой подход к автомасштабированию DynamoDB в режиме, управляемом событиями, используя сигналы CloudWatch и DynamoDB UpdateTable для изменения резервных мощностей. Следующий подход не только помогает снизить затраты, но и увеличивает емкость для неожиданных нагрузок.

Резюме:

Настройте аварийные сигналы CloudWatch на показатели DynamoDB, чтобы предупредить вас о пороговых значениях и вывести предупреждения в очередь SQS через тему SNS. Процесс демона, который опросает очередь SQS, может обрабатывать эти предупреждения и изменять пропускную способность таблицы с помощью функции DynamoDB UpdateTable и обновлять пороговые значения CloudWatch.

Подробная версия:

Пожалуйста, имейте в виду, что для этого подхода потребуется 1. Понимание сервисов AWS, таких как CloudWatch, SNS, SQS 2. Хорошее время для реализации на вашем любимом языке программирования 3. Поддержание демона для обработки сообщений SQS и изменения объема ресурсов.

Настройка времени:

  • Создайте аварийные сигналы CloudWatch на метках ConsumedWriteCapacityUnits и ConsumedReadCapacityUnits таблицы DynamoDB. Вы можете использовать эту документацию.
  • Настройте аварийные сигналы CloudWatch чтобы предупредить тему SNS. Создайте очередь AWS SQS и подпишитесь на очередь для получения предупреждений из темы SNS.
  • Напишите демона на любом языке программирования для опроса очереди SQS и обработки всех предупреждений. AWS имеет SDK на нескольких языках, поэтому выбор любого из этих языков позволит избежать написания большого количества кода для связи с службами AWS.

Демон:

  • Для каждого получаемого SQS-сообщения, рассчитывается новая резервная емкость, которая будет использоваться, и выдает операцию UpdateTable с новым значением.
  • Обновите будильник CloudWatch с новыми порогами, если это необходимо.

Вы можете использовать вышеуказанный подход для масштабирования вверх или вниз. Например, поддерживайте порог тревоги CloudWatch на 80% от ProvisionedWriteCapacityUnits, и каждый раз, когда использование пересекает 80%, увеличьте емкость и установите порог срабатывания сигнализации на 80% от нового значения. Аналогично, вы можете уменьшить масштаб, когда потребление падает ниже x%.

Хотя это и есть суть, в решении качества продукции будет много вопросов.

  • Понимать о разделах DynamoDB и проблемах с горячими клавишами.
  • Имейте в виду все ограничения DynamoDB.
  • Ограничения на отсутствие шкалы в день UTC.
  • Группирование нескольких операций UpdateTable.

Наконец, Neptune.io предоставляет упакованное решение SaaS для автомасштаба DynamoDB с использованием этой архитектуры. См. http://blog.neptune.io/one-click-autoscaling-of-dynamodb/ и http://blog.neptune.io/dos-and-donts-of-dynamodb-autoscaling/ для чтения что.

P.S: Я работаю для Нептуна. И, я могу помочь вам, если вам нужно больше информации о реализации.

Ответ 6

Jeff Bar недавно написал блог в официальном блоге AWS: "Auto Scale DynamoDB With Dynamic DynamoDB":

https://aws.amazon.com/blogs/aws/auto-scale-dynamodb-with-dynamic-dynamodb/

Он представил Dynamic DynamoDB, инструмент с открытым исходным кодом, созданный независимым разработчиком для автоматического управления этим шаблоном CloudFormation.

Ответ 7

Я добавил новые функции в Rockeee Dynamic DynamoDB Lambda. Вы можете увидеть этот проект:

https://github.com/touchvie/dynamic-dynamodb-lambda

  • Поддержка глобального вторичного индекса
  • Включение/отключение автосканирования чтения/записи в файле конфигурации json
  • События дроссельной заслонки в поддержке CloudWatch.
  • Включить/отключить проверку дроссельной заслонки/дроссельной заслонки в файле конфигурации json
  • Добавлен тест для лямбда

Я надеюсь, что это может вам помочь.

Ответ 8

Рекомендации по автоматическому масштабированию DynamoDB Script:

Клиенты получают почасовую плату за предоставленную пропускную способность для чтения и записи. Ниже приведены цены на Amazon Dynamo DB для стран ЕС (Ирландия).

• Запись пропускной способности: $0,00735 в час на каждые 10 единиц мощности записи • Пропускная способность чтения: $0,00735 в час для каждых 50 единиц читаемой емкости

Amazon Dynamo DB не предоставляет встроенные возможности автоматической настройки пропускной способности на основе динамической загрузки. Он обеспечивает API для увеличения или уменьшения пропускной способности с некоторыми ограничениями, так как пропускная способность может быть уменьшена два раза в день и увеличивается в любое время в день.

Каков будет ежемесячный счет производственной таблицы для фиксированной емкости чтения 2000 чтения/сек и 2000 записей в секунду в течение 24 часов?

Расчет: $0.00735 X 24 часа X 200 X 30 дней {стоимость записи за месяц} + $0.00735X 24 часа X 40 X 30 дней {цена чтения за месяц} = 1058.4+ 211.68 = Исправлено 1270 $/месяц.

Рекомендации по написанию утилиты {поддерживаемые амазонки языки программирования}, которые регулируют пропускную способность таблицы и уменьшают ежемесячные счета.

(A) Начальное значение. В принципе, здесь вы должны смотреть и решать пропускную способность чтения и записи для таблицы в качестве значения инициализации после анализа среднего использования с учетом нагрузки 15 дней или 1 месяца и добавления X% дополнительно для чтения и Y% дополнительно для записи сверху, чтобы выдерживать неожиданную нагрузку. Начальная пропускная способность чтения/записи = вычислить пропускную способность чтения на основе среднего использования + X {read}% или Y {write}% X и Y могут составлять от 10% до 30% на основе наблюдения.

(B) Формирование пиковой нагрузки: Предупреждение о таблицах может быть установлено так же, как при загрузке до 50% до 60% от пройденной пропускной способности, можно предпринять необходимые действия, такие как API увеличения пропускной способности, чтобы увеличить пропускную способность от 30% до 50% пропускной способности обеспечения. *

(C) Ручное формование: для известной тяжелой нагрузки, такой как периодическая загрузка/сезон фестиваля, пропускная способность должна быть установлена ​​вручную до 200% - 300% от обычной ежедневной операции до полной загрузки * * Как только рабочее время или нагрузка закончится. Пропускная способность должна уменьшаться до первоначального значения.

Примечание. Читатель может рассчитать ежемесячную экономию, считая 1000 операций чтения/записи в течение 16 часов. + 2000 чтение/запись в течение 8 часов, при условии, что утилита установлена.

Ответ 10

В июне 2017 года добавлена ​​поддержка автоматического масштабирования AWS для DynamoDB. См. объявление здесь.

Вы можете настроить это с помощью кода (Java SDK example), но если у вас всего несколько таблиц, вы можете использовать Консоль управления. Нажмите в настройках своей таблицы и выберите вкладку Емкость. На следующем изображении показаны варианты:

автомасштабирование конфигурации

Ответ 11

В июне 2017 года добавлена ​​поддержка автоматического масштабирования AWS для DynamoDB. Следующий код (источник) дает пример настройки автоматического масштабирования используя Java SDK:

package com.amazonaws.codesamples.autoscaling;

import com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingClient;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsResult;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesResult;
import com.amazonaws.services.applicationautoscaling.model.MetricType;
import com.amazonaws.services.applicationautoscaling.model.PolicyType;
import com.amazonaws.services.applicationautoscaling.model.PredefinedMetricSpecification;
import com.amazonaws.services.applicationautoscaling.model.PutScalingPolicyRequest;
import com.amazonaws.services.applicationautoscaling.model.RegisterScalableTargetRequest;
import com.amazonaws.services.applicationautoscaling.model.ScalableDimension;
import com.amazonaws.services.applicationautoscaling.model.ServiceNamespace;
import com.amazonaws.services.applicationautoscaling.model.TargetTrackingScalingPolicyConfiguration;

public class EnableDynamoDBAutoscaling {

    static AWSApplicationAutoScalingClient aaClient = new AWSApplicationAutoScalingClient();

    public static void main(String args[]) {

        ServiceNamespace ns = ServiceNamespace.Dynamodb;
        ScalableDimension tableWCUs = ScalableDimension.DynamodbTableWriteCapacityUnits;
        String resourceID = "table/TestTable";

        // Define the scalable target
        RegisterScalableTargetRequest rstRequest = new RegisterScalableTargetRequest()
            .withServiceNamespace(ns)
            .withResourceId(resourceID)
            .withScalableDimension(tableWCUs)
            .withMinCapacity(5)
            .withMaxCapacity(10)
            .withRoleARN("SERVICE_ROLE_ARN_GOES_HERE");

        try {
            aaClient.registerScalableTarget(rstRequest);
        } catch (Exception e) {
            System.err.println("Unable to register scalable target: ");
            System.err.println(e.getMessage());
        }

        // Verify that the target was created
        DescribeScalableTargetsRequest dscRequest = new DescribeScalableTargetsRequest()
            .withServiceNamespace(ns)
            .withScalableDimension(tableWCUs)
            .withResourceIds(resourceID);

        try {
            DescribeScalableTargetsResult dsaResult = aaClient.describeScalableTargets(dscRequest);
            System.out.println("DescribeScalableTargets result: ");
            System.out.println(dsaResult);
            System.out.println();
        } catch (Exception e) {
            System.err.println("Unable to describe scalable target: ");
            System.err.println(e.getMessage());
        }

        System.out.println();

        // Configure a scaling policy
        TargetTrackingScalingPolicyConfiguration targetTrackingScalingPolicyConfiguration = 
            new TargetTrackingScalingPolicyConfiguration()
            .withPredefinedMetricSpecification(
                new PredefinedMetricSpecification()
                .withPredefinedMetricType(MetricType. DynamoDBWriteCapacityUtilization))
            .withTargetValue(50.0)
            .withScaleInCooldown(60)
            .withScaleOutCooldown(60);

        // Create the scaling policy, based on your configuration
        PutScalingPolicyRequest pspRequest = new PutScalingPolicyRequest()
            .withServiceNamespace(ns)
            .withScalableDimension(tableWCUs)
            .withResourceId(resourceID)
            .withPolicyName("MyScalingPolicy")
            .withPolicyType(PolicyType.TargetTrackingScaling)
            .withTargetTrackingScalingPolicyConfiguration(targetTrackingScalingPolicyConfiguration);

        try {
            aaClient.putScalingPolicy(pspRequest);
        } catch (Exception e) {
            System.err.println("Unable to put scaling policy: ");
            System.err.println(e.getMessage());
        }

        // Verify that the scaling policy was created
        DescribeScalingPoliciesRequest dspRequest = new DescribeScalingPoliciesRequest()
            .withServiceNamespace(ns)
            .withScalableDimension(tableWCUs)
            .withResourceId(resourceID);

        try {
            DescribeScalingPoliciesResult dspResult = aaClient.describeScalingPolicies(dspRequest);
            System.out.println("DescribeScalingPolicies result: ");
            System.out.println(dspResult);
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("Unable to describe scaling policy: ");
            System.err.println(e.getMessage());
        }            
    }
}

Этот код требует, чтобы вы предоставили ARN для действительной роли службы автоматического масштабирования приложения. Замените SERVICE_ROLE_ARN_GOES_HERE фактическим ARN.