管理多个 Supervisor —— 集群管理
继前两篇文章(Supervisor 基础、监控并报警)后,用 Supervisor 管理单个机器上的进程没啥问题了。但是 A 机器上的 Supervisor 只能管理 A 机器上的进程,管理不了 B 上边的。在当今这个云的时代,大家都玩集群了,如果用其管理的话,需要打开 N 个网页去各各机器上的进程显然是不现实的(OP 们要哭晕在厕所了)。
其实之前仔细看配置文件的话,应该会想到一种解决的办法——通过 XML-RPC 接口。
现有解决方案
本来以为网上解决方案会比较多呢,结果 google 搜到的都是一些不相关的(因为 Supervisor 本来就是一个单词),百度就找到一篇《Supervisor 集群管理 WEB UI》,大致看了一下,可行,不过我是主要做后端开发的,php 一窍不通,决定去官网看看。
官网上关于多实例管理的方案还是那四个:(http://supervisord.org/plugins.html#dashboards-and-tools-for-multiple-supervisor-instances)
- Django-Dashvisor(2011)
Web-based dashboard written in Python. Requires Django 1.3 or 1.4. - Nodervisor(2015)
Web-based dashboard written in Node.js. - Supervisord-Monitor(2015)
Web-based dashboard written in PHP. - SupervisorUI(2012)
Another Web-based dashboard written in PHP.
四个项目,最后一次更新的年份我已经标注在后边的括号里了。这三种语言中,其中我最熟悉的也就 Python 了,不过这项目已经 4 年没更新了,pass 掉。四个中“最新”的应该是 Supervisord-Monitor。又看了一下 Nodervisor 的代码,虽然没接触过 Node.js,但是我还是有较好的 JavaScript 基础的,代码看起来并不吃力,并且服务器上都安装过 nodejs 环境,就用它了。(它若不好用就准备自己用 Golang 写一个了。。。)
安装
安装 Nodervisor 没什么复杂的,按照其 GitHub 上的 README 安装就好了,步骤简述如下:
安装 Node.js 环境
node 的版本好像不能过高,我 Mac 上node -v
和npm -v
分别是v4.2.0
和2.14.7
,在安装 Nodervisor 的时候报错(主要表现为安装 sqlite 模块时报错)。服务器上v0.10.40
的 node 就没有问题。我也不懂 Node.js,希望懂的朋友能指点一下。另外为什么版本号差异这么大?
如果你的 node 不好使,可参考这篇文章,先删除 node,并按以下步骤安装
1 |
|
安装 nodervisor
先找个目录把 nodervisor clone 下来,然后执行npm install
1 |
|
Tips: 因为众所周知的原因,建议把 npm 源换成淘宝 npm 源
1 |
|
等执行完毕并且没有报错的话,nodervisor 就安装好了。直接执行以下命令就启动 nodervisor 了
1 |
|
然后你可以通过 3000 端口访问它,例如本机的话 http://localhost:3000 (当然,可以自己指定端口的)
默认的登录账户:
- Email: admin@nodervisor
- Password: admin
登录后点击导航栏的 Hosts 就可以添加 Supervisor 实例了。这里需要注意:
- 你的 Supervisor 的配置中要配置
[inet_http_server]
以允许 xmlrpc 接口调用 *[inet_http_server]
中是可以设置username
和password
的
一个栗子如下:
1 |
|
再次回到首页应该就能看到你刚刚添加的 Host 与它管理的 Process 了。
Tips: 如果只看到 Host 没有看到它管理的进程,并且无任何报错的话,八成是因为你 Supervisor 配置用户名密码,而 Host Url 里边没有认证信息。
一点小改进
你可能会注意到你的 nodervisor 和我的看起来不太一样,我是把它 fork 下来改动了一些地方,主要有:
- 增加
EXITED
状态相关的一些东西。原来EXITED
状态的话,按钮处会一直为Updating
,无法启动,现在为Start
,并调整背景色。EXITED
状态有人在源 repo 中提了 RP,但看着好像并未真正实现。 - Changed 栏以前从未启动过的程序会显示“46 years ago”,现在和 Supervisor 自带 WebUI 中的描述一致——“Not started”。
- 去掉了导航栏的背景色,感觉这样更加和谐一点。
- 每个 router 方法入口处都 check 一下权限,User 用户登录后直接跳到
/dashboard
而不是/
。 - Dash 页面显示上方导航栏,否则 User 无法 logout。
- 增加一个 Dockerfile 以便快速构建一个 nodervisor 的 container(感谢@jrandall,他已向源 repo 提了 RP)
- 对 Process 进行操作(Start、Stop 或 Restart all)的时候,增加了一个确认弹窗,以避免误操作。
- 增加“全部展开”、“全部折叠”按钮。
- 调整了“新增”或“修改” Hosts、Users 和 Groups 后的重定向规则。
- 在日志的
stdout
页增加 “ClearLogs” 按钮,因为一般都会配置redirect_stderr=true
,所以stderr
页就不加了。注:“ClearLogs” 会把stdout
和stderr
的都清理掉,官方只给了这么一个接口。 - 为单个进程(
RUNNING
状态的)增加 “Restart” 按钮。 - 日志中的特殊字符进行转义(感谢@DeanF)
- 可以配置绑定的 host(默认
127.0.0.1
)
你可以从这里获取:https://github.com/zhaoyibo/nodervisor
TODO
- [DONE]
本来想为单个 Process 增加一个 Restart 按钮的,但是看了官方的 API,发现官方并未直接提供restart()
方法,而是需要先stop()
再start()
(nodervisor 的“Restart all”也是这么实现的),目前看来这个并不急切需要,有空了加上。 - ./routes/ajax_supervisord.js 的函数入口加权限过滤
- [DONE]
增加“全部展开”、“全部折叠”按钮 - [DONE]
增加“清除日志”按钮 - 毕竟之前没接触过 Node.js,对 nodervisor 只能比葫芦画瓢。抽空用 Golong 写一个,顺便可以练练手:P
参考资料:
Supervisor 集群管理 WEB UI (monitor)
GitHub - TAKEALOT/nodervisor
Supervisor - Dashboards and Tools for Multiple Supervisor Instances
如何彻底删除 node.js 以及 node.js 安装教程