【问题标题】:How to shard system basis on a particular id?如何根据特定 id 对系统进行分片?
【发布时间】:2015-08-10 10:31:28
【问题描述】:

我们在每个数据中心有一个由 6 台机器组成的系统,我们有三个数据中心。我们将应用服务器部署在所有数据中心的每台机器上。我们还在所有三个数据中心部署的每个应用服务器中都有缓存层。

现在我们需要做的是:

  • 我们需要根据长数据类型“客户 ID”对系统进行分片。这意味着 - 每个数据中心中的每台机器都应该负责特定的“客户 ID”。
  • 在每个数据中心,我们将保存每个“客户 ID”数据的两个副本以避免 SPOF。假设我们要获取 1234 客户 id 的数据,那么首先它将转到具有 1234 客户 id 数据的主机,但是假设这台主机停机,那么它将转到同一数据中心中的辅助机器获取相同客户 ID 的数据。

目前我们的系统是这样设计的:

我们有 1780 个内存映射文件,每个文件只保存一组特定的 customer id's 数据。每台机器负责特定的内存映射文件,并在此基础上对系统进行分片。一般来说,每台机器负责大约 150 个主文件和 150 个辅助文件,因此在此基础上,每台机器都知道我正在服务的客户 ID 数据,并且我们的客户知道为特定客户 ID 调用哪台机器。

我的问题是,我们在这里使用文件作为概念,在所有三个数据中心之间分割“客户 ID”。我不确定这将如何扩展。我正在研究 Cassandra 架构以及他们如何在内部进行操作,他们使用"vnodes" 和令牌范围来划分数据。

问题:-

是否有任何简化的方法可以让我们适应在所有三个数据中心的每台机器上对客户 ID 进行分片,而不是使用这个预定义的 1780 个文件概念?到目前为止,这个系统运行良好,但问题是我们正在考虑使用 Kafka,我相信如果我们有 1780 个分区,Kafka 的性能会下降。因此,我试图了解当我们需要在数据中心的所有机器上分割客户 ID 时,人们通常如何解决这类问题。

注意:我们不能让每台机器都保存所有客户的数据,因为我们有很多数据无法存储在单台机器的内存中,因此我们在所有数据中心之间进行分片。

【问题讨论】:

  • 我是从非常底层的角度出发的,因为我对这类主题的唯一经验仅限于使用非常底层的 C 代码实现可伸缩服务器以实现实时目的。但在我看来,将每个客户记录存储在单独的文件中可能会有点瓶颈,而且实际上可能会增加维护负担,因为需要担心磁盘碎片等问题。在底层避免这种情况的一种常见方法是将所有数据放入一个大的二进制文件中......
  • ... 它可以存储一个标头,例如,包含客户数量,后跟客户 ID 和绝对文件偏移量,以便获取该数据(前提是它只是一个存档而不是搜索结构)。您可以只将该标题存储到内存中,以便能够在给定客户 ID 的情况下快速到达文件中的正确位置。有了它,除了可以使用单个文件来备份该机器的所有客户之外,您还应该获得比许多文件更好的性能,同时减少搜索开销,例如
  • @lke 您提到的结构正是您为每个文件所拥有的结构。只是我们有几个这样的文件,因此我们可以在此基础上对系统进行分片。

标签: java architecture scalability partitioning


【解决方案1】:

是否有任何简化的方法可以让我们适应分片 所有三个数据中心中每台机器的客户 ID,而不是 使用这个预定义的 1780 文件概念?

好吧,这听起来可能太容易了,但我可以提出以下建议。

您共有T 台机器来为您的客户数据库提供服务。你给你的机器编号0...T-1。现在您将属于 ID = N 的客户的所有信息放入机器 #N mod T 和 #(N-1) mod T。这是我能想象到的最简单的分片键,但如果您需要,它可能会更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2018-04-02
    • 2022-11-19
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多