【工具】一款基于go语言的agent

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一 介绍      在构建数据库自动化运维系统的时候,数据库服务器上必须要有一个agent来执行web服务器端发起的命令,我们研究了好几种技术Celery,Redis Queue 或者基于socket实现,当然还有自己写,因为之前有同事已经完成了一个agent---servant,在和同事沟通之后,我们决定复用servant,不用重复造轮子。
一 介绍
     在构建数据库自动化运维系统的时候,数据库服务器上必须要有一个agent来执行web服务器端发起的命令,我们研究了好几种技术Celery, Redis Queue 或者基于socket实现,当然还有自己写,因为之前有同事已经完成了一个agent--- servant,在和同事沟通之后,我们决定复用servant,不用重复造轮子。 servant是一款基于go语言编写的,通过http协议调用,提供权限认证和远程调用,支持异步执行命令的agent ,满足我们目前数据库备份任务,定时收集数据库元数据信息,定时校验备份的有效性的任务需求。本文是一篇how to 文档,相对比较详细的介绍如何安装和使用servant,希望对读者朋友有所帮助。

二安装
2.1 软件准备
因为该agent是基于go语言编写的,所以要安装 go语言包
  1. yum install -y go
  2. cd /opt/
  3. git clone https://github.com/xiezhenye/servant.git
  4. cd /opt/servant
  5. 方式一 make rpm
  6. 方式二 make
2.2 目录结构
编译之后查看主要的目录结构
bin           # 编译的二进制文件 
conf         # 配置文件目录
example   #
README.md  
scripts     #servantctl 执行文件 用于启停 查看状态等
src          #源代码文件
维护servant的操作命令 
/opt/servant/scripts/servantctl (start|stop|restart|status|help)
启动的时候遇到报错请到/data/logs/servant/servant.log 查看log的信息哪里有错

2.3 配置文件详解
默认在/opt/servant/conf里面有配置文件 servant.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <config>
  3.     <server>
  4.         <listen>:2465</listen>  #监听的端口
  5.         <auth enabled="true">   #调用的时候是否启用 权限 验证,生产环境建议开启
  6.             <maxTimeDelta>30</maxTimeDelta> # 启动权限验证的时候 超时时间,超过30s 则认为该调用无效
  7.         </auth>
  8.         <log>/data/logs/servant/servant.log</log> # 日志目录log ,这是有赞标准的日志目录,其他朋友在自己环境需要适当调整
  9.     </server>
  10.     <!-- ...... -->
  11. </config
example 的配置文件,使用的时候需要根据实际情况进行调整
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <config>
  3.     <server> ##server和/opt/servant/conf/servant.xml 配置是一样的。
  4.         <listen>:2465</listen>
  5.         <auth enabled="0">
  6.             <maxTimeDelta>300</maxTimeDelta>
  7.         </auth>
  8.         <log>servant.log</log>
  9.     </server>
  10. #commands 定义了一个可执行的命令组,其中包含了多个command,其中
  11. lang 可以是exec 或者bash
  12. id 是每一组command的标示,runas标示以什么样的用户执行。
  13. background="true" 标示以后台方式执行,并且servant 立即返回
  14.     <commands id="db1">
  15.         <command id="foo" runas="mysql" lang="bash">
  16.             <code>echo "hello world $(whoami)"</code>
  17.         </command>
  18.         <command id="grep" lang="exec">
  19.             <code>grep hello</code>
  20.         </command>
  21.         <command id="sleep" timeout="5" lang="exec">
  22.             <code> sleep ${t}</code>
  23.         </command>
  24.     </commands>
  25. # daemon
  26.     <daemon id="daemon1" retries="10" lang="bash">
  27.         <code>sleep 10000</code>
  28.     </daemon>
  29. # 定时器 ,定期执行某一个命令
  30. tick 执行命令的间隔
  31. deadline 命令执行的最长时间,如果为5s 则命令最长执行5s ,超过5s会被kill掉?
  32.     <timer id="xx" tick="5" deadline="5" lang="bash">
  33.         <code>
  34.         <![CDATA[
  35.              date >>/tmp/timer.log
  36.         ]]>
  37.         </code>
  38.     </timer>
  39. #文件操作类,和commands类似,可以配置多个操作文件的命令,主要包含 获取文件内容,创建文件,删除文件,读取指定字节范围
  40. root 表示有权限访问指定的目录,例子中是访问 /tmp/ 目录下的文件。
  41.     <files id="db1">
  42.         <dir id="binlog1">
  43.             <root>/tmp/</root>
  44.             <allow>get</allow>
  45.             <allow>head</allow>
  46.             <allow>post</allow>
  47.             <allow>delete</allow>
  48.             <allow>put</allow>
  49.             <pattern>log-bin\.\d+</pattern> #正则表达式
  50.         </dir>
  51.     </files>
  52. #这个比较少用 访问数据库
  53.     <database id="mysql" driver="mysql" dsn="root:@tcp(127.0.0.1:3306)/test">
  54.         <query id="select_1">select 1;</query>
  55.     </database>
  56. #
  57.     <vars id="vars">
  58.         <var id="foo">
  59.             <value>bar</value>
  60.         </var>
  61.         <var id="hello" expand="true">
  62.             <value>${world}</value>
  63.         </var>
  64.     </vars>
  65. # 配合auth=true的时候一起使用,访问的时候 必须使用和配置文件中指定的user ,否则不能调用servant
  66.     <user id="user1">
  67.         <key>someKey</key>
  68.         <host>192.168.1.0/24</host> #指定允许访问servant 的ip源地址。通常建议使用本地调用,更加安全。
  69.         <files id="db1" />
  70.         <commands id="db1" />
  71.     </user>
  72. </config>
以上针对常用的配置做了解释,更加详细的解释可以参考 servant的readme.md
2.4 具体的测 试用例   为了测试方便,先去掉权限认证。
comand 支持get 和post 两种方式调用
  1. [root@rac4 22:38:05 /opt/servant/conf/extra]
  2. # curl http://127.0.0.1:2465/commands/db1/foo
  3. hello world mysql
  4. [root@rac4 22:40:07 /opt/servant/conf/extra]
  5. # echo "hello world" | curl -XPOST http://127.0.0.1:2465/commands/db1/grep -d @-
  6. hello world
  7. [root@rac4 22:40:08 /opt/servant/conf/extra]
  8. # echo "hxxello world" | curl -XPOST http://127.0.0.1:2465/commands/db1/grep -d @-
文件类型操作
获取文件内容
  1. [root@rac4 22:38:00 /opt/servant/conf/extra]
  2. # curl http://127.0.0.1:2465/files/db1/test/yz.log
  3. youzan ,nihao ,yangyi dba
创建文件
  1. [root@rac4 22:41:56 /opt/servant/conf/extra]
  2. # curl -XPOST http://127.0.0.1:2465/files/db1/test/54.txt -d "hello world "
  3. 验证上面的写入情况
  4. [root@rac4 22:42:03 /opt/servant/conf/extra]
  5. # curl http://127.0.0.1:2465/files/db1/test/54.txt
  6. hello world
更新文件内容
  1. [root@rac4 22:45:13 /opt/servant/conf/extra]
  2. # curl -XPUT http://127.0.0.1:2465/files/db1/test/54.txt -d "yangyi dba"
  3. [root@rac4 22:45:26 /opt/servant/conf/extra]
  4. # curl http://127.0.0.1:2465/files/db1/test/54.txt
  5. yangyi dba
开启权限验证生产环境下从安全的角度考虑建议开启权限验证
修改配置文件 启用auth 为true 和设置user 配置
  1. [root@rac4 22:16:50 /opt/servant/conf]
  2. # uri='/commands/db1/foo'
  3. # ts=$(date +%s)
  4. # key=someKey
  5. # curl -H "Authorization: ${user} ${ts} $(echo -n "${user}${key}${ts}GET${uri}"|sha1sum|cut -f1 -d' ')" "http://127.0.0.1:2465${uri}"
  6. [root@rac4 22:30:30 /opt/servant/conf]
log报错 执行失败,因为ts 的实际时间是 22 : 16 : 50,执行的实际时间是22:30:30  超时时间是30s,故调用失败
  1. 2017/05/05 22:30:29 INFO (6) [commands] + 127.0.0.1:42798 GET /commands/db1/foo
  2. 2017/05/05 22:30:30 WARN (6) [commands] - auth failed: timestamp delta too large
重新设置时间 ts  再次执行 成功。
  1. [root@rac4 22:30:58 /opt/servant/conf]
  2. # ts=$(date +%s)
  3. [root@rac4 22:31:02 /opt/servant/conf]
  4. # curl -H "Authorization: ${user} ${ts} $(echo -n "${user}${key}${ts}GET${uri}"|sha1sum|cut -f1 -d' ')" "http://127.0.0.1:2465${uri}"
  5. hello world mysql
  6. 日志输出
  7. 2017/05/05 22:31:05 INFO (7) [commands] + 127.0.0.1:42808 GET /commands/db1/foo
  8. 2017/05/05 22:31:05 INFO (7) [commands] command: [bash -c echo "hello world $(whoami)"]
  9. 2017/05/05 22:31:05 INFO (7) [commands] process started. pid: 27706
  10. 2017/05/05 22:31:05 INFO (7) [commands] - execution done
2.5 安装过程中遇到的问题
1 安装的时候 需要创建 
mkdir -p /opt/servant/conf/extra
2 认证权限问题
因为默认的/opt/servant/conf/servant.xml 的auth =true ,需要改为false。
不然使用curl 执行命令
curl http://127.0.0.1:2465/commands/db1/foo 
日志里面报错
2017/05/05 21:52:30 INFO (3) [commands] + 127.0.0.1:41988 GET /commands/db1/foo
2017/05/05 21:52:31 WARN (3) [commands] - auth failed: bad auth header

三 总结
  总体上而言 ,servant能够满足大部分的agent需求,欢迎大家使用,如果有任何问题 可以联系我反馈或者联系 作者  
如果您觉得对你的devops有帮助 ,可以赞助 一瓶饮料。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
13天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
14天前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
19天前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
23天前
|
算法 安全 Go
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
45 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
|
18天前
|
开发框架 前端开发 Go
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
155 7
|
15天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
28 3
|
1月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
80 20
|
15天前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
19天前
|
存储 开发框架 Devops
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
120 8
|
19天前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。

热门文章

最新文章