У меня есть база данных, содержащая 40 таблиц, и я использую AWS DMS для извлечения изменений данных из этих таблиц и передачи их в поток AWS KINESIS, в котором есть 2 сегмента, и в конечном итоге два моих потребительских приложения будут считывать данные из Kinesis. и обновлять соответствующие базы данных с помощью пользовательской логики.
Проблема здесь в том, что я не смог найти, как сделать так, чтобы записи направлялись на конкретный шард в kinesis. Мол, мне нужно, чтобы первые 20 таблиц были помещены в шард 1, а следующие 20 должны быть размещены в шарде 2. Но когда я проверил документацию, оказалось, что маршрутизация в шард будет основана на хеше раздела_ключа.
Может ли кто-нибудь пролить свет на то, как я могу этого добиться?
Я пробовал разные подходы, перечисленные в Интернете и официальной документации, но не смог добиться того, чего ожидал. Я хочу понять, как этого можно достичь или хотя бы хочу знать, можно ли этого добиться или нет.
Я хочу, чтобы потоковые изменения данных происходили в исходной таблице и на стороне потребителя, я могу читать их и обновлять целевую базу данных с помощью специальной логики. Почему я хочу, чтобы определенные таблицы находились в одном конкретном сегменте, так это то, что эти таблицы связаны друг с другом, и я хочу, чтобы они были в определенном порядке, поэтому я не хочу, чтобы они разделялись по сегментам, и это приводит к неправильному порядку событий.





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