Erlang中的高可用性?

问题描述 投票:0回答:1

在Erlang中实现高可用性的典型方法是什么?

我们假设某些gen_server在本地注册为?MODULE。给定N由独立的Erlang节点独立并互连,每个节点都运行该gen_server的实例,如何1)确保不会因某个参与节点的故障而丢失请求(只要其中至少一个在线) ),2)对它们进行负载平衡,以避免某些节点过载而另一些节点挂起等待新消息?据我所知,没有内置的负载均衡器:pg2或更新的pg都不够(仍然可能是在此方向上进一步开展工作的良好基础)。

我敢打赌这是一个普遍的问题,并且确实存在经过实践检验的“ Erlangish”解决方案。他们是什么?

erlang load-balancing high-availability
1个回答
0
投票

我认为1)具有一次保证,您需要某种分布式事务算法,因为连接可能会失败,并且您不知道远程节点中的请求状态:远程节点是否死亡?它是否还活着并且由于网络故障而刚刚断开连接?在失败之前,请求处理进行了多长时间?您应该检查mnesia,它已与Erlang紧密集成。

[如果您放宽对1的要求)(例如,如果请求是幂等的。您只关心一次或失败很少见),它可以满足monitoring远程gen_server的需要,如果由于某种原因与远程服务器的连接丢失,则重播请求。

对于2,我们在节点前面以最小连接方式使用haproxynginx Web服务器,尽管我相信您的意思是“内部” Erlang。在这种情况下,我将执行以下操作以获取带有负载信息的本地ETS:

  1. 具有MODULE补充信息,可将本地MODULE的邮箱大小(或其他指标)定期广播到群集中的其他补充信息。
  2. 如果伙伴收到此广播,它将原始节点和大小写入ETS(a)或仅在内部保存它们并暂时将最不忙的内容存储在ETS中
  3. 如果伙伴发现远程节点断开连接,它将更新ETS

关于OTP23's pg,不要轻易丢弃。通过文档Process Groups implement strong eventual consistency.,您可能已使服务器超负荷,暂时离开了进程组,它们最终将停止接收请求。您可以按节点设置多个具有低触发率的服务器,以使组更均匀地分布。

© www.soinside.com 2019 - 2024. All rights reserved.