`
langzhe
  • 浏览: 286868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang应用部署与热代码替换--理解1

阅读更多

 

 

 

最近几天看了一下erlang的代码热替换,原本计划三天。现在花了快5天了,才刚刚有点对头。

开始我搜了一下,没有找到前人的例子,Erlang程序设计上面的热代码替换例子只不过是个替换思想,实际的应用替换要复杂的多。

我只好从API gen_server中Module:code_change/3开始看。找到OTP Design Principles (http://www.erlang.org/doc/design_principles/release_handling.html#instr)

。本以为就可以解决此问题了,后来发现只不过是个小小的救命草,接下来看了Release Handling,Releases,Appup Cookbook,systools,reltool等。

整个过程遇到了unpacke_release,install_release两个最耽误时间错误。

出现unpacke_release,install_release操作错误的原因是我没有发布第一个版本,(创建第一个版本:http://www.erlang.org/doc/system_principles/create_target.html)。

应用部署与热替换大体步骤:

一、发布第一个版本 (详细参考:http://www.erlang.org/doc/system_principles/create_target.html)

 1>创建 发布.rel文件

 

 {release,
 {"sellaprimeA", "1"},
 {erts, "5.7.5"},
 [{kernel, "2.13.5"},
  {stdlib, "1.16.5"},
  {sasl, "2.1.9"},
  {sellaprimeA,"1.0"}]}.
 

 

 2>创建第一个发布版本程序

   target_system:create("sellaprimeA").

 3>安装

   target_system:install("sellaprimeA", "/usr/local/target_sellaprime").

 4>启动程序

   /usr/local/target_sellaprime/bin/erl -boot /usr/local/target_sellaprime/releases/1/start

  留心:需要注意的是 target_system.erl 并没有在erlang lib中 ,需要自安添加编译。

二、代码热替换 (详细参考:http://www.erlang.org/doc/design_principles/release_handling.html#id2273657)

 1>创建 发布.rel文件

 2>创建 启动脚本 systools:make_script/1

 3>创建 relup文件 systools:make_relup/3

 4>创建 tar包 systools:make_tar/1

 5>复制到发布目录下

 6>解包 release_handler:unpack_release/1

 7>安装 release_handler:install_release/1

 8>持久化 release_handler:make_permanent/1

 9>删除老的版本 release_handler:remove_release/1

 

三、未解决的问题:

 1> 执行 unpacke_release、install_release函数操作时,必须在特定的shell下,就是启动一个发布程序的shell下。

    如果我是在noshell下启动的话,我就无法执行热代码替换了。有没有其他方法?请老师赐教,谢谢!

    如我必须在/usr/local/target_sellaprime/bin/erl -boot /usr/local/target_sellaprime/releases/1/start启动的shell。

 2> 更新 new_area_server.erl模块时,state状态丢失,即ets:new(?MODULE,[])内存表被清空。

    根据API中的设计原则上配置的sellaprime.appup(我没有看出哪里有错).

 

Erlang 写道
sellaprime.appup
{"6",
[{"5",[{update, new_area_server,{advanced,Extra}}]}],
[{"5",[{update, new_area_server,supervisor}]}]
}.
 

 

-module(new_area_server).
-behaviour(gen_server).

-export([area/1, start_link/0]).

%% gen_server callbacks

-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
         terminate/2, code_change/3]).

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

%% @type Thing()=autom()
%% @doc langxianzeu
area(Thing) ->
    gen_server:call(?MODULE, {area, Thing}).

init([]) ->
    %% Note we must set trap_exit = true if we 
    %% want terminate/2 to be called when the application
    %% is stopped
    process_flag(trap_exit, true),
    io:format("~p starting add ets table~n",[?MODULE]),
    {ok, ets:new(?MODULE,[])}.

handle_call({area, Thing}, _From, State) ->
        Reply = compute_area(Thing),
        ets:insert(State,{Thing,Reply}),
        io:format("~n==[handle_call]=======tab=~p=====~n",[ets:tab2list(State)]),
        {reply, Reply, State}.

handle_cast(_Msg, N)  -> {noreply, N}.

handle_info(_Info, N)  -> {noreply, N}.

terminate(_Reason, _N) ->
    io:format("~p stopping~n",[?MODULE]),
    ok.

code_change(_OldVsn, N, _Extra) -> {ok, N}.

compute_area({square, X})       -> io:format("~n===[new_area_server:compute_area-code_chanage-06~p~n====",[X*X]),X*X;
compute_area({rectongle, X, Y}) -> X*Y.
 

 

 3> 当 new_area_server中的(改变进程状态的存储方式)

    init([]) ->

    process_flag(trap_exit, true),

    io:format("~p starting add ets table~n",[?MODULE]),

    {ok, 0}.

    替换为

    init([]) ->

    process_flag(trap_exit, true),

    io:format("~p starting add ets table~n",[?MODULE]),

    {ok,

    ets:new(?MODULE,[])

    时如何保存以前的状态

 

4> 其他模块的热替换还没有实践,继续实践!

 

 

 

5>

release_handler:unpack_release("ch_rel-2").

{error,{enoent,"/opt/target/releases/ch_rel-2.rel"}}

出现上面error的其中一个原因就是权限不足,需要用root权限

 

 

0
1
分享到:
评论

相关推荐

    Erlang应用部署与热代码替换--理解2

    Erlang是一种面向并发的、轻量级的、函数式编程语言,...总之,理解和掌握Erlang的应用部署与热代码替换对于开发高可用、高并发的系统至关重要。通过实践和不断学习,我们可以利用这些特性构建出更健壮、更灵活的系统。

    Erlang 中的Module级别热部署

    在Erlang编程环境中,模块级别的热部署是一项关键特性,它允许开发者在不中断系统运行的情况下更新或替换已加载的模块。这对于实时系统和高可用性服务尤其重要,因为它们需要持续提供服务而不能因为代码更新而停机。...

    erlang 深度分析

    - **应用场景**: 代码的热替换场景。 #### 21. Erlang消息监听器调试 - **工具**: `erl_snooper`。 - **功能**: 监听Erlang进程之间的消息传递。 - **应用场景**: 调试复杂的分布式系统。 #### 22. Erlang网络程序...

    erlang-23.3.4.11-1.el7.x86-64.zip

    4. **热代码替换**:Erlang支持在不中断服务的情况下更新运行中的代码,这是其高可用性的一个关键特性。这使得开发者可以在生产环境中修复bug或优化性能而无需停机。 5. **模式匹配**:Erlang的函数调用允许模式...

    erlang深度分析

    6. **热更新**:Erlang系统支持运行时代码替换,无需停止服务即可更新或升级系统,这对于保持服务连续性至关重要。 7. **OTP(Open Telecom Platform)**:OTP是Erlang的标准库,提供了一套用于构建可靠、可扩展、...

    erlang深度分析.pdf

    热部署和代码替换 热部署(hot code replacement)是Erlang的一大特色,使得在不停机的情况下更新系统成为可能。这对于维护和升级大规模运行的应用系统尤其重要。 #### 12. IO和并发 Erlang的IO系统与其它语言相比...

    Erlang程序设计中文版

    Erlang以其强大的错误恢复能力、热代码替换以及对大规模并发的支持而闻名,是构建高可用性、容错性强的系统的一个优秀选择。 在本书中,读者将了解到Erlang的核心概念和语法特性,包括: 1. **函数式编程基础**:...

    erlang 学习笔记1

    同时,Erlang社区提供了许多工具,如Rebar3和ERTS(Erlang Run-Time System),它们对于构建、测试和部署Erlang应用至关重要。 【压缩包子文件的文件名称列表】"rw_file"可能表示这个压缩包包含了一些关于读写文件...

    erlang_otp_win64_22.1.zip

    4. **热更新**:Erlang OTP提供了代码替换(Code Replacement)功能,允许程序在运行时升级代码而无需停机,这在维护大型系统时非常关键。 5. **模式匹配**:Erlang的函数调用支持模式匹配,使得代码更加简洁和易于...

    erlang 24.2安装包

    此外,Erlang还支持热代码替换,使得在不中断服务的情况下更新应用程序成为可能。 Erlang的BEAM虚拟机是其运行时系统的核心,负责管理内存、调度进程和执行代码。理解BEAM的工作原理对于编写高效、健壮的Erlang代码...

    RabbitMQ+Erlang.rar

    Erlang采用函数式编程范式,提供了轻量级进程、热代码替换和故障隔离等特性,使得在RabbitMQ这样的系统中处理大量并发连接和快速消息交换变得可能。 RabbitMQ的安装通常包括两个主要步骤:首先,你需要安装Erlang...

    RabbitMQ+Erlang.zip

    Erlang以其轻量级进程、热代码替换以及内置的分布式计算能力而著称,这些特性使其成为构建高可用性和容错性的网络应用的理想选择。`otp_win64_24.0.exe`是Erlang/OTP(Open Telecom Platform)的Windows 64位版本,...

    Erlang程序设计.pdf

    - **分布式编程**:Erlang内置了对分布式系统的支持,可以很容易地将进程部署到不同的节点上,并通过网络进行通信。 通过以上介绍,我们不难看出,Erlang作为一种专为高并发、容错性强的应用场景设计的语言,其核心...

    erlang+rabbit.rar

    2. **热代码升级**:开发者可以在运行时替换和更新代码,无需重启系统,这对于维护大规模服务至关重要。 3. **故障恢复**:Erlang的错误处理机制鼓励进程间隔离,一个进程的崩溃不会影响其他进程,增强了系统的健壮...

    erl-templates:Erlang 模块模板

    在实际开发中,结合版本控制系统(如 Git)和持续集成/持续部署(CI/CD)流程,Erlang 模块模板可以进一步提升开发效率和代码可维护性。开发者可以将模板与项目代码一起版本化,确保在项目的不同阶段都能保持代码...

    erlangsoft.rar

    Erlang以其强大的并发处理能力、轻量级进程、热代码替换以及高效错误恢复机制而闻名。在现代IT行业中,Erlang被广泛应用于实时系统、大规模并发服务、云计算平台以及分布式数据库等领域。 "erlangsoft.rar"是一个...

    erlci:用Erlang编写的CI服务器。 NSWIDY(不确定我在做什么)

    2. **热代码替换**:Erlang 支持运行时代码更新,无需停止整个系统,这对于CI服务器来说意味着可以在不影响服务的情况下进行升级和调试。 3. **分布式**:Erlang系统可以轻松地跨多台机器分布式部署,这对于构建...

    elixir中文入门文档

    - **Mix简介**:Mix是Elixir的官方构建工具,用于编译、打包、部署Elixir应用程序。 - **Mix常用命令**:如`mix new`用于创建新项目,`mix compile`用于编译项目等。 #### 十五、元编程 - **元编程概念**:元编程...

    卡祖·坎普

    3. **热代码替换**:Erlang支持在运行时更新代码,无需停机即可升级系统,这对于维护大型服务至关重要。 4. **简单错误处理**:Erlang使用模式匹配和异常处理机制,使得错误处理更加直观和简洁。 5. **OTP(Open ...

Global site tag (gtag.js) - Google Analytics