swift流程

从swift-init main start看swift源代码
2012年05月15日 17:57
标签:365swift代码介绍
从swift-init main start 开始看swift代码
swift作为openstack的对象存储系统,在openstack生态环境中扮演如AmazonS3的功能。虽然本人
之前学习过ruby之类的脚本语言,但是也是从看swift代码的过程中逐渐学习python的特性,其中必然
会有种种错误,请看官斧正。
环境:
OS:Ubuntu12.04 LTS (10.04LTS更新python2.6.5之后unittest会failed)
Swift-install:按照swiftdev文档中SAIO的方式部署
PythonVersion: 2.7.3
开始:
swift是一个对象存储,官方文档对比文件系统时提到其主要是没有文件系统文件(夹)嵌套的概
念。其实swift这里是简化了 处理多层文件的问题,通过container和account来进行逻辑上的区分,形
成一个相对较为flat的结构。这里从Swift的RESTAPI也 可以看出来。基本的结构如下:
METHOD http(s)://host:port////
这种目录式的API结构尤其是将version的加入,在InfoQ上许多介绍RESTAPI设计准则上都有提及。
可能是由于中毒于Java代码中的“过度设计”,本人阅读swift的代码时感觉中可以优化的地方确实很
多,比如几乎所有 server中做check的方法,完全可以提取成一个单独的内部方法;再比如说这里用
于操作数据库的swift/common/db.py里的 AccountBroker和ContainerBroker为什么不单独放在各自的
包里,而是放在common下操作数据库的入口这里。也可能是 pythonist的习惯使然,但是在一个py
文件中写好几个类导致近2000行代码,还是有点让人有些阅读障碍。
在SAIO的文档中,提到需要自己添加启动脚本startmain,实际功能就是执行了 swift-initmain start,
我们就从这行命令开始入手研究swift代码。
swift-init是{swift_locate}/bin目录下的一个python脚本,主要功能就是启动swift的基本服务,并且指定
了commandline下可以选择配置的参数,其中命令的格式为
swift-init [ ...] [options]
网吧无盘系统
linux虚拟机 服务器的功能
亚典波罗的收藏
馆藏:98
关注我:1
做个吃货,保持傻逼
销量:20件 ¥ 53.90
热门文章
首 页 阅览室 馆友 我的图书馆
转:2
最新文章13-8-20 从swift
www.360doc.com/content/12/0627/10/869651_220705542.shtml 2/12
更多>>
幽默风趣的人生妙语
鱼宴--百吃不厌总是鱼
亮剑——分析公司的工具
中国人脉厚黑学(经典啊)
swift-init [ ...] [options]
具体执行的功能是在{swift_locate}/swift/common/manager.py中完成的。 manager.py中定义了支持
的command,包括['status','start','no_wait','no_daemon', 'once','stop', 'shutdown','restart',
'reload','force_reload'],并且将swift的服务分为两大类:
ALL_SERVERS= ['account-auditor','account-server','container-auditor',
'container-replicator','container-server','container-sync',
'container-updater','object-auditor','object-server','object-expirer',
'object-replicator','object-updater','proxy-server',
'account-replicator','account-reaper']
MAIN_SERVERS= ['proxy-server','account-server','container-server',
'object-server']
在mainstart命令中启动了proxy-server,account-server, container-server和object-server,这些是swift提
供的基本服务,在官方文档exampleinstallation architecture章节里,可以看到,在集群环境下proxyserver,proxynode中只需运行proxy- server,storagenode中则需要运行剩下的3个server。在
Manager#start方法中,在执行完基本的setup_env之 后,将每一个MAIN_SERVERS里的server包装
成Server对象(Server包含server,type,cmd和procs四个属 性,type会在下文用于查找配置文件,
cmd用来启动server实例),然后执行执行Server#launch。这里会分别读取server的 configuration文
件,configuration文件是按照utils#search_tree的方法查找得到,即在SWIFT_DIR下查 找文件名符合
{server_type}-server*.conf的文件或符合{server_type}-server*的文件夹,若为文件夹,则在 此文件夹
中查找后缀名为.conf的文件,其中SWIFT_DIR默认为/etc/swift,server_type为 'account','container',
'object','proxy'之类。然后执行Server.cmd命令启动服务。这里server.cmd实际也是根据server的名字
组成的字符 串,对应bin目录下的脚本命令。由于每一个服务对应一个conf文件,所以,如果是在集
群环境下会有多个进程在不同的storagenode上执行,每 一个进程代表一个server。由于实验环境是
ALLIN ONE的方式,所以可以在ps中看到多个accout/container/objectserver进程在执行。与此相一
致的是,swift的内部组件 之间的交互完全是采用RESTAPI调用的方式,这样在简化交互方式的同时
也降低了耦合。
Swift的Http实现利用了Eventlet和paste.deploy,具体实现在wsgi.py中,其中wsgi.server所需的app
参数是利用paste.deploy风格的config文件产生的,这也是为什么上文提到的.conf文件中包含形如
[app:account-server]
use= egg:swift#account
的信息了。另外,在*/server.py中的app_factory方法,正是返回了app的实例。接下来,分别介绍一
下 proxy/server.py,accout/server.py, container/server.py,obj/server.py。proxy/server.py用于处理和转
发对swift的所有请求,所有对 swift的操作都由proxy/server.py中Application#handle_request处理,
并最终由另外3种server的实例 分别提供对account,container, object的RESTAPI访问。
proxy-server
首先,从用户API请求入手,研究proxy/server.py中对于http请求的处理。
从exampleinstallation architecture中可以看出,proxy-server的作用是捕获所有对swift的HTTP请求,
然后将处理的请求发送至 storagenode进行处理。proxy/server.py中定义了proxy-server的Application
类,和处理请求 的*Controller类,类图如下:
已售出110件
9
关闭
关闭

你可能感兴趣的:(linux)