op-agent
简介
当我们管理的物理机以及数据库实例达到一定体量的时候,我们会面临诸多挑战,比如备份系统可能需要在本地执行任务;慢日志系统可能需要将日志收集到日志管理中心;高可用系统可能需要与本地任务交互,来实现更可靠地实例状态检测;自动诊断系统可能需要在本地执行特殊的任务等。另外我们可能需要快速感知集群拓扑结构的变化并自动更新元数据记录;以及在短时间内快速接收实例元信息等。
基于以上需求,于是设计、开发了一款轻量级的agent,以实现大规模任务的配置、部署、管理、API功能暴露等。
架构部署

架构说明:
op-manager: op-manager是管理所有的op-agent的管理节点,在管理节点上可以配置任务、查看任务、查看任务执行的日志等等。op-manager可以是单个节点,也可以部署成raft集群。
op-agent: 运行在线上物理机上的agent组件。
功能简介
opagent命令行
opagent命令行工具是操作op-manager、op-agent唯一的入口,实现命令行工具的时候参考了kubernetes中kubectl命令的展示形式,重要子命令有get、logs、upload、download、save、analysis几个重要的子命令,可以方便DBA对任务的添加、任务管理、资源状态查看等。
./opagent --help
Example:
opagent get nodes [IP|HOSTNAME] [–o wide]
opagent get jobs [JOBNAME]
opagent get packages [PACKAGENAME]
opagent logs <HOSTIP|ALL> [LIMIT] [–o wide|short]
opagent upload <FILE|DOCUMENT> [deploymentDirName]
opagent download [VERSION]
opagent rollback
opagent save <task.json>
opagent top
opagent analysis <packages|jobs> [jobName] [onceJobVersion]
Usage:
opagent [command]
Available Commands:
get View <nodes|jobs|packages> information
logs View the log information of a task
save Create a task
logs View the log information of a task
download Download the specified version of the task package
upload Upload task package or executable file
rollback rollback the specified version of the task package
analysis Analyze <packages|jobs> status
help Help about any command
completion generate the auto completion script for the specified shell
Flags:
–config string config file name. (default “./opagent.conf.json”)
-h, --help help for opagent
-v, --version version for opagent
Use “opagent [command] --help” for more information about a command.
节点状态查看
op-agent会部署在所有的MySQL物理机上,那么我们需要能很方便的查看这些部署了agent的状态,比如哪些机器的agent挂掉了或者agent没有上报自己的心跳信息到metadb,这样我们可以准确的维护数据库机器的状态。
packages上传、下载、资源查看等
如果需要把本地的shell脚本、python项目、go项目等部署到所有服务器运行,我们需要把本地的项目打包保上传,然后并发的推送到所有机器上,opagent提供了packages管理的所有功能,比如打包上传、下载、资源列表、回滚等操作。
任务编辑、查看、管理等
op-agent最核心的功能就是运行任务,围绕任务,我们可以编辑一个任务的属性,比如任务执行路径、执行周期、超时控制、CPU/内存/IO资源限制、任务执行状态分析等功能。
提供任务的API功能
我们可以通过op-agent暴露出的API功能,可以通过调用api异步/同步地执行每台机器上的任务,此种方式可以把agent功能作为其他模块的子模块,比如集群初始化系统、慢日志分析系统、备份系统、集群元信息收集系统、巡检系统等等。
Analysis、log功能
对于任务的运行状态、每台机器上的任务package是否有缺失等,我们需要能够快速的获得这些信息,opagent提供了packages状态查看、任务运行分析,查看任务运行日志等能力。
功能展示
节点状态查看
查看所有nodes状态
./opagent get nodes

packages 信息查看
查看所有的包信息
./opagent get packages

查看test1.py这个包信息
./opagent get packages test1.py

任务信息查看
查看所有jobs
./opagent get jobs

查看一个任务的详细信息
./opagent get jobs ps-test1.py

部署一个一次执行的简单任务
cat ./ls-l.json
{
“JobName”: “ls-l”,
“Command”: “ls -l /tmp”,
“CronExpr”: “”,
“OnceJob”: 1,
“Timeout”: 10,
“SynFlag”: 0,
“CPUShares”: 128,
“CPUQuotaUs”: 0,
“MemoryLimit”: 0,
“MemorySwLimit”: 0,
“IOReadLimit”: 0,
“IOWriteLimit”: 0,
“IOLimitDevice”: “/dev/sda”,
“Enabled”: 1,
“WhiteHosts”: [
],
“BlackHosts”: [
]
}
保存任务
./opagent save ls-l.json
./opagent get jobs ls-l
查看所有机器执行日志
./opagent logs ls-l
查看一台机器执行日志
./opagent logs ls-l 172.16.123.144
./opagent logs ls-l 172.16.123.144 --o wide
./opagent logs ls-l 172.16.123.144 --o short
分析功能
如果有万台机器,怎么知道哪些没有执行,哪些任务执行失败, 怎么知道上传的包已经全部分发到所有机器上?
./opagent analysis packages #分析所有的包是否传递到了所有机器上
./opagent analysis jobs #分析所有的任务
./opagent analysis jobs ls-l #分析这个任务执行情况
部署一次性执行的python任务
cat python.json
{
“JobName”: “pythonTest”,
“Command”: “python /data/my-agent/src/python-test/python-test.py”,
“Seconds, Minutes, Hours, Day of month, Month, Day of week, Year”: “”,
“CronExpr”: “”,
“OnceJob”: 1,
“Timeout”: 10,
“SynFlag”: 0,
“CPUShares”: 128,
“CPUQuotaUs”: 0,
“MemoryLimit”: 0,
“MemorySwLimit”: 0,
“IOReadLimit”: 0,
“IOWriteLimit”: 0,
“IOLimitDevice”: “/dev/sda”,
“Enabled”: 1,
“WhiteHosts”: [
],
“BlackHosts”: [
]
}
上传package
./opagent upload python-test /data/my-agent/src
保存任务
./opagent save python.json
查看日志
./opagent logs pythonTest
部署周期性任务
cat cycleTest.json
{
“JobName”: “cycleTest”,
“Command”: “python /data/my-agent/src/python-test/cycleTest.py”,
“## Here are some demos”: “”,
“## Seconds, Minutes, Hours, Day of month, Month, Day of week, Year”: “* * * * * * ",
“## Execute 10 seconds”: "/10 * * * * * *”,
“## Execute every minute”: “0 */1 * * * * *”,
“## Execute every hour”: “0 0 */1 * * * *”,
“CronExpr”: “*/3 * * * * * *”,
“OnceJob”: 0,
“Timeout”: 20,
“SynFlag”: 0,
“CPUShares”: 128,
“CPUQuotaUs”: 0,
“MemoryLimit”: 0,
“MemorySwLimit”: 0,
“IOReadLimit”: 0,
“IOWriteLimit”: 0,
“IOLimitDevice”: “/dev/sda”,
“Enabled”: 1,
“WhiteHosts”: [
],
“BlackHosts”: [
]
}
./opagent upload python-test /data/my-agent/src
./opagent analysis packages
保存任务
./opagent save cycleTest.json
查看所有机器日志最近一条日志
./opagent logs cycleTest
查看172.16.123.141机器最近3条日志
./opagent logs cycleTest 172.16.123.141 3
部署一个任务,测试API功能
cat apiTest.json
{
“JobName”: “apiTest”,
“Command”: “python /data/my-agent/src/python-test/pythonWithParams.py --host=‘{host}’ --port=‘{port}’”,
“Seconds, Minutes, Hours, Day of month, Month, Day of week, Year”: “”,
“CronExpr”: “”,
“OnceJob”: 0,
“Timeout”: 0,
“SynFlag”: 1,
“CPUShares”: 128,
“CPUQuotaUs”: 0,
“MemoryLimit”: 0,
“MemorySwLimit”: 0,
“IOReadLimit”: 0,
“IOWriteLimit”: 0,
“IOLimitDevice”: “/dev/sda”,
“Enabled”: 1,
“WhiteHosts”: [
],
“BlackHosts”: [
]
}
./opagent upload python-test /data/my-agent/src
./opagent analysis packages
保存任务
./opagent save apiTest.json
./opagent get jobs apiTest
远程通过接口执行
curl -s --connect-timeout 2 -u sysuser:8w95fa8cw303fc220db1f4c77e2130bea0357302 http://172.16.123.144:8081/api/myAgent -d ‘{“jobname”:“apiTest”, “host”:“192.168.1.1”, “port”:“3306”}’ | jq .
查看日志
./opagent logs apiTest
总结
当前op-agent已经在线上环境的1万+台机器上稳定运行半年的时间,我们在此基础上实现了巡检系统、数据库实例初始化系统、数据备份系统等。简化了其他系统的架构,提升了稳定性、可靠性、可控性等。

134

被折叠的 条评论
为什么被折叠?



