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"},.......]
至此双机启动完毕。
验证
情况一:验证Failing Over,im_router_app运行在a点,当a点宕掉后,b点能将im_router_app自动启动。
1)在a点,输入halt().
2)观察b点,输入application:which_applications().将发现[{im_router_app,"im_router_app","0.1"},.......]
总结,说明a点宕机后,im_router_app程序能在b点自动启动,Failing Over成功。
情况二:验证takeover,a点宕机,im_router_app程序运行在b点,先将a点启动,im_router_app程序将重新运行在a点。
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
分享到:
相关推荐
erlang otp25 win安装包
erlang otp学习文档 学习还不错的
Erlang OTP并发编程实战高清非扫描版,基于一个simple cache深入浅出讲解erlang otp的使用。
Erlang/OTP Application完整例子,含代码和二进制,对于学习Erlang/OTP Application很有帮助。 配套文章http://blog.csdn.net/mycwq/article/details/12610677
Erlang otp_src_20.3.tar.gz linux centos otp-OTP-20.0.tar.gz 可兼容rabbitmq3.7.0
erlang_otp_win64_25.0
Erlang otp_win64_21.2.exe是目前Erlang otp win64位的最新版本。
erlang OTP Design Principles之Gen中文erlang OTP Design Principles之Gen中文
Erlang opt_win64 20.2 windows exe 安装包 Erlang 20.2 is the upcoming version of Erlang For Windows x64 installer 截至2018.01.25 groovy最新最稳定版本
Erlang OTP 20.1 Windows 64-bit Binary File 下载地址:http://www.erlang.org/downloads
Erlang OTP并发编程实战(中文版).pdf,不可多得的好书。
Erlang otp_win64_20.1.exe是当前最新版本的,更新时间2017-10-26
[Manning Publications] Erlang OTP 并发编程实战 (英文版) [Manning Publications] Erlang and OTP in Action (E-Book) ☆ 出版信息:☆ [作者信息] Martin Logan, Eric Merritt, Richard Carlsson [出版机构] ...
erlang otp in action 代码
Erlang otp_win64_22.0.exe
《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...
Erlang OTP 设计原理文档 概述: 在Erlang/OTP中有一个基本概念叫监督树。这是一种建立在督程与佣程思想上的进程结构化模型。
Erlang 20.1 is the upcoming version of Erlang For Windows x86 installer 截至2017.11.09 groovy最新最稳定版本 MD5: a5d93dbe77cc28f791fa56a1b1bed0a8 大小:91.1 MB
erlang otp 19.1 官网文档 HTML格式 官网的下载是真的糟糕。
rabbitmq安装前的环境安装,Erlang23.0 Windows64安装包,官网下载了几个小时