Erlang OTP takeover

Erlang通过配置,支持takeover。

第一步:
创建一个gen_server, im_chat_ets.erl,takeover要求实现start,stop这两个function,find是callback function用于处理业务。


start() -> gen_server:start_link({global, ?MODULE}, ?MODULE, [], []).

stop() -> gen_server:call({global, ?MODULE}, stop).

find(Who) -> gen_server:call({global, ?MODULE}, {find, Who}).


第二步:
创建一个supervise, im_router_sup

start_link() ->
supervisor:start_link({global, ?MODULE}, ?MODULE, []).

init([]) ->
Strategy = {one_for_one, 1, 10},
{ok,
{Strategy, [
{im_chat_ets,
{im_chat_ets, start, []}, permanent, 5000, worker, [im_chat_ets]}
]}}.


第三步:
创建app文件,im_router_app.erl

-behaviour(application).
-export([start/2,stop/1]).

start(normal, []) ->
im_router_sup:start_link();

start({takeover, _OtherNode}, []) ->
im_router_sup:start_link().

stop(_State) ->
ok.


第四步:
配置app文件,im_router_app.app

{application, im_router_app,
[{description, "im_router_app"},
{vsn, "0.1"},
{modules, [im_chat_ets, im_router_app, im_router_sup]},
{registered, [im_chat_ets, im_router_app, im_router_sup]},
{mod, {'im_router_app', []}},
{env, []},
{applications, [kernel, stdlib, crypto]}]}.


第五步:
创建erlang启动配置文件。
a.config

[{kernel,
[{distributed, [{im_router_app,
5000,
[a@localhost, {b@localhost}]}]},
{sync_nodes_mandatory, [b@localhost]},
{sync_nodes_timeout, 30000}
]
}
].

b.config

[{kernel,
[{distributed, [{im_router_app,
5000,
[a@localhost, {b@localhost}]}]},
{sync_nodes_mandatory, [a@localhost]},
{sync_nodes_timeout, 30000}
]
}
].


至此,代码工作完成。

第六步,启动
在两个console窗口,cd到项目,再分别输入
erl -sname a -config config/a -pa ebin/

erl -sname b -config config/b -pa ebin/


(a@localhost)1> net_adm:ping(b@localhost).
返回pong,说明a到b连通

(b@localhost)1> net_adm:ping(a@localhost).
返回pong,说明b到a连通

第七步,在a,b分别输入
application:start(crypto). 这是takeover必需的application

第八步,在a,b分别输入
application:start(im_router_app).
分别返回ok。由于a.config,b.config文件中将a点作为主点,所以用application:which_applications().查看时将发现im_router_app运行在a点。
例如:[{im_router_app,"im_router_app","0.1"},.......]

至此双机启动完毕。

[size=x-large][b]验证[/b][/size]

[b]情况一:验证Failing Over,im_router_app运行在a点,当a点宕掉后,b点能将im_router_app自动启动。[/b]
1)在a点,输入halt().
2)观察b点,输入application:which_applications().将发现[{im_router_app,"im_router_app","0.1"},.......]

总结,说明a点宕机后,im_router_app程序能在b点自动启动,Failing Over成功。

[b]情况二:验证takeover,a点宕机,im_router_app程序运行在b点,先将a点启动,im_router_app程序将重新运行在a点。[/b]
1)在a点的console窗口,输入 erl -sname a -config config/a -pa ebin/ -eval 'application:start(crypto), application:start(im_router_app)'

2)观察a点,输入application:which_applications().将发现[{im_router_app,"im_router_app","0.1"},.......]

3)观察b点,输入application:which_applications().将发现im_router_app不在运行列表中。

总结,说明a点的启动,能将app程序从b点抢夺回来。takeover成功。

至此,实验完成。

参考文献:
[1] http://learnyousomeerlang.com/distributed-otp-applications
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值