V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ns2250225
V2EX  ›  程序员

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

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

    问题二我给的解决思路:加入一个 MQ,任务的下达通过 mq,agent 信息的长传也通过 mq,能很好的解耦
    leaderOrg
        17
    leaderOrg  
       2019-02-27 10:27:26 +08:00 via iPhone   ❤️ 1
    有点很重要的,就是对宿主机的影响,你要严格控制自己的 cpu 内存 io 占用
    ry_wang
        18
    ry_wang  
       2019-02-27 11:08:12 +08:00   ❤️ 1
    这两年我们组主要的一个工作就是自行开发了内部的配置管理平台,负责 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
        19
    Moker  
       2019-02-27 11:37:30 +08:00
    @ns2250225 不能自己管理自己 整个经常都退出了 要依赖外部 类似 newrelic 是会主动去 system 注册一个服务
    doublleft
        20
    doublleft  
       2019-02-27 13:15:52 +08:00
    @ry_wang 设计的时候有参考过类似的开源项目吗
    airfling
        21
    airfling  
       2019-02-27 13:29:08 +08:00   ❤️ 1
    这个很简单,代理你用 spring boot 开发,配置更新选择 spring cloud config,这样你既可以更新 agent 的配置也可以使用 agent 触发更新其他服务的配置。基本指标的开发你可以使用 sigar。至于一键部署卸载,你就用一个管理端远程连接到 linux 环境部署,scp 过去。远程连接你选择 jsch
    airfling
        22
    airfling  
       2019-02-27 13:33:37 +08:00
    还有 agent 的数据不是直接发给 server 的,你要用 kafka,作为消息总线,数据我这里以前是存储到 hadoop,后来我就存储到 es 了
    binux
        23
    binux  
       2019-02-27 13:34:07 +08:00
    @xkeyideal #16 用 MQ 虽然不用自己维护那么多 Agent 连接了,但是压力转嫁到 MQ 上有什么本质区别吗?
    xkeyideal
        24
    xkeyideal  
       2019-02-27 14:59:31 +08:00
    @binux 说的没毛病,应该是我没有说清楚,下面我详细表述一下。

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

    我想表述的是解耦的问题:
    1. 当 server 下达的任务量比较大,server 是直连多个 agent 的,如果换成 mq,server 只需要连接一个 mq 即可
    2. 当 agent 上传的数据比较多,server 肯定不可能只存在一个,agent 需要连接多个 server 并做好负载均衡的问题,当然加入个 nginx 可以解决,但对 server 的处理能力要求比较高,否则必然导致阻塞,此时加入 mq,每个 agent 只需要连一个 mq 即可,server 可以慢慢处理 mq 的数据
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5247 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 03:47 · PVG 11:47 · LAX 19:47 · JFK 22:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.