Tag Archives: Zstack

前言

说实话相比 OpenStack 往往流水式的代码且网络上分析和研究的文章比较多,ZStack 全异步、追求高稳定性和安全的代码是相对难读的,所以本文希望能通过一些简单的例子和与 OpenStack 的一些对比,将 ZStack 的特点、代码的原理尽量描述出来,降低 ZStack 的入门门槛。

第一步 前端

打开 Mevoco/ZStack 的界面,可以发现基本设计思路与其他 IaaS 或 OpenStack 是基本类似的,然而打开开发者面板就会发现大有不同。

OpenStack 的面板一般通过 HTTP 到 Web 后端,可能是一个像 Horizon 的中间件,也可能是直接把请求发到后面的具体服务的 API 服务,例如 nova-api 或 neutron-server。当然中间可能还会有负载均衡器或高可用之类的设施。

image_1b6dgt82i1rl0md5j8t8va1v4m9.png-305.3kB 图1 在OpenStack的Horizon面板上创建虚拟机出发的Post请求

而在 ZStack 的面板中开发者面板是很干净的,打开之后无论什么操作是不会触发 HTTP 请求的,数据和请求都在 WebSocket 传递,比如我们在面板上创建一个虚拟机,可以看到通过 WebSocket 发送一个 frame,发了一个 org.zstack.header.vm.APICreateVmInstanceMsg 的消息,后面跟着的是创建的参数。

image_1b6dhje891gd7rj61e551r9hv3vt.png-209.3kB 图2 ZStack面板上创建虚拟机发出的WebSocket帧

第二步 Web 后端

请求送到送到后端就需要我们登录到这个服务器上看了,我的实验环境是一个 All in One 的环境,登陆到服务器查询 5000 端口的监听情况,可以看到是一个 Python 程序在监听这个端口。

image_1b6dja8kukgq66ph0fs8m14hl1n.png-56.9kB

那么问题是这个程序怎么找到呢,现在我们不想去查部署程序是怎么部署的,然而直接在自己的 python 里直接 import 却报错提示没有这个库。

由于 Python 程序往往有比较重的依赖,因此 Python 部署是个运维中老生常谈的问题,想必这里是用了类似虚拟环境(virtualenv)之类的技术,那么问题就是那个虚拟环境在哪里。

我们知道 zstack 还有一个程序叫 zstack-cli,是 ZStack 的命令行程序,不妨查一下这个。可以看到这里定义了一个目录,到上面果然有几个目录,推测分别是 5 个 zstack 组件所使用的虚拟环境。

image_1b6djocjqbm218po1lob3c38mo2h.png-63.5kB

顺利找到 zstack-dashboard 目录后可以发现里边实际上没有多少 Python 代码,先打开 web.py,发现里边是一个小 Flask SocketIO App。

Flask SocketIO 用于实现 Web Socket 服务端,用 @socketio.on() 表示路由,参考图1,使用的是call,所以可以直接看处理call的 handle_call,跳转到server.api_call,将消息有 json 格式转换出来,然后连带一个用来发送回复的函数一起发给由CloudBus类所生成对象的send方法。

进入 CloudBus.send,通过一些检查和填充之后,设置回复的队列为zstack.ui.message.$uuid(这个 UUID 以及队列都是服务初始化时产生的)等等送给 Connection.send通过 kombu 对 P2P Exchange 以 zstack.message.api.portal 为 routing key(这里被封装为 Service ID)将消息发了出去。

Read More →

最近就这个问题调查了蛮久,其实原因比较显然,在看到 strace 的结果就已经明白了大半,但是本着求(xia)知(zhe)探(teng)索的想法,仔细验证了代码逻辑和时间(新技能 get!给 C++、Perl 混合代码调试性能),攒出了这篇文章。

ZStack 是一个开源的 IaaS 软件,架构和性能都很优秀,可以在 103 秒内并发创建 1000 台虚拟机,可惜这个数据是在扁平网络下测试得到的,一旦用上云路由网络,单个虚拟机的启动时间会延长到七秒左右。

我们现看下看下实际的占用时间,我在 vyatta 的代码里添加了日志(Repo 是 https://github.com/vyos/vyatta-cfg),综合 zstack、zstack-vyos、vyos 的日志可以看到大概是这样的(注意 zstack 的日志时间精度只提供到秒,没有毫秒):

2017-02-13 13:22:08 start executing flow[NetworkServiceManagerImpl.java:apply-network-service-DHCP]

2017-02-13 13:22:08 DEBUG [RECV] /setsnat
2017-02-13 13:22:09 DEBUG [HTTP POST][ASYNC REPLY TO /setsnat]

2017-02-13 13:22:09 DEBUG [RECV] /adddhcp

# 以下为 vyos 日志
2017-02-13 13:22:09:458 Entered cli_bin::doCommit
2017-02-13 13:22:10:216 Entered commit::doCommit
2017-02-13 13:22:10:901 notify other users in config mode
2017-02-13 13:22:12:260 cs.commitConfig complete
2017-02-13 13:22:12:557 Exit commit::doCommit
2017-02-13 13:22:12:557 Normal exit cli_bin::doCommit
# 退出 vyos 日志

2017-02-13 13:22:12 DEBUG [HTTP POST][ASYNC REPLY TO /adddhcp]

2017-02-13 13:22:12 DEBUG [RESPONSE] to /setdns
2017-02-13 13:22:12 DEBUG [HTTP POST][ASYNC REPLY TO /setdns]

2017-02-13 13:22:12 DEBUG [SimpleFlowChain] (zs-thread-81) [FlowChain: apply-network-service-to-vm-13d1359b8bd34a05a91f61dedb112e96] successfully executed flow[NetworkServiceManagerImpl.java:apply-network-service-DHCP]

可以把时间与调用关系结合起来做成一张图:

VyOS_Commit
Read More →