使用DIY分片策略与Amazon RDS协同工作

4
我正在尝试构建以下的分片策略。假设我有一个BOXES和ITEMS表,每个箱子可以有几个物品。我将与同一BOX相关的物品放在单独的机器上。
box_id主键包含:server_type(例如100)+shard_id+total_amount_of_boxes_per_user total_amount_of_boxes_per_user存储在每个用户的数据库中,每次用户插入新的箱子时,我都会将其加1。
服务器类型100将与存储盒子+物品数据的服务器列表相匹配。这个服务器类型->分片关系列表应该位于一个中央位置,我考虑将其作为文档存储在DynamoDB上。
DynamoDB上的配置文档:
boxitems_servers[
 {shard_id: 1,  is_locked: false, hostname: 127.0.0.1}
 {shard_id: 2, is_locked: false, hostname: 127.0.0.2}
 {shard_id: 3, is_locked: false, hostname: 127.0.0.3}
 {shard_id: 4, is_locked: false, hostname: 127.0.0.4}
]

我对数据库和应用程序层进行了建模,因此不需要进行联接操作。最多只需要对数据库进行几次查询,但这些查询将在服务器和客户端被缓存。

我正在使用MySQL,并在ASP.NET 4.5中开发我的应用程序。

当用户访问页面时:

http://domain.com/1000014294967295

我可以读取数据,拆分并获得以下内容:
服务器类型 = 100 分片ID = 001 每个用户的盒子总数 = 4294967295(当然可以少得多,但它是整数值)
我从DynamoDB获取boxitems_servers文档,仅获取server_type的文档。所以server type 100 = boxitems_servers。
我根据主机名(凭据在web.config中)建立与分片的连接,并基于主键1000014294967295查询数据。
我可以通过在配置文档中放置is_locked: true来决定锁定特定的分片。因此,在编写数据(而不是更新)时,它将仅写入未锁定的分片。
我将使用shard_id % number_of_active_shard上的MODULU均匀分布数据到几个分片中。
现在,如果我想添加另一个Amazon RDS数据库进行水平扩展,我只需通过之前创建的Amazon AMI创建具有相同模式的数据库,并将服务器添加到分片列表中。
boxitems_servers[
 {shard_id: 1,  is_locked: false, hostname: 127.0.0.1}
 {shard_id: 2, is_locked: false, hostname: 127.0.0.2}
 {shard_id: 3, is_locked: false, hostname: 127.0.0.3}
 {shard_id: 4, is_locked: false, hostname: 127.0.0.4}
 {shard_id: 4, is_locked: false, hostname: 127.0.0.5} <- NEW ONE
]

亚马逊RDS已经具备了复制功能,所以我不需要担心这个。备份/恢复也很容易。

我唯一的担忧是:

  • 从不同分片读取分页数据,考虑到数据不均匀分布的情况
  • 检索排序后的数据

我需要什么:我想知道您对这种策略的看法。我想建立一种插拔式架构,可以使用亚马逊RDS,并通过添加更多机器和更新配置文件轻松扩展。这应该可以在运行中工作,而无需任何停机时间。

我不想花费成千上万的美元去购买所有那些昂贵的解决方案。我相信可以构建一个良好的分片解决方案,以适应我的应用程序需求,其中只有几个表格,并且已经进行了去规范化以防止连接。亚马逊RDS已经提供了我需要的复制功能。

我还可以创建逻辑分片,每个分片ID可以更改为指向另一个数据库机器(IP地址),但是当我查询“叶子”时,如果在那里找不到数据,则需要向上移动并查询其他分片,直到找到数据为止。

我认为这可以导致一个很好的分片策略,它有其局限性,但对于高流量的网站来说可以工作得相当不错(我认为)。

1个回答

4
我认为MOD策略不是最好的选择,因为如果您添加一个节点,就必须将每个记录移动到另一个数据库(这是一个不好的选择)。更好的选择(比如Cassandra)是对键进行哈希并将整个键空间分成块。
例如,如果哈希在十六进制中给出0到FFFF之间的答案(应该是完整的MD5或SHA1)
  • 从0到0FFF在节点1中。
  • 从1000到4FFF在节点2中
  • 从5000到8FFF在节点3中
  • 从9000到CFFF在节点4中
  • 从D000到FFFF在节点5中
这样,如果您要查找单个记录,则只需请求该节点,如果需要更多记录,则可能需要请求所有节点。这取决于您选择用于定位数据的键(它不需要匹配主键)
如果您需要添加更多节点,只需拆分您在节点3中拥有的内容即可。在上面的示例中,您可以在节点3中保留从5000到6FFF,从7000到8FFF则移到新的节点6中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接