нужно добавить TTL в таблицу базы данных 3bln + record - PullRequest
1 голос
/ 28 января 2020

нам нужно добавить TTL в таблицу ddb 3bln + record. Это живая таблица, используемая очень часто, поэтому мы не можем ее отключить или даже перенаправить запросы в другую таблицу. Я так понимаю, нам нужно запустить скрипт, чтобы вручную добавить новый атрибут TTL в таблицу? Есть ли другие подходы к этому?

Есть идеи, сколько времени потребуется для выполнения такого количества обновлений для записей более 3 миллиардов? Есть ли у этого дополнительные финансовые затраты?

Спасибо!

Ответы [ 2 ]

1 голос
/ 29 января 2020

Согласно https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html,

UpdateItem - изменяет один элемент в таблице. DynamoDB учитывает размер элемента так, как он выглядит до и после обновления. Предоставленная пропускная способность отражает больший размер этих элементов. Даже если вы обновите только подмножество атрибутов элемента, UpdateItem по-прежнему будет использовать полную пропускную способность (большую из размеров элементов «до» и «после»).

Таким образом, хотя ваш сценарий будет только go добавлять один маленький столбец TTL к каждому элементу, стоимость этой операции в WCU будет идентична переписыванию всей базы данных. Если вы используете режим выставления счетов по требованию, эти затраты могут быть огромными, и вы обязательно должны их учитывать.

Однако, если вы используете режим выставления счетов за предоставленную мощность, стоимость может быть более управляемой: Вы, вероятно, работаете с меньшей емкостью, поэтому можете добавить дополнительные операции записи бесплатно. Однако возникает вопрос: сколько у вас дополнительных мощностей: если у вас просто 1000 запросов в секунду, то вам потребуется целый месяц, чтобы написать TTL для 3 миллиардов элементов с такой скоростью. В любом случае, если вы используете выделенную емкость, ваш сценарий должен будет тщательно контролировать поток: он должен работать со скоростью N обновлений в секунду, медленно увеличивая N, но как только он получит ошибку о переполненной емкости, оно должно быть меньше N. Если вы не выполняете такое управление потоком, вы можете в конечном итоге задушить ваше реальное живое приложение.

Наконец, еще один вопрос, на который вам нужно ответить: как вы узнаете, какие элементы существуют? , чтобы добавить к ним поля TTL. Если у вас нет каких-либо внешних знаний о том, какие ключи существуют, вам, к сожалению, нужно «отсканировать» всю таблицу, чтобы выяснить существующие ключи. Вы можете попросить Scan вернуть только ключи, а не полные элементы, но это все равно будет стоить вам столько же, сколько и чтение всего элемента (но это уменьшит пропускную способность сети). К счастью, чтение в DynamoDB намного дешевле, чем запись. Кроме того, опять же, если вы используете выделенную емкость, вы можете медленно выполнять это сканирование бесплатно по сравнению с существующей избыточной емкостью.

0 голосов
/ 28 января 2020

Нет способа избежать некоторых затрат, но вы можете минимизировать их. Поскольку вы добавляете новое поле, вы можете использовать элемент обновления DynamoDB, который позволяет вам писать только те поля, на которые вы влияете. Это сделает пару вещей.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...