使用poolboy和epgsql进行PostgreSQL故障转移

时间:2013-12-19 20:20:43

标签: erlang

我正在构建一个使用poolboy进行连接池的Erlang应用程序,并epgsql与PostgreSQL进行对话。

我想处理PostgreSQL故障转移,我想知道构建我的应用程序的最佳方法是什么。

我应该还是可以:

  • 为每个PG对等体提供一个池,并处理上面的poolboy。那就是:当我检测到原始PG服务器关闭时,我可以杀死池吗?是否有一种Erlang-idiomatic方式来决定哪个池还活着?
  • 当我检测到PG服务器关闭时,杀死并重启工作人员?有没有惯用的方法呢?
  • 让我的工作人员从一台PG服务器故障转移到另一台PG服务器吗?
  • 别的什么?

2 个答案:

答案 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”信号,然后重新连接。

所以你有所有的状态。