如何在特定id上分享系统基础?

时间:2015-05-28 05:12:13

标签: java architecture scalability partitioning

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

现在我们需要做的是:

  • 我们需要在“customer 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时,我试图了解人们如何解决这类问题。

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

1 个答案:

答案 0 :(得分:0)

  

是否有任何简化的方法我们可以适应shard the   所有三个数据中心的每台机器上的客户ID代替   使用这个预定义的1780文件概念?

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

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