Как перенести изменения из AWS DMS в конкретный сегмент в AWS KINESIS

У меня есть база данных, содержащая 40 таблиц, и я использую AWS DMS для извлечения изменений данных из этих таблиц и передачи их в поток AWS KINESIS, в котором есть 2 сегмента, и в конечном итоге два моих потребительских приложения будут считывать данные из Kinesis. и обновлять соответствующие базы данных с помощью пользовательской логики.

Проблема здесь в том, что я не смог найти, как сделать так, чтобы записи направлялись на конкретный шард в kinesis. Мол, мне нужно, чтобы первые 20 таблиц были помещены в шард 1, а следующие 20 должны быть размещены в шарде 2. Но когда я проверил документацию, оказалось, что маршрутизация в шард будет основана на хеше раздела_ключа.

Может ли кто-нибудь пролить свет на то, как я могу этого добиться?

Я пробовал разные подходы, перечисленные в Интернете и официальной документации, но не смог добиться того, чего ожидал. Я хочу понять, как этого можно достичь или хотя бы хочу знать, можно ли этого добиться или нет.

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

kdgregory 15.05.2024 14:21

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

Agilan Selvam 16.05.2024 06:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Как описано здесь, Kinesis использует MD5-хеш значения ключа раздела для назначения сегмента. Каждый шард имеет ряд ключей раздела, которые вы можете получить с помощью DescribeStreams API. Например, вот диапазоны разделов для потока с двумя сегментами:

[
  {
    "ShardId": "shardId-000000000000",
    "HashKeyRange": {
      "StartingHashKey": "0",
      "EndingHashKey": "170141183460469231731687303715884105727"
    }
  },
  {
    "ShardId": "shardId-000000000001",
    "HashKeyRange": {
      "StartingHashKey": "170141183460469231731687303715884105728",
      "EndingHashKey": "340282366920938463463374607431768211455"
    }
  }
]

Эти хеш-ключи, хотя и представлены в виде строк, на самом деле представляют собой числа в диапазоне 0 .. 2**128-1 (где ** — оператор возведения в степень Python). Как видите, в потоке с двумя сегментами диапазон делится поровну между двумя сегментами: первый сегмент содержит хэши до (шестнадцатеричного) 7fffffffffffffffffffffffffffffff, а второй сегмент содержит хеши выше этого значения.

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

echo -n "1" | md5sum
c4ca4238a0b923820dcc509a6f75849b  -

echo -n "2" | md5sum
c81e728d9d4c2f636f067f89cc14862c  -

echo -n "3" | md5sum
eccbc87e4b5ce2fe28308fd9f2a7baf3  -

echo -n "4" | md5sum
a87ff679a2f3e71d9181a67b7542122c  -

echo -n "5" | md5sum
e4da3b7fbbce2345d7772b0674a318d5  -

echo -n "6" | md5sum
1679091c5a880faf6fb5e6087eb1b2dc  -

Итак, вы можете видеть, что значения от «1» до «5» перейдут во второй сегмент, а «6» — в первый. Если вы хотите гарантировать, что все строки некоторого набора таблиц попадут в определенный сегмент, выберите подходящее значение.

Почему это может не дать вам желаемых результатов

Этот метод гарантирует, что все связанные данные попадут в один и тот же сегмент даже после повторного сегментирования.

Однако это не гарантирует порядок. Я подробнее расскажу об этом в этом ответе, но вкратце это то, что порядок, в котором Kinesis принимает записи, не обязательно должен совпадать с порядком, в котором эти записи были созданы.

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

Есть ли в DMS возможность определить этот собственный ключ раздела?

Agilan Selvam 17.05.2024 08:49

Другие вопросы по теме