我正在构建一个使用poolboy进行连接池的Erlang应用程序,并epgsql与PostgreSQL进行对话。
我想处理PostgreSQL故障转移,我想知道构建我的应用程序的最佳方法是什么。
我应该还是可以:
答案 0 :(得分:1)
使用epgsql
,当主服务器关闭时,套接字连接将中止。由于连接过程链接到工作进程,因此工作进程终止并由主管重新启动。
因此,您所要做的就是(在my_worker:init
中)处理来自pgsql:connect
的错误,并改为连接到备用服务器:
case pgsql:connect(Primary, Username, Password, Opts) of
{ok, C} -> {ok, #state{conn=C}};
_Other -> pgsql:connect(Standby, Username, Password, Opts)
end.
在我的(粗略地说是非常粗略的)测试中,这似乎工作得很好。
答案 1 :(得分:0)
我做同样的事情来处理redis连接故障转移(我没有使用poolboy),你可以将它与你的情况进行比较:
-record(redis_conn {
Host,
Port,
User,
Pwd
}).
-record(state{
redis_connections :: dict()
}).
假设您在init函数中启动连接并记录状态:
State#state{
redis_connections=Conn
}.
每当连接失败时,您会捕获“EXIT”信号,然后重新连接。
所以你有所有的状态。