SlideShare a Scribd company logo
1 of 80
Download to read offline
用Erlang 构建容错系统 
● 连城 (rhythm.mail@gmail.com) 
● Twitter @liancheng 
● 微博@ 连城404
Erlang是一套什么样的系统? 
● 涉及语言、库、操作系统多个层次的全方位分 
布式容错解决方案 
● 从高难度工程问题中催生而来 
– 与C的历史背景惊人地相似 
● 具有显著的函数式特征 
– 但从来都不是一个学院派语言 
– 没有学院派函数式语言中的各种花哨概念
历史 
● 起源于1980年代Joe Armstrong在爱立信计算 
机科学实验室所做的电信系统研究 
– Smalltalk太慢 
– Prolog缺乏并发支持 
– 作为Prolog的并发扩展,Erlang诞生了 
● 逐渐发展成为语言、库、操作系统多层次全方 
位的分布式容错系统解决方案
可怕的电信系统 
● 高并发 
● 软实时(毫秒级) 
● 分布式 
● 直接操作硬件 
● 大型软件系统 
● 功能复杂 
● 不间断运行(5个9 
的SLA) 
● 超高质量要求 
● 软硬件容错
成功案例 
● 早年 
– 爱立信AXD301交换机(loc > 1M) 
– 爱立信GPRS系统 
● 当前 
– Facebook IM 
– WhatsApp 
– 云诺 
– 国内页游界
互联网环境下容错系统的特点 
● 系统的一部分受损不影响整体功能 
● 尝试自行修复受损的部分 
● 支持分布式 
● 无缝升级
如影随形的终极错误修复手段
重启、重装、复位,何以凑效?
状态重置的威力 
● 系统错误往往体现为系统进入了未知的、难以 
观测、难以控制、难以预知的错误状态 
● 重启、重装、复位这些操作,通过将系统重置 
为我们熟悉的、稳定的、可控的、可预知的状 
态,来解决问题
状态重置的问题 
● 状态重置意味着状态丢失 
● 大粒度的状态重置往往会带来高昂的状态重建 
成本 
– 重启系统后,要重新打开浏览器、IM等常用程 
序,耐心等待它们启动完毕 
– 重装系统后,要重新安装常用程序、恢复备份数据 
– 游戏服务器重启服务会导致用户掉线重连
针对患部做细粒度状态重置?
细粒度的状态重置 
● 将系统任务按自顶向下分出层级 
– 顶层任务最复杂、底层任务最简单 
– 底层子任务故障只会导致系统降级,不应导致整个系统不 
可用 
● 故障隔离 
– 故障任务不应影响正常任务 
● 故障恢复 
– 通过重启故障任务尝试修复故障,如无法恢复则立即退出 
并逐级上报
Erlang的容错之道 
● 海量轻量级进程 
– 进程语义隔离故障 
– 进程间通过消息传递通讯 
● 监督进程和工作进程共同构成树状结构 
– 利用监督进程和工作进程间的链接自底向上定向传播故障 
– 监督进程负责发现和重启故障进程 
– 重启失败则监督进程关闭辖区内的所有进程,上报故障
Fail Fast, Let It Crash! 
● 利用Erlang 轻量级 
进程将任务粒度切细 
● 进程间无共享数据保 
证故障隔离 
● 利用监督进程重启故 
障任务实现细粒度的 
状态重置
Concurrency Oriented 
Programming
定义 
● By Joe Armstrong: 
– 在语言层面支持进程语义 
– 每个进程都具有全局唯一标识 
– 进程之间高度隔离,不共享任何状态,仅靠异步消 
息传递进行通讯 
– 不保证消息传递的可靠性 
– 进程可以监测到其他进程的故障
Erlang COP的威力 
● 海量轻量级进程 
– 每个进程启动时默认占用309个字(非SMP VM) 
– 16G内存的64位服务器可支持近700万轻量级进程 
● 并发逻辑得以简化 
– 原始的阻塞多进程模型得以再次粉墨登场 
– 无锁,靠消息传递同步并发逻辑 
● 位置透明,简化分布式应用的设计实现 
● 对现实世界的建模更加直观
代码示例 
-module(area_server0). 
-export([loop/0]). 
loop() -> 
receive 
{rectangle, Width, Ht} -> 
io:format("Area of rectangle is ~p~n",[Width * Ht]), 
loop(); 
{circle, R} -> 
io:format("Area of circle is ~p~n", [3.14159 * R * R]), 
loop(); 
Other -> 
io:format("I don't know what the area of a ~p is ~n",[Other]), 
loop() 
end.
示例 
1> Pid = spawn(fun area_server0:loop/0). 
<0.36.0> 
2> Pid ! {rectangle, 6, 10}. 
Area of rectangle is 60 
{rectangle,6,10} 
3> Pid ! {circle, 23}. 
Area of circle is 1661.90 
{circle,23} 
4> Pid ! {triangle,2,4,5}. 
I don't know what the area of a {triangle,2,4,5} is 
{triangle,2,4,5}
COP v.s. OOP 
● COP 
– 模块 
– 进程 
– 协议 
– 消息传递 
● OOP 
– 类 
– 对象 
– 接口 
– 方法调用
Functional Programming
Erlang不是纯函数式语言 
● Erlang只是一门具有函数式特征的语言 
– 变量单次赋值 
– 尾递归优化 
– 模式匹配 
● Erlang大量依赖副作用 
– 消息传递(包括文件、网络等IO) 
– 进程的创建和销毁
为什么选择函数式? 
● 绝不是出于学院派喜好 
● 函数式编程天生适合并发系统
Single Assignment 
● 优势 
– 变量只读,因此状态只读 
– 并发状态访问无需加锁 
– 便于实现代码热替换 
– 简化GC实现 
● 劣势 
– 加重了GC的负担(但被COP很好地解决了)
Single Assignment 
● 简化GC 
– 由于变量不可修改,老旧对象不会持有年轻对象的 
引用,内存中的对象引用关系必定是一张从年轻对 
象指向老旧对象的DAG 
– Armstrong, J., & Virding, R. (1995). One pass 
real-time generational mark-sweep garbage 
collection.
Single Assignment & COP 
● Erlang VM的GC以Erlang进程为单位实施 
● Erlang进程的内存堆通常很小 
● 整个VM的GC均摊到各个进程,天然减小了 
GC停顿时间 
● 生存期短的进程甚至在触发GC前便会终止
Pattern Matching 
-module(area_server0). 
-export([loop/0]). 
loop() -> 
receive 
{rectangle, Width, Ht} -> 
io:format("Area of rectangle is ~p~n",[Width * Ht]), 
loop(); 
{circle, R} -> 
io:format("Area of circle is ~p~n", [3.14159 * R * R]), 
loop(); 
Other -> 
io:format("I don't know what the area of a ~p is ~n",[Other]), 
loop() 
end.
Pattern Matching 
ipv4(<<Version:4, IHL:4, ToS:8, TotalLength:16, 
Identification:16, Flags:3, FragOffset:13, 
TimeToLive:8, Protocol:8, Checksum:16, 
SourceAddress:32, DestinationAddress:32, 
OptionsAndPadding:((IHL-5)*32)/bits, 
RemainingData/bytes >>) when Version =:= 4 -> 
...
Erlang/OTP
使用OTP的理由 
● 效率 
● 稳定性 
● 监督机制 
● 代码热升级支持 
● 可靠的代码库
设计模式的先驱 
● 从高强度电信系统中抽象出了若干通用模式 
– gen_server 
– gen_event 
– supervisor 
– application 
– ...
层级化的工业级应用解决方案 
● 模块(Module) 
● 应用(Application) 
● 发布镜像(Release) 
● 目标系统(Target system)
模块与应用
应用与发布镜像 
● 发布镜像 
– 多个应用的集合 
– 统一管理应用间的依 
赖关系 
– 处理热升级和回滚
参考文献 
● Armstrong, J. (2007). A History of Erlang 
● Armstrong, J. (2003). Making reliable 
distributed system in the presence of software 
errors 
● Logan, M., Merrtt, E., Carlsson, R. (2011). 
Erlang and OTP in Action
用Erlang 构建容错系统 
● 连城 (rhythm.mail@gmail.com) 
● Twitter @liancheng 
● 微博@连城404
Erlang是一套什么样的系统?●涉及语言、库操作多个层次全方位分布式容错解决案从高难度工程问题中催生而来–与C历史背景惊人地相似具有显著函数特征但都不学院派没各种花哨概念 
大型电信公司(AT&T和爱立信)门下的研究机构 
(贝尔实验室和爱立信计算机科学实验室);一小 
撮才华横溢、自由自在的工程师和研究者;面对在 
各自时代最为复杂的工程问题(UNIX和电信系 
统);在内部产品中大量应用、快速迭代;十年磨 
一剑。
历史●起源于1980年代Joe Armstrong在爱立信计算机科学实验室所做的电系统研究–Smaltalk太慢Prolog缺乏并发支持作为扩展,Erlang诞生了逐渐成语言、库操多层次全方位分布式容错解决案 
Joe Armstrong原本将赌注压在Smalltalk上,并发明 
了一套描述电信系统的代数方法。由于Smalltalk, 
太慢,Joe订购了一台Smalltalk机,在送货期间, 
同事告诉他Prolog可以很好地描述他的代数方法。 
等到Smalltalk机到货时,Joe已经对Smalltalk失 
去兴趣了。
可怕的电信系统●高并发软实时(毫秒级)分布式直接操作硬件大型功能复杂不间断运行5个9SLA)超质量要求容错
成功案例●早年–爱立信AXD301交换机(loc > 1M)–GPRS系统当前Facebok IM–WhatsAp–云诺国内页游界
互联网环境下容错系统的特点●一部分受损不影响整体功能尝试自行修复支持布式无缝升级
《七龙珠》中的魔人布欧:具有超强的再生能力,可 
分裂为多个独立个体,可通过吞噬其他个体获得对 
方的能力
如影随形的终极错误修复手段
蓝屏怎么办?
重启…… 
重启还解决不了问题怎么办?
重装…… 
如果说用重启机器和重装系统来对付 
蓝屏是不得已而为之,那么下面这个 
例子绝对是精心设计而成的
有调查显示相对于Android设备,中老 
年人对iPhone、iPad上手更快。其 
中很重要的一个原因就是在使用过程 
中无论触发了什么诡异的问题,只要 
按一下Home键,就可以立即回到熟 
悉的主界面。
重启、重装、复位,何以凑效?
状态重置的威力●系统错误往体现为进入了未知、难以观测控制预启装复位这些操作,通过将我们熟悉稳定可来解决问题
状态重置的问题●意味着丢失大粒度往会带来高昂建成本–启系统后,要新打开浏览器、IM等常用程序耐心待它们动完毕装安恢复备份数据游戏服务导致户掉线连
针对患部做细粒度状态重置?
细粒度的状态重置●将系统任务按自顶向下分出层级–最复杂、底简单子故障只会导致降,不应整个可用隔离影响正常恢通过启尝试修如无法则立即退并逐上报
Erlang的容错之道●海量轻级进程–语义隔离故障
间通过消息传递讯监督和工作共同构成树状结利用链接自底向上定播负责发现重启失败则关闭辖区内所有,报
Fail Fast, Let It Crash!●利用Erlang轻量级进程将任务粒度切细间无共享数据保证故障隔离监督重启实现的状态置
Concurrency Oriented 
Programming
定义●By Joe Armstrong:–在语言层面支持进程–每个都具有全局唯一标识之间高度隔离,不共享任何状态仅靠异步消息传递行通讯保证的可性以监测到其他故障
Erlang COP的威力●海量轻级进程–每个启动时默认占用309字(非SMP VM)–16G内存64位服务器可支持近70万并发逻辑得以简化原始阻塞多模型再次粉墨登场无锁,靠消息传递同步置透明分布式应设计实现对世界建更加直观
代码示例-module(area_server0).-export([lop/0]).lop() -> receive {rectangle, Width, Ht} io:format("Area of rectangle is ~p~n",[Width * Ht]), lop(); circle, R} circle n", [3.14159 R R]), Other I don't know what the area a p Other]), end.
示例1> Pid = spawn(fun area_server0:lop/0).<0.36.0>2> ! {rectangle, 6, 10}.Area of rectangle is 60{6,10}3> circle, 23}.circle 161.90{23}4> triangle,2,4,5}.I don't know what the area a 2,4,5}
COP v.s. OP●COP–模块–进程协议消息传递OP–类对象接口方法调用
Functional Programming
Erlang不是纯函数式语言●只一门具有特征的–变量单次赋值尾递归优化模匹配大依赖副作用消息传(包括文件、网络等IO)–进程创建和销毁
为什么选择函数式?●绝不是出于学院派喜好编程天生适合并发系统
Single Asignment●优势–变量只读,因此状态并发访问无需加锁便于实现代码热替换简化GC劣重了的负担(但被COP很好地解决)
Single Asignment●简化GC–由于变量不可修改,老旧对象会持有年轻的引用内存中关系必定是一张从指向DAG–Armstrong, J., & Virding, R. (195). One pas real-time generational mark-swep garbage colection.
Single Asignment & COP●Erlang VM的GC以进程为单位实施内存堆通常很小整个均摊到各,天然减了停顿时间生期短甚至在触发前便会终止
Patern Matching-module(area_server0).-export([lop/0]).lop() -> receive {rectangle, Width, Ht} io:format("Area of rectangle is ~p~n",[Width * Ht]), lop(); circle, R} circle n", [3.14159 R R]), Other I don't know what the area a p Other]), end.
Patern Matchingipv4(<Version:4, IHL:ToS:8, TotalLength:16, Identification:Flags:3, FragOfset:13, TimeToLive:Protocol:Checksum:SourceAdres:32, DestinationAdres:OptionsAndPading:(IHL-5)*32)/bits, RemainingData/bytes >) when Version =:= 4 -> .
Erlang/OTP
使用OTP的理由●效率稳定性监督机制代码热升级支持可靠库
设计模式的先驱●从高强度电信系统中抽象出了若干通用–gen_server–event–supervisor–aplication–.
层级化的工业应用解决方案●模块(Module)Aplication)发布镜像Release)目标系统Target system)
模块与应用
应用与发布镜像●–多个的集合统一管理间依赖关系处热升级和回滚
参考文献●Armstrong, J. (207). A History of Erlang 203). Making reliable distributed system in the presence software erorsLogan, M., Mert, E., Carlson, R. 201). and OTP Action

More Related Content

Viewers also liked

Film production guide
Film production guideFilm production guide
Film production guide
NINANC
 
Ashland charter meetings with teachers
Ashland charter meetings with teachersAshland charter meetings with teachers
Ashland charter meetings with teachers
Wendy Kloiber
 

Viewers also liked (20)

Efquel eMOOC stakeholders summit 2014 ossiannilsson
Efquel eMOOC stakeholders summit 2014 ossiannilssonEfquel eMOOC stakeholders summit 2014 ossiannilsson
Efquel eMOOC stakeholders summit 2014 ossiannilsson
 
Ossiannilsson130603 ur version_ce_final
Ossiannilsson130603 ur version_ce_finalOssiannilsson130603 ur version_ce_final
Ossiannilsson130603 ur version_ce_final
 
Professional Connections Software
Professional Connections SoftwareProfessional Connections Software
Professional Connections Software
 
Film production guide
Film production guideFilm production guide
Film production guide
 
Kazakstan lu2014 ossiannilsson
Kazakstan lu2014 ossiannilssonKazakstan lu2014 ossiannilsson
Kazakstan lu2014 ossiannilsson
 
Ossiannilsson 131123 trakai_mooc_openuped
Ossiannilsson 131123 trakai_mooc_openupedOssiannilsson 131123 trakai_mooc_openuped
Ossiannilsson 131123 trakai_mooc_openuped
 
Ossiannilsson 130916 slu
Ossiannilsson 130916 sluOssiannilsson 130916 slu
Ossiannilsson 130916 slu
 
Unic erasmus expert_exchange2016_09_14
Unic erasmus expert_exchange2016_09_14Unic erasmus expert_exchange2016_09_14
Unic erasmus expert_exchange2016_09_14
 
Documento
DocumentoDocumento
Documento
 
Ossiannilsson lnu 31mars2015
Ossiannilsson lnu 31mars2015Ossiannilsson lnu 31mars2015
Ossiannilsson lnu 31mars2015
 
Ossiannilsson eden2014
Ossiannilsson eden2014Ossiannilsson eden2014
Ossiannilsson eden2014
 
Session 17
Session 17Session 17
Session 17
 
Iso sis ossiannilsson2014
Iso sis ossiannilsson2014Iso sis ossiannilsson2014
Iso sis ossiannilsson2014
 
Eden2011 creelman ossiannilsson
Eden2011 creelman ossiannilssonEden2011 creelman ossiannilsson
Eden2011 creelman ossiannilsson
 
EADTU2011 Turkey
EADTU2011 TurkeyEADTU2011 Turkey
EADTU2011 Turkey
 
Edenintro sverd 111021
Edenintro sverd 111021Edenintro sverd 111021
Edenintro sverd 111021
 
Using ipads in and around the library
Using ipads in and around the libraryUsing ipads in and around the library
Using ipads in and around the library
 
Augmented reality
Augmented realityAugmented reality
Augmented reality
 
Ashland charter meetings with teachers
Ashland charter meetings with teachersAshland charter meetings with teachers
Ashland charter meetings with teachers
 
Presentacion Netcds
Presentacion NetcdsPresentacion Netcds
Presentacion Netcds
 

Similar to 用Erlang构建容错系统

Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log Analysis
Xiaoming Chen
 
Erlang Practice
Erlang PracticeErlang Practice
Erlang Practice
litaocheng
 
Introduction to corona sdk
Introduction to corona sdkIntroduction to corona sdk
Introduction to corona sdk
馬 萬圳
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
yiditushe
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
George Ang
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
George Ang
 

Similar to 用Erlang构建容错系统 (20)

Oracle Security 101
Oracle Security 101Oracle Security 101
Oracle Security 101
 
Golangintro
GolangintroGolangintro
Golangintro
 
Erlang高级原理和应用
Erlang高级原理和应用Erlang高级原理和应用
Erlang高级原理和应用
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log Analysis
 
Erlang Practice
Erlang PracticeErlang Practice
Erlang Practice
 
Introduction to corona sdk
Introduction to corona sdkIntroduction to corona sdk
Introduction to corona sdk
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
漫談 Source Control Management
漫談 Source Control Management漫談 Source Control Management
漫談 Source Control Management
 
Golang
GolangGolang
Golang
 
Tcfsh bootcamp day2
 Tcfsh bootcamp day2 Tcfsh bootcamp day2
Tcfsh bootcamp day2
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
 
R統計軟體簡介
R統計軟體簡介R統計軟體簡介
R統計軟體簡介
 
Ryu Learning Guide
Ryu Learning GuideRyu Learning Guide
Ryu Learning Guide
 
建置Python開發環境
建置Python開發環境建置Python開發環境
建置Python開發環境
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
Go语言: 互联网时代的C
Go语言: 互联网时代的CGo语言: 互联网时代的C
Go语言: 互联网时代的C
 
2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享
 
Continuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIContinuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CI
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧
 

用Erlang构建容错系统