STAT hub是一个基于Java的集群管理平台,他可以做服务分发、进程守护、健康检测、资源分配。STAT hub可以托管任意进程,可以是你自己开发的服务,也可以是开源的Tomcat、Kafka,或者是某个遗留系统,唯一的要求是进程需要以foreground方式运行(一般都支持,即使不能支持也只需要做很少的改动)。STAT hub的主要功能有:
- 节点管理:管理集群中的节点,掌握节点的状态,了解每个节点上运行了哪些进程;
- 应用管理:创建和管理应用,制定应用的分配规则,了解进程的数量和分配情况。
STAT hub分为master和agent两个部分。master提供应用操作界面,用户可以编排服务;agent运行在工作节点上,守护工作进程。master和agent之间使用HTTP协议通信。
- 操作系统
- master:基于纯Java环境,可以在大部分操作系统上运行:Windows、Linux、macOS
- agent:Linux操作系统,内核版本2.6.24以上,x86或arm架构,32或64位都经过测试;
- 基础环境:Java 1.8+
代码地址:
https://github.com/lane-cn/stat
运行构建命令:
mvn package
得到构建包:
- agent/target/stat-agent-1.0.0-SNAPSHOT.jar
- server/target/stat-server-1.0.0-SNAPSHOT.jar
下载构建包:
- http://121.199.25.213/stat/stat-agent-1.0.0-SNAPSHOT.jar
- http://121.199.25.213/stat/stat-server-1.0.0-SNAPSHOT.jar
启动master进程:
java -jar stat-server-1.0.0-SNAPSHOT.jar
完整的启动参数:
参数 | 说明 | 默认值 |
---|---|---|
server.port | 服务端口 | 51026 |
store.directory | 数据存储路径 | ${HOME}/.stat_server |
elastic.http.port | 内置Elasticsearch存储端口(HTTP) | 51027 |
elastic.tcp.port | 内置Elasticsearch存储端口(TCP) | 51028 |
启动后在以下位置提供服务:
服务地址 | 说明 |
---|---|
http://master:51026 | 用户界面 |
http://master:51026/_plugin/head | Elasticsearch数据管理界面 |
http://master:51027 | Elasticsearch HTTP服务端口 |
tcp://master:51028 | Elasticsearch TCP服务端口 |
启动agent进程:
java -jar stat-agent-1.0.0-SNAPSHOT.jar --master.address=http://master:51026
完整的启动参数:
参数 | 说明 | 默认值 |
---|---|---|
master.address | master位置。可以不指定,以独立模式运行 | |
server.port | 服务端口 | 51025 |
store.directory | 数据存储路径 | ${HOME}/.stat_agent |
agent.address | 一般情况下agent可以自动报告自己的地址。在某些环境下无法获取正确的IP地址,需要指定agent.address参数 |
启动后在以下位置提供服务:
服务地址 | 说明 |
---|---|
http://agent:51025 | 用户界面 |
agent启动后向master报告节点信息。节点信息如下:
{
"hostname": "hostname1",
"agentAddress": "http://192.168.1.165:51025",
"os": {
"name": "Mac OS X",
"version": "10.13.1",
"cpus": 4,
"architecture": "x86_64"
},
"memory": {
"total": 8589934592,
"ram": 8589934592
},
"networks": [{
"address": "192.168.1.165",
"name": "en4",
"mtu": 1500,
"broadcast": "192.168.1.255",
"description": "en4",
"distination": "0.0.0.0",
"flags": 34915,
"hwaddr": "00:9A:9F:9F:A6:EB",
"metric": 0,
"netmask": "255.255.255.0",
"type": "Ethernet"
}],
"disks": [{
"dirName": "/",
"devName": "/dev/disk1s1",
"flags": 0,
"option": "rw,local,rootfs",
"sysTypeName": "apfs",
"type": 1,
"typeName": "none",
"total": 250790436864
},{
"dirName": "/private/var/vm",
"devName": "/dev/disk1s4",
"flags": 0,
"option": "rw,noexec,noatime,local",
"sysTypeName": "apfs",
"type": 1,
"typeName": "none",
"total": 250790436864
}],
"tags": [
"appserver",
"ssd"
]
}
标签属性可以在用户界面上修改;其他信息是自动收集的,不用修改。
节点检索可以用来对节点进行查询和管理,也可以用来对进程运行位置进行规划。使用全文检索语法对节点进行检索,最简单的检索语法是一个词,比如hostname1
、appserver
。复杂一些的检索可以使用通配符,比如这个通配符,可以返回所有的节点:
*
用这个通配符,可以返回所有以“hostname”开头的节点
hostname*
可以使用通配符查询IP地址段:
192.168.1.*
可以在查询语法中加上属性,这样查询更加精确:
networks.address:192.168.1.165
可以准确指定一个地址段,这样:
networks.address:[192.168.1.100 TO 192.168.1.150]
对数值属性可以查询数值范围,比如要查询CPU大于8核的节点:
os.cpus:>8
可以关联组合多个查询语法,比如要查询内存大于8G,并且地址在某个段内的节点,可以这样:
memory.total:>8000000000 AND networks.address:[192.168.1.100 TO 192.168.1.150]
可以用标签属性查询。为不同用途的节点添加标签,然后按照标签进行节点管理和应用编排,这是一个好办法:
tags:appserver AND tags:hpc
应用是一个持续运行的服务,可以运行在多个节点上,每个节点上可以运行多个进程。应用定义了这些进程的启动运行参数。在STAT hub上部署一个应用:
{
"name": "http_server",
"toProcess": "python",
"workingDirectory": "/opt",
"envs": {
},
"args": [
"http_server.py"
],
"ports": [
0,
0
],
"killSignal": 15,
"uris": [
"http://121.199.25.213/stat/http_server.py"
],
"healthChecks": [{
"initialDelaySeconds": 60,
"intervalSeconds": 20,
"maxConsecutiveFailures": 3,
"path": "/",
"portIndex": 0,
"protocol": "HTTP",
"timeoutSeconds": 20
}],
"resAlloc": null
}
http_server.py
是一个Python脚本,它启动一个HTTP监听端口。agent运行命令启动进程,在Linux环境下,命令会封装成/bin/sh -c python http_server.py 8080
形式。进程启动后,agent会获取进程的stderr
和stdout
输出流。
agent在启动前会检查uri
指定的位置。如果有更新的文件,把文件下载到本地工作目录。如果文件是*.zip
格式,agent会尝试对文件进行解压。
可以指定进程使用的端口。0
表示随机端口,由agent选择。多个端口输入的时候用逗号(半角)分隔。
agent对进程健康情况进行检查。进程启动60秒后,每隔20秒对第0个端口发起一个HTTP请求,检查请求的返回代码。如果连续3次返回错误代码,就杀死进程重新启动。
agent为进程分配必要的资源,包括内存、CPU核数、磁盘空间。//TODO 资源分配未实现
编排是控制服务的运行位置和进程数量。
运行节点控制服务运行的位置,输入节点检索条件,默认的条件是*
,代表所有节点。计划进程数控制服务运行的进程数。
应用启动后,master会按照编排规则自动分配服务进程。
[ ] agent资源控制,使用cgroup控制进程使用的资源
[ ] Windows系统支持:守护进程在windows环境下得不到工作进程的pid