- 浏览: 333151 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
Release Handling
Erlang的Release Handling, 充分利用Erlang的code hot swap特性, 让你的应用可以比较顺畅的进行升级,回退.
tiny-2.0
tiny-1.0已经成功的部署到了 /opt/local/tiny-1.0/ 目录. 最近,我们对tiny进行了改进, 准备要发布tiny-2.0. 我们在回想一下tiny-1.0, 在开始的时候提及过其不是一个真正的OTP application, 其没有supervisor, 没有gen_server等 OTP behavior. 在tiny-2.0中我们准备弥补这个"过错". 让tiny app更加的潇洒一些.
在tiny-2.0中,我们加入一个 src/tiny_server.erl , 其为用户提供 key-value 管理服务(gen_server). 在State中通过dict来保存所有的key-value pairs, 在这里就不罗列代码了, 你可以从附件的tiny-2.0中获取.
其主要接口如下:
%% @doc add the key value to server add(Key, Value) -> gen_server:call(?SERVER, {add, Key, Value}). %% @doc delete the key from the server delete(Key) -> gen_server:call(?SERVER, {delete, Key}). %% @doc get all the key-value list all() -> gen_server:call(?SERVER, {all}).
参照tiny-1.0,编译代码, 修改tiny_app.app和tiny-2.0.rel文件.
tiny_app.app:
{application, tiny_app, [{description, "tiny app 2.0"}, {vsn, "2.0"}, {modules, [tiny, tiny_server]}, {registered, [tiny_sup, tiny_server]}, {applications, [kernel, stdlib, sasl]}, {mod, {tiny, []}} ] }.
tiny-2.0.rel:
{release, {"tiny app release", "2.0"}, {erts, "5.6.5"}, [{kernel, "2.12.5"}, {stdlib, "1.15.5"}, {sasl, "2.1.5.4"}, {tiny_app, "2.0"} ]}.
现在tiny-2.0的目录结构和tiny-1.0一样.
书写appup文件
tiny-2.0的目的是为了升级tiny-1.0, 需要进行Release Handling.
SASL提供了进行代码热升级回退的基本框架, 因此需要支持这一特性的系统,必须包含: kernel, stdlib和sasl.
一个完整的产品的发布周期如下:
- 制作Release, 部署到目标机器 A(请参照前面章节)
- 对代码进行bug修正,或功能完善,生成新的代码
- 书写对应的.app文件和.rel文件
- 对于每个修改过的application,书写对应的.appup文件, 此文件尤为重要, 其描述了application如何从一个版本,升级或回退到另一个版本.
- 基于所有的.appup文件, 我们可以生成针对整个release的relup文件(通过releash_hanlder模块自动生成) (一个release会包含很多applications), 这个文件描述Release如何从一个版本升级或回退到另一个版本
- 制作一个新的Release, 然后放置到待升级的目标机器 A
- 在A中, 通过sasl的release handler模块对新的Release进行解压
- 通过release hanlder执行relup文件安装新的Release.(可能包含很多操作)
- 如果安装成功,现在新的Release成为默认版本.
系统不同的版本之间,推荐使用跨度比较小的多次升级, 而不是大相径庭的"一步到位", 因为 如果升级过程太复杂,那么系统出错的概率越高, 不可用的时间也越长.所以推荐平缓的小步升级. 更加详细的文档请参考 Release Handling .
好的理论说了一堆,现在该干实事了.
.appup文件的格式如下:
{Vsn, [{UpFromVsn1, InstructionsU1}, ..., {UpFromVsnK, InstructionsUK}], [{DownToVsn1, InstructionsD1}, ..., {DownToVsnK, InstructionsDK}]}.
Vsn是这个新的Release包中application的版本, UpFromVsn* 是一系列可以进行升级的先前版本, InstructionsU*是从这个先前版本升级到现在版本需要的动作. DownToVsn*是一系列可以回退到的旧版本, InstructionsD*是回退到对应旧版本需要的动作.
让我们创建tiny_app对应的.appup文件, tiny_app.appup:
{"2.0", [{"1.0", [{restart_application, tiny_app} ]}], [{"1.0", [{restart_application, tiny_app} ]}] }.
因为我们的tiny-1.0不是一个真正的Erlang OTP application, 所以我们很不幸, 需要做一些大动作: restart_application 让我们重新启动了tiny_app, 这个似乎和我们一再鼓吹的 Erlang代码热替换的特性相左?
Release Handling给了我们很多命令, 我们可以加载,删除,更新module, 可以添加,删除,重启application, 甚至可以重启emulator. 但是回答上面的问题来, 我为什么重新启动了 application? 这是一个教训, 因为我的tiny-1.0匆匆上马, 其不是一个真正的OTP application. 我保证我下次不会这么鲁莽, 同时我承诺后面我会有tiny-3.0 :)
tiny_app.appup的含义就很简单了:我要从1.0升级到2.0, 只要重新启动tiny_app, 其会自动加载所有的modules; 我要从2.0回退到1.0, 只要重新启动tiny_app:其首先停止tiny-2.0版本, 随后卸载所有代码, 然后启动tiny-1.0.
我们将tiny_app.appup文件放置在ebin目录下.
如果有多个applications, 那么每个改动的application都要有一个对应的appup文件.
下面我们要生成relup文件
生成relup
这里还需要一个relup文件(release upgrade file), 用来描述整个Release如何进行升级回退,幸运的是 我们不用手写这个relup, 通过systools:make_relup(Name, UpFrom, DownTo)可以帮我们生成.
代码如下:
[da6600a1@litaocheng ~/install/tiny-2.0]$ erl -pa ../tiny-1.0/ ../tiny-1.0/ebin/ ./ebin/ Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> systools:make_relup("tiny-2.0", ["tiny-1.0"], ["tiny-1.0"]). ok
(如果没有成功, 可能是你的路径错误, 还有就是appup的文件格式错误) 恩, 成功了, 在tiny-2.0目录下有一个relup文件.这个是我们想要的.
部署tiny-2.0
按照前面章节的介绍,生成一个新的release:
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> systools:make_script("tiny-2.0"). ok 2> systools:make_tar("tiny-2.0"). ok
生成之后, 拷贝tiny-2.0.tar.gz到部署的机器(这里是本机), 将其放置在tiny-1.0安装目录 /opt/local/tiny的releases目录下:
[da6600a1@litaocheng ~/install/tiny-2.0]$ sudo cp tiny-2.0.tar.gz /opt/local/tiny/releases/
解压tiny-2.0.tar.gz:
[da6600a1@litaocheng /opt/local/tiny]$ ./bin/erl Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> application:start(sasl). 2> release_handler:unpack_release("tiny-2.0"). {ok,"2.0"}
此时,在 /opt/local/tiny/releases/ 目录下出现了2.0的目录,其包含了tiny-2.0对应的relup, start.boot, 及tiny-2.0.rel 文件, 同时在 /opt/local/tiny/lib/ 目录下出现了 tiny-2.0 .
假设我们的tiny 1.0版本正在运行, 我们在对应shell中, 安装tiny-2.0:
1> tiny_app running... tiny_app running... 2> release_handler:install_release("2.0"). =PROGRESS REPORT==== 9-Mar-2009::04:20:27 === supervisor: {<0.63.0>,tiny} started: [{pid,<0.64.0>}, {name,tiny_server}, {mfa,{tiny_server,start_link,[]}}, {restart_type,permanent}, {shutdown,10}, {child_type,worker}] =PROGRESS REPORT==== 9-Mar-2009::04:20:27 === application: tiny_app started_at: nonode@nohost {ok,"1.0",[]} 3> release_handler:make_permanent("2.0"). ok
从返回信息来看,我们成功的从1.0升级到了2.0, 让我们看看tiny-2.0是否被加载了:
3> application:which_applications(). [{tiny_app,"tiny app 2.0","2.0"}, {sasl,"SASL CXC 138 11","2.1.5.4"}, {stdlib,"ERTS CXC 138 10","1.15.5"}, {kernel,"ERTS CXC 138 10","2.12.5"}] 4> tiny_server:add(1, 234233). ok 5> tiny_server:add(2, "hello"). ok 6> tiny_server:all(). [{2,"hello"},{1,234233}]
恩,的确现在已经是tiny-2.0了, make_permanent的目的是使tiny 2.0作为默认的版本.
好了,至此, release Handling我们也有了一定的了解.通过认真阅读OTP Design及不断的动手,相信你会对OTP Application的部署及升级会有清晰的认识.
(注意:新的release的安装必须在旧的code 所在erl进程进行,可以通过在新进程CTRL + G 相关命令链接old erl shell)
下一部分,我们将发布tiny-3.0
- tiny-2.0.zip (4.1 KB)
- 下载次数: 97
发表评论
-
Erlang问答网站,欢迎各位提出问题,解答问题。
2012-03-18 15:07 5228平时收到很多关于Erlang的问题,我都尽量一一解答,可是时间 ... -
Emakefile并行编译
2011-11-17 13:15 7599项目代码越来越多,使用erlang编译也越来越慢。无论是Mak ... -
Erlang服务器内存耗尽bug跟踪过程
2011-10-25 21:44 21709本文描述朋友Erlang服务器内存耗尽bug的解决过程 ... -
inet:getstat/2小用法
2011-04-27 09:32 4546inet:getstat/2的用处 在 ... -
Erlang游戏开发-协议
2011-04-22 16:10 10673Erlang游戏开发-协议 ... -
Gearman Erlang Client
2010-10-17 21:14 3677Gearman Gearman是一个通用的任务调度框架。 ... -
ECUG归来
2010-10-17 21:02 2937今天ECUG V圆满结束了,不知不觉作为讲师已经参加过3次大会 ... -
gen-erl-app快速生成erlang app 框架
2010-04-07 14:22 3949经常需要创建各种erlang app,这个过程一旦掌握,就很繁 ... -
erl-redis发布
2010-03-30 11:44 5759最近几天因为需要,实现了一个redis erlang clie ... -
用Erlang做了很多事
2010-01-19 14:08 5036因为工作及时间关系,最近比较忙碌,没有太多的时间写文章。 ... -
ecug topic - erlang开发实践
2009-11-11 10:04 3713从ecug归来,感觉不错,大家学习探讨的积极性很高哦。 很高 ... -
reltool用户指南
2009-11-02 22:27 6295说明,最近比较忙,没有太多时间更新blog,请各位朋友谅解. ... -
Erlang定时任务server (仿crontab语法)
2009-09-23 18:03 6288好久不写blog了,看到yufeng老大那么活跃,我也“耐不住 ... -
Erlang进程之错?
2009-07-27 15:06 3652前阵子erlang-china关于erla ... -
CNode指南
2009-07-27 14:13 3285好久不发文章,因为工作太忙。这个东西就凑凑数吧。各位见谅。 ... -
Erlang类型及函数声明规格
2009-06-08 22:41 9477Erlang类型及函数声明 ... -
使用etop查看系统中进程信息
2009-05-29 13:57 6096Erlang提供了丰富的开发工具,你认为没有的时候,很可能是你 ... -
创建gen_server组解决单process瓶颈
2009-05-27 17:05 5208并发和顺序是一个令人 ... -
又有人投入Erlang的怀抱了:37Signals Campfire loves Erlang
2009-05-14 23:00 3578就喜欢看这样的东西... This is so juicy ... -
list random shuffle实现
2009-05-07 13:41 4318在项目中需要对list进行随机shuffle,但是在erlan ...
相关推荐
erlang otp25 win安装包
esl-erlang_16.b.3-2~centos~6_amd64.rpm
erlang otp学习文档 学习还不错的
3).erlang ... >tar zxvf ncurses-5.6.tar.gz >cd ncurses-5.6 >./configure >make >make install clean (2).>wget ...拷贝 crypto-2.0.tar 并解压到 erlang的lib目录下。
Erlang OTP 20.1 Windows 64-bit Binary File 下载地址:http://www.erlang.org/downloads
erlang examples, erlang语言学习的经典例子。包括模式匹配,otp使用等等
erlang-crypto-19.3.6.4-1.el7.x86_64.rpm
erlang-jinterface-19.3.6.4-1.el7.x86_64.rpm
OTP是开放电信平台的简称,包含了erlang语言环境。 erlang是函数式语言,提供了9个9的稳定性和超高并发并发性能。 OTP是高并发分布式服务器的最理想平台。
erlang-otp_mibs-19.3.6.4-1.el7.x86_64.rpm
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
[Manning Publications] Erlang OTP 并发编程实战 (英文版) [Manning Publications] Erlang and OTP in Action (E-Book) ☆ 出版信息:☆ [作者信息] Martin Logan, Eric Merritt, Richard Carlsson [出版机构] ...
erlang_otp_win64_25.0
erlang-xmerl-22.2.3-1.el7.x86_64.rpm 免费下载0积分镜像下载。rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和...
rabbitmq erlang otp_win64_26.0.1.exe windows版本,以管理员安装
rpm包; 包含erlang-23.3-rabbitmq-server-3.8
erlang-xmerl-22.2.5-1.el7.x86_64.rpm 免费下载0积分镜像下载。rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和...