如何将 AWS DMS 的更改放入 AWS KINESIS 中的特定分片

问题描述 投票:0回答:1

我有一个数据库,其中有 40 个表,我正在使用 AWS DMS 从这些表中获取数据更改并将它们推送到其中有 2 个分片的 AWS KINESIS 流中,最终,我的两个消费者应用程序将从Kinesis 并借助自定义逻辑更新相应的数据库。

这里的问题是我找不到如何将记录路由到运动中的特定分片。比如,我需要将前 20 个表放置在分片 1 中,接下来的 20 个表应放置在分片 2 中。但是当我检查文档时,似乎到分片的路由将基于partition_key 的哈希值。

任何人都可以阐明我如何实现这一目标吗?

我尝试了网上和官方文档列出的不同方法,但无法达到我的预期。我想了解它是如何实现的,或者至少想知道这是否可以实现。

amazon-web-services amazon-kinesis aws-dms
1个回答
0
投票

将记录发送到多分片流中的单个分片的方法是使用相同的分区键。

此处所述,Kinesis 采用分区键值的 MD5 哈希来分配分片。每个分片都有一系列分区键,您可以通过

DescribeStreams
API 获取这些分区键。例如,以下是 2 分片流的分区范围:

[
  {
    "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”将进入第一个分片。如果您想确保某些表集的所有行都进入特定分片,请选择适当的值。

为什么这可能不会给你想要的结果

此技术可确保所有相关数据都进入同一个分片,即使在重新分片之后也是如此。

但是,它不保证订单。我在 this answer 中详细讨论了这一点,但简短的版本是 Kinesis accepts 记录的顺序不必与这些记录的生成顺序相匹配。

适用于您的情况的最可能原因是 Kinesis 可能会拒绝来自

PutRecords
请求的单个记录,通常是因为分片已达到其写入限制。如果您将更改数据捕获事件输入到流中,那么针对基础表的大量活动可能会导致这种情况发生。

© www.soinside.com 2019 - 2024. All rights reserved.