开发一个 Agent 服务,需要注意(考虑)哪些点啊,求指导 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ns2250225
V2EX    程序员

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

  •  
  •   ns2250225
    ns2250225 2019-02-27 01:10:35 +08:00 5994 次点击
    这是一个创建于 2420 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     2916 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:26 PVG 22:26 LAX 07:26 JFK 10:26
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86