2015-05-28 21 views
0

我们在每个数据中心都有6台计算机,我们有三个数据中心。我们的应用服务器部署在所有数据中心的每台机器上。我们在所有三个数据中心都部署了每个应用服务器的缓存层。如何在特定的ID上分割系统基础?

现在我们需要做的是:

  • 我们需要分片“客户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时,人们通常如何解决这类问题。

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

+0

我从非常低级的角度出发,因为我对这类主题的唯一体会仅限于实现具有非常低级C代码的实时目标的可伸缩服务器。但对我来说听起来好像将每个客户记录存储在单独的文件中可能会有点瓶颈,再加上实际上更多的负担来维护磁盘碎片等问题。在低级别避免这种情况的一种常见方法是将所有数据放入一个单一的大二进制文件中...... –

+0

...它可以存储标题,例如包含客户ID后跟客户ID和绝对的文件偏移量来寻求这些数据(如果它只是一个档案而不是搜索结构)。您可以只将该标题存储到内存中,以便能够在给定客户ID的情况下快速找到文件中的正确位置。因此,除了可以使用单个文件备份该计算机的所有客户外,您还应该获得比许多文件更好的性能,同时减少了查找开销,例如, –

+0

@lke您提到的结构正是您对每个文件的内容。这只是我们有几个这样的文件,以便我们可以分割我们的系统基础。 – user1950349

回答

0

有,我们能适应分片在每个机器 客户ID在所有三个数据中心,而不是使用 此预定义1780个文件概念的任何简单的方法?

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

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

相关问题