• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ns2250225
V2EX  ›  程序员

开发一个 Agent 服务,需要注意(考虑)哪些点啊,求指导 🤣

  •  
  •   ns2250225 ·
    ns2250225 · Feb 27, 2019 · 6805 views
    This topic created in 2812 days ago, the information mentioned may be changed or developed.
    RT,最近业务需要做一个配置更新的 Agent,配置控制端用了 Nacos,目标节点机器( Nginx,Mysql,Redis 等),想实现一个 Agent,部署到 [目标节点机器] 上面,一个是上报节点功能的健康情况,一个是负责接受 [控制端] 的更新配置请求。
    实现的语言不限(最好是 Golang 或 Python ),暂时考虑到的问题有:
    ( 1 )怎样保持 Agent 长期正常地工作
    ( 2 )使用 HTTP 还是 WebSocket 来连接 [控制端]
    ( 3 ) Agent 自动怎样识别 [目标节点机器] 上的服务是什么
    ...
    PS:
    走过路过千万不要错过呀,留下建议吧,共同交流学习,立个 F,实现之后会开源,💪
    24 replies  •  2019-02-27 14:59:31 +08:00
    THaGKI9
    THaGKI9
    Feb 27, 2019 via iPhone
    1
    1. supervisor
    2. websocket 吧,考虑到上传下达的需求都有
    3. 不懂
    hanxiV2EX
    hanxiV2EX
    Feb 27, 2019 via Android
    2
    sshd 比较合适,控制端用 ssh 远程执行命令就能获取健康。想要更新文件可以用 scp
    cnnblike
    cnnblike
    Feb 27, 2019
    3
    aws 有一个专门的服务叫 cloudwatch,你找下 CloudWatch Agent 就成了
    wispedia
    wispedia
    Feb 27, 2019 via Android
    4
    1.简单点,写个定时检查进程在不在的 shell 脚本,配个 crontab
    2.http
    3.agent 检查当前机器上存活的进程名
    firebroo
    firebroo
    Feb 27, 2019 via Android❤️1
    5
    1. 健康检查 2. rpc 3.没懂
    zw1027
    zw1027
    Feb 27, 2019
    6
    4 楼说完了
    STRRL
    STRRL
    Feb 27, 2019 via Android❤️1
    7
    说一个自己已经实现了吧
    1 supervisor
    2 grpc
    3 由于目标是 Java 进程,用 attach api 拿主类类名
    thisisgpy
    thisisgpy
    Feb 27, 2019
    8
    我司 Agent 推送数据到 Kafka
    Moker
    Moker
    Feb 27, 2019❤️1
    9
    可以参考一下 prometheus 的实现
    1.可以用守护进程 supervisor
    2.http 就行 主动去拉
    ns2250225
    ns2250225
    OP
    Feb 27, 2019
    10
    @STRRL supervisor 是自己另外安装配置的,还是做成 Agent 本身集成的功能呀
    ns2250225
    ns2250225
    OP
    Feb 27, 2019
    11
    @Moker 有没有可能把 supervisor 的功能,集成到 Agent 里面呀,让他自己管理自己
    tianshiyeben
    tianshiyeben
    Feb 27, 2019
    12
    https://github.com/tianshiyeben/wgcloud
    看看,应该可以满足你的需求,监控 linux 服务器和应用程序的状态,包括 cpu,内存使用情况等
    ns2250225
    ns2250225
    OP
    Feb 27, 2019
    13
    @firebroo 哈哈,我参考了你的 slave_sync.py ,那个 graceful_reload 的命令收下拉,👍,打算用 python2 写,因为我们的服务器都是 centos6.9 的,😭,想把 supervisor 的功能集成到 Agent 里面
    ns2250225
    ns2250225
    OP
    Feb 27, 2019
    14
    我想到一个方法:就是程序自己启动一个子进程或线程去监听自己,如果自己挂了,就重新提起来,这样可以吗
    STRRL
    STRRL
    Feb 27, 2019
    15
    @ns2250225 外面的
    因为我的实现里,还是一个 C/S 模型,我没办法保证 C 出问题以后,还能够有能力整治自己。
    xkeyideal
    xkeyideal
    Feb 27, 2019❤️1
    16
    好了很多回答,为什么第二个问题大家都考虑使用 http,websocket 或 grpc 呢,http 不能解决全双工的需求,ws 和 grpc 虽然能解决全双工的需求,但是实际需求有多少是从 agent 给 server 发消息,长连接需要解决断线重连的问题。

    问题二我给的解决思路:加入一个 MQ,任务的下达通过 mq,agent 信息的长传也通过 mq,能很好的解耦
    leaderOrg
    leaderOrg
    Feb 27, 2019 via iPhone❤️1
    17
    有点很重要的,就是对宿主机的影响,你要严格控制自己的 cpu 内存 io 占用
    ry_wang
    ry_wang
    Feb 27, 2019❤️1
    18
    这两年我们组主要的一个工作就是自行开发了内部的配置管理平台,负责 CDN 服务器的日常管理。目前覆盖服务器几万台,每天落到 Agent 端的任务接近 100 万次

    难点主要由以下四个,花费了我们大量的时间和精力。

    1. 网络连通性。CDN 节点的网络条件比较极端,各种无法互联互通。为此我们还单独实现了一套代理集群,供自己和其他业务使用。
    2. 状态一致性。Agent/Server 间数据的一致性问题,资产、任务等一系列信息
    3. Agent 系统资源占用。
    4. 安全性。尽量避免用户直接执行 SHELL 命令,而是统一使用我们的封装。同时 SHELL JOB 将所有命令进行了封装,可能引起危险的操作全都堵死。

    楼主说的这几个问题。

    1. APP 更新及存活检查。我们参考了 open-falcon 的设计,采用 Agent+Updater 的模式,互备检测激活
    2. 通信交互一期我们采用了 HTTP 的定时主动上报方式,不过目前已经在做迁移到 UDP 的准备工作
    3. 这个和业务逻辑相关了,靠 Agent 服务发现或者 Server 主动下发都可以。

    PS,我之前也发过招聘贴,一直有效,大家踊跃投简历呀
    Moker
    Moker
    Feb 27, 2019
    19
    @ns2250225 不能自己管理自己 整个经常都退出了 要依赖外部 类似 newrelic 是会主动去 system 注册一个服务
    doublleft
    doublleft
    Feb 27, 2019
    20
    @ry_wang 设计的时候有参考过类似的开源项目吗
    airfling
    airfling
    Feb 27, 2019❤️1
    21
    这个很简单,代理你用 spring boot 开发,配置更新选择 spring cloud config,这样你既可以更新 agent 的配置也可以使用 agent 触发更新其他服务的配置。基本指标的开发你可以使用 sigar。至于一键部署卸载,你就用一个管理端远程连接到 linux 环境部署,scp 过去。远程连接你选择 jsch
    airfling
    airfling
    Feb 27, 2019
    22
    还有 agent 的数据不是直接发给 server 的,你要用 kafka,作为消息总线,数据我这里以前是存储到 hadoop,后来我就存储到 es 了
    binux
    binux
    Feb 27, 2019
    23
    @xkeyideal #16 用 MQ 虽然不用自己维护那么多 Agent 连接了,但是压力转嫁到 MQ 上有什么本质区别吗?
    xkeyideal
    xkeyideal
    Feb 27, 2019
    24
    @binux 说的没毛病,应该是我没有说清楚,下面我详细表述一下。

    在连接的处理上没有本质区别。

    我想表述的是解耦的问题:
    1. 当 server 下达的任务量比较大,server 是直连多个 agent 的,如果换成 mq,server 只需要连接一个 mq 即可
    2. 当 agent 上传的数据比较多,server 肯定不可能只存在一个,agent 需要连接多个 server 并做好负载均衡的问题,当然加入个 nginx 可以解决,但对 server 的处理能力要求比较高,否则必然导致阻塞,此时加入 mq,每个 agent 只需要连一个 mq 即可,server 可以慢慢处理 mq 的数据
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3581 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 10:08 · PVG 18:08 · LAX 02:08 · JFK 05:08
    ♥ Do have faith in what you're doing.