陈硕 (giantchen_AT_gmail)
Blog.youkuaiyun.com/Solstice t.sina.com.cn/giantchen
陈硕关于分布式系统的系列文章:http://blog.youkuaiyun.com/Solstice/category/802325.aspx
本作品采用“Creative Commons 署名-非商业性使用-禁止演绎 3.0 Unported 许可协议(cc by-nc-nd)”进行许可。
http://creativecommons.org/licenses/by-nc-nd/3.0/
约定:本文只考虑 Linux 系统,文中涉及的“服务程序”是以 C++ 或 Java 编写,编译成二进制可执行文件(binary 或 jar),程序启动的时候一般会读取配置文件(或者以其他方式获得配置信息),同一个程序每个服务进程的配置文件可能略有不同。“服务器”这个词有多重含义,为避免混淆,本文以 host 指代服务器硬件,以“服务端程序/进程”指代服务器软件(或者具体说 Web Server 和 Sudoku Solver,这两个都是服务软件)。
在进入正题之前,先看一个虚构但典型的例子:Sudoku Solver。(Sudoku Solver 是个均质的无状态服务,分布式系统中进程的状态迁移不是本文的主题。)
假设你们公司的分布式系统中有一个专门求解数独(Sudoku)的服务程序,这个程序是你们团队开发并维护的。通常 Web Server 会使用这个 Sudoku Solver 提供的服务,用户通过 web 页面提交一个 Sudoku 谜题,web server 转而向 Sudoku Solver 寻求答案。每个 Web Server 会同时跟多个 Sudoku Solver 联系,以实现负载均衡。系统的消息结构大致如下,每个圆角矩形是一个进程,运行在各自的 host 上:
上图中的 Web Server 请不要简单理解为 httpd + cgi,它其实泛指一切客户端,本身可能是个 stateful 的服务程序。
当然,系统不是一开始就是这样,它经历了多步演化。
一开始 (a),只有一个 Sudoku Solver,也只有一台 Web Server,是个简单的一对一 (1:1) 的使用关系;
随后 (b),随着业务量增加,一台 host 不堪重负,于是又部署了几台 Sudoku Solver,变成了一对多 (1:n) 的使用关系;
再后来 (c),一台 Web Server 撑不住了,于是部署了几台 Web Server,形成了我们一开始看到的多对多 (m:n) 的使用关系;
(d) 中的情况留到文末再讲。
在分布式系统中部署并运行 Sudoku Solver,需要考虑以下几个问题:
- Sudoku Solver 如何部署到多台 host 上运行?是把可执行文件拷过去吗?程序用到的库怎么办?配置文件怎么办?
- 如何启动服务程序 Sudoku Solver ?如果每个 Solver 的配置文件稍有不同(比如每个 Solver 有自己的 service name),那么配置文件是自动生成吗?
- Sudoku Solver 的 listening port 如何配置?如何保证它不与其他服务程序重复?
- 如果程序 crash,谁来重启?能否自动重启?开发/运维人员能否及时收到 alert?
- 如果想主动重启 Sudoku Solver,要不要登录到那台 host 上去 kill ?还是能够远程控制?
- 如果要升级 Sudoku Solver 程序,如何重新部署?如何(尽量)做到不中断服务?
- Web Server 如何知道那些 Sudoku Solver 的地址?是不是静态写到 Web Server 的配置文件里?
- 如果 Sudoku Solver 所在的 host 发生硬件故障,管理人员是否能立刻得知这一状况?Web Server 能否自动 fail over 到其他 alive 的 Solver 上?
- 部署新的 Sudoku Solver 之后,Web Server 能否自动开始使用新的 Solver 而无需重启?(重启 Web Server 似乎不是大问题,这里我们进一步考虑 client 是个有状态的服务,应该尽量避