在Erlang中实现高可用性的典型方法是什么?
我们假设某些gen_server
在本地注册为?MODULE
。给定N
由独立的Erlang节点独立并互连,每个节点都运行该gen_server
的实例,如何1)确保不会因某个参与节点的故障而丢失请求(只要其中至少一个在线) ),2)对它们进行负载平衡,以避免某些节点过载而另一些节点挂起等待新消息?据我所知,没有内置的负载均衡器:pg2
或更新的pg
都不够(仍然可能是在此方向上进一步开展工作的良好基础)。
我敢打赌这是一个普遍的问题,并且确实存在经过实践检验的“ Erlangish”解决方案。他们是什么?
我认为1)具有一次保证,您需要某种分布式事务算法,因为连接可能会失败,并且您不知道远程节点中的请求状态:远程节点是否死亡?它是否还活着并且由于网络故障而刚刚断开连接?在失败之前,请求处理进行了多长时间?您应该检查mnesia,它已与Erlang紧密集成。
[如果您放宽对1的要求)(例如,如果请求是幂等的。您只关心一次或失败很少见),它可以满足monitoring远程gen_server
的需要,如果由于某种原因与远程服务器的连接丢失,则重播请求。
对于2,我们在节点前面以最小连接方式使用haproxy或nginx Web服务器,尽管我相信您的意思是“内部” Erlang。在这种情况下,我将执行以下操作以获取带有负载信息的本地ETS:
MODULE
补充信息,可将本地MODULE
的邮箱大小(或其他指标)定期广播到群集中的其他补充信息。关于OTP23's pg,不要轻易丢弃。通过文档Process Groups implement strong eventual consistency.
,您可能已使服务器超负荷,暂时离开了进程组,它们最终将停止接收请求。您可以按节点设置多个具有低触发率的服务器,以使组更均匀地分布。