试图build立一个石墨/碳集群。 我有一个弹性负载平衡器,可以引导群集中两个节点之间的stream量,每个节点都有一个Web应用程序,中继和caching。
在本例中,我向Metric1发送了1000个计数。
这是一张图表:

问题
如上图所示,每个服务器大约有一半的实际度量值。 当通过networking应用程序查询时,它只返回实际计数的一半。 根据这个奇妙的post ,这是预期的行为,因为networking应用程序返回它看到的第一个结果。 这意味着(并logging在案)只有完整的计数应该存储在节点上(在我的例子中,一个或两个节点应该有1000)。
所以我的问题似乎是不正确的计数分解和复制。 在我上面的例子中,当一个新的计数来自networking,它可以被redirect到NodeA或NodeB。 我曾经假devise数可以通过任何继电器进入集群。 为了testing这个假设,我从集群中删除了负载均衡器,并将所有传入计数指向NodeA的中继。 这工作:完整的计数出现在一个节点,然后复制到第二个,完整的计数从Web应用程序正确返回。
我的问题
carbon-relay似乎充当应用级负载均衡器。 这很好,但是我担心当入站stream量变得太大时,使用单个carbon-relay作为负载平衡器将成为瓶颈和单点故障。 我更愿意使用实际的负载均衡器来平均分配群集中继中的传入stream量。 然而, carbon-relay似乎并不好,因此上述问题。
carbon-relay放在自己的盒子上作为负载平衡器? 事实上,我的configuration文件的DESTINATIONS实际上是通过错误的端口号#指向carbon-cache而不是另一个carbon-relay 。 修复configuration,以实际上代表图中的问题似乎解决了这个问题:数据现在完全forms出现在每个节点(复制后)。
但是,作为一个注意事项,我现在正面临着来自Web应用程序的呈现API的不一致结果的问题,详见本问题 。 它可能会或可能不会涉及到上面详细的configuration。
你有什么是权威问题。 使用Whisper,每个时间序列数据库都需要被一个碳caching守护进程拥有,否则就会遇到一致性问题。 碳中继试图通过始终将相同的时间序列发送到相同的端点来解决这个问题。 您可以使用基于正则expression式的规则引擎或通过使用一致性散列来执行此操作。
我的build议是不要过度devise问题,扩大规模,直到你不能再扩大规模。 我们有一个单一的碳中继器,每60秒处理350,000个指标,在一个5年的Westmere EP核心上没有任何问题。 如果使用一致的散列,那么找出向下游路由的path是非常低成本的操作。 如果你使用的是大量的正则expression式规则,那么很多string匹配,你可以更快地打到性能墙。
Whisper数据库不是特别高效的。 很有可能,在继电器开始给你提供问题之前,你将会遇到一个I / O性能瓶颈。 你完全超越了你的架构。
如果您确实需要扩展到单个节点所能提供的范围之外,则可以根据客户端configurationpipe理逻辑路由到特定的中继,也可以设置一个ELB,将其路由到多个中继,每个中继运行在相同的一组规则和路由指标到相同的端点。 我相信这将需要你使用基于正则expression式的匹配,但是如果你的中继是相同的版本,一致的哈希也可能工作。 我从来没有testing过这种方法。