【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

GitHub 开源 Go 库 Vulcanizer,用于与 Elasticsearch 集群交互

  • 2019-04-23
  • 本文字数:3128 字

    阅读完需:约 10 分钟

GitHub开源Go库Vulcanizer,用于与Elasticsearch集群交互

GitHub 将Elasticsearch作为其搜索服务的主要后端支持技术。为了管理好集群,他们通过Hubot使用 ChatOps。截止 2017 年,这些命令是 Bash 和基于 Ruby 的脚本的集合。


尽管这在一段时间内满足了我们的需求,但这些脚本缺乏可组合性和可重用性的缺点变得越来越明显。由于它们特定于 GitHub 基础设施,因此想通过开源这些脚本来回馈社区也很困难。

为什么要构建新的东西呢?

我们有很多优秀的 Elasticsearch 库,其中有官方的也有社区驱动的。对于 Ruby,GitHub 已经发布了Elastomer库。而对于 Go,我们使用用户olivere提供的Elastic库。然而,这些库主要关注的是索引和查询数据。对于一个需要使用 Elasticsearch 的应用程序来说,这正合所需。但是,它不符合 Elasticsearch 集群的操作人员对工具集的需求。我们希望用一个高级 API 实现我们在集群上的常见操作,如:禁用分配或从节点中清除分片。我们的目标是创建一个专注于这些管理操作并易于使用我们现有工具的库。

用 Go 全速前进……

我们开始研究 Go,这是受到了 GitHub 上freno 和 orchestrator的成功的启发。


Go 的结构鼓励构造可组合(自包含、无状态的、可选择和组装的组件)软件,我们认为它很适合该应用程序。

遇上麻烦了

我们最初把该项目作为一个打包的聊天应用程序,并计划开源那些我们只在内部使用的东西。然而,在实施过程中,我们遇到了一些问题:


  • GitHub 使用一个简单协议,该协议基于 JSON-RPC,通过 HTTPS 调用ChatOps RPC。然而,ChatOps RPC 除了 GitHub 外没有被广泛采用。对大多数参与方来说,这将难以把我们的应用程序集成到 ChatOps 基础设施。

  • 我们的 ChatOps 命令所依赖的内部 REST 库没有开源。该 REST 的一些依赖项也将需要开源。我们已经开始开源该库及其依赖项的过程,但是这需要一些时间。

  • 我们依靠Consul进行服务发现,但并不是每个人都用 Consul。


基于这些因素,我们决定把我们库的核心拆分成可以开源的独立包。这将使该包与我们的内部库、Consul 和 ChatOps RPC 解耦。


该包只有这么几个目标:


  • 访问单个主机上的 REST 端点。

  • 执行一项操作。

  • 提供该操作的结果。


然后,可以开源这个模块,而不把它绑定在我们的内部基础设施上。这样,任何人都可以将它与 ChatOps 基础设施、服务发现或他们选择的工具一起使用。


为此,我们编写了 Vulcanizer。

Vulcanizer

Vulcanizer 是用于与 Elasticsearch 集群交互的 Go 库。这并不是说它是一个成熟的 Elasticsearch 客户端。它的目标是提供一个高级 API,以帮助与操作 Elasticsearch 集群相关的常见任务,如:查询集群的健康状态、迁移节点的数据、更新集群的设置等等。

Go API 的示例

几乎在所有需要用到 HTTP 接口来完成的事情上,Elasticsearch 都表现得很好。但是,我们不想手工编写 JSON,尤其是在出问题的时候。以下是一些我们如何把 Vulcanizer 用于常见任务及等效 curl 命令的例子。这些 Go 示例已被简化,没有展示错误处理代码。

获取集群的节点

我们总是希望列出集群中的所有节点,以选择特定的节点或查看集群中每种节点的个数


$ curl localhost:9200/_cat/nodes?h=master,role,name,ip,id,jdk- mdi vulcanizer-node-123 172.0.0.1 xGIs 1.8.0_191* mdi vulcanizer-node-456 172.0.0.2 RCVG 1.8.0_191
复制代码


Vulcanizer 为这类对象公开类型化结构


v := vulcanizer.NewClient("localhost", 9200)
nodes, err := v.GetNodes()
fmt.Printf("Node information: %#v\n", nodes[0])// Node information: vulcanizer.Node{Name:"vulcanizer-node-123", Ip:"172.0.0
复制代码

更新最大恢复集群设置

如果我们希望在集群中平衡恢复时间和 I/O 压力,索引恢复速度是个常见更新设置。curl 版本要编写很多 JSON 代码。


$ curl -XPUT localhost:9200/_cluster/settings -d '{ "transient": { "indices.recovery.max_bytes_per_sec": "1000mb" } }'{  "acknowledged": true,  "persistent": {},  "transient": {    "indices": {      "recovery": {        "max_bytes_per_sec": "1000mb"      }    }  }}
复制代码


该 Vulcanizer API 相当简单。它还会检索及返回该键的所有现有设置,以便记录先前的值。


v := vulcanizer.NewClient("localhost", 9200)oldSetting, newSetting, err := v.SetSetting("indices.recovery.max_bytes_per_sec", "1000mb")// "50mb", "1000mb", nil
复制代码

把碎片移入和移出节点

为了安全地更新一个节点,我们可以设置分配规则,以便从特定节点迁移数据。在 Elasticsearch 设置中,这是一个由逗号分隔的节点名称列表,因此,我们需要注意不要在更新时覆盖现有值。


$ curl -XPUT localhost:9200/_cluster/settings -d '{  "transient" : {    "cluster.routing.allocation.exclude._name" : "vulcanizer-node-123,vulcanizer-node-456"  }}'
复制代码


该 Vulcanizer API 将安全地从排除设置中添加和删除节点。因此,碎片不会被意外地分配到节点上。


v := vulcanizer.NewClient("localhost", 9200)
// Existing exclusion settings:// vulcanizer-node-123,vulcanizer-node-456
exclusionSetttings1, err := v.DrainServer("vulcanizer-node-789")// vulcanizer-node-123,vulcanizer-node-456,vulcanizer-node-789
exclusionSetttings2, err := v.FillOneServer("vulcanizer-node-456")// vulcanizer-node-123,vulcanizer-node-789
复制代码

命令行应用程序

包含一个利用该库的小型 CLI 应用程序:


$ vulcanizer -hUsage:  vulcanizer [command]
Available Commands: allocation Set shard allocation on the cluster. drain Drain a server or see what servers are draining. fill Fill servers with data, removing shard allocation exclusion rules. health Display the health of the cluster. help Help about any command indices Display the indices of the cluster. nodes Display the nodes of the cluster. setting Interact with cluster settings. settings Display all the settings of the cluster. snapshot Interact with a specific snapshot. snapshots Display the snapshots of the cluster.
Flags: -c, --cluster string Cluster to connect to defined in config file -f, --configFile string Configuration file to read in (default to "~/.vulcanizer.yaml") -h, --help help for vulcanizer --host string Host to connect to (default "localhost") -p, --port int Port to connect to (default 9200)
Use "vulcanizer [command] --help" for more information about a command.
复制代码

ChatOps

ChatOps 对 GitHub 和我们这些异地工作人员很重要。Vulcanizer 使我们能够轻松快速地围绕 Elasticsearch 构建 ChatOps 工具,以执行常见任务:




结语

当我们第一次开始尝试这种方法时,有点跌跌撞撞。但是,最终的结果对大家来说都是最好的:


  • 由于我们不得不重新组合我们打算开源的确切功能,因此,我们确保能为自己及社区提供价值,而不只是传送东西。

  • 内部工具不总是遵循工程最佳实践(如正确的版本管理),因此,在开放的环境中开发 Vulcanizer 给了我们外部压力,以确保我们遵循所有的最佳实践。

  • 将所有 Elasticsearch 功能放在其自己的库中,使我们的内部应用程序变得非常轻巧和独立。显然,不同的内部应用程序依赖于 Vulcanizer,而非互相依赖,更不是试图让 ChatOps 和另一个 ChatOps 通信。


请访问Vulcanizer存储库以进行克隆或为该项目做点贡献。我们对 Vulcanizer路径图上未来的发展是有想法的。


阅读英文原文:Vulcanizer: a library for operating Elasticsearch;https://githubengineering.com/vulcanizer-a-library-for-elasticsearch/


2019-04-23 16:545169
用户头像

发布了 199 篇内容, 共 81.4 次阅读, 收获喜欢 293 次。

关注

评论

发布
暂无评论
发现更多内容

2024杭州国际连接器及线束设备展览会

吹吹晚风

2024杭州国际3D打印技术展览会

吹吹晚风

ARTS薪火重启之第一周

渣渣辉

算法 职业规划 心得分享

2024中国(深圳)国际VR/AR虚拟现实展览会

吹吹晚风

达芬奇DaVinci Resolve Studio 18 for mac(视频调色软件) v18.5.1正式激活版

mac

苹果mac Windows软件 DaVinci Resolve Studio 专业视频剪辑软件

突破大模型 | Alluxio助力AI大模型训练-成功案例(一)

Alluxio

机器学习 gpu 模型训练 大模型 AIGC

规划性和可扩展性,助力企业全面预算管理的推进

智达方通

全面预算管理系统 智达方通EPM系统 财务规划与分析 多维模型

【资料包】HDC.Together 2023精选Codelabs指南现已上线(内有活动)

HarmonyOS开发者

HarmonyOS

基于eBPF技术构建一种应用层网络管控解决方案

统信软件

19. 第三方库的管理和虚拟环境

茶桁

Python pip conda

IIOT WiFi solution/IPQ9574 VS IPQ8074 support MU-MIMO-Beamforming-Advanced Wireless Technology

wifi6-yiyi

wifi6 WiFi7

GeaFlow图计算快速上手之K-hop算法

TuGraphAnalytics

大数据 流计算 图计算 图论

洛阳等级保护测评机构有哪些?在哪里?咨询电话多少?

行云管家

等保 等级保护 等保测评 洛阳

2023城博会|上海国际智慧工地展览会

AIOTE智博会

城博会 上海城博会

揭穿DevOps的5个谣言!

互联网工科生

DevOps 运维 自动化运维

到底该不该使用Python?

这我可不懂

Python Go 数据库

如何仅用几分钟就能破解8个字符长的密码?

高端章鱼哥

黑客 密码安全 破译密码

文档比对技术难点与使用场景

合合技术团队

人工智能 算法 文字识别 文档对比

断点续传的未来发展趋势与前景展望

镭速

断点续传 文件传输软件

2024杭州国际工业装配及传输技术展览会

吹吹晚风

2024杭州国际伺服系统与控制技术展览会

吹吹晚风

Programming abstractions in C阅读笔记p111-p113: boilerplate

codists

因为私域流量运营,App重新受重视?

FinFish

小程序生态 私域运营 小程序容器 私域流量运营 流量运营

腾讯云ES:一键配置,LDAP身份验证服务来了!

腾讯云大数据

ES

本地工具是什么意思?本地工具与远程工具一样吗?

行云管家

IT运维 远程工具 本地工具

aspera替代方案:探索这些安全且可靠的文件传输工具

镭速

aspera替代方案 文件传输工具

上央视啦!扫描全能王科技助力社会跑步进入无纸化办公时代

合合技术团队

人工智能 环保 无纸化办公

生成式AI崛起,元宇宙发展遭遇挑战

百度开发者中心

元宇宙 文心一言

面试涨薪神奇操作,直接多给3k的JVM垃圾优化笔记

小小怪下士

Java 程序员 JVM 调优

企业文件外发系统必备八大要素

镭速

文件外发系统

语音聊天源码平台开发小知识

山东布谷网络科技

GitHub开源Go库Vulcanizer,用于与Elasticsearch集群交互_开源_nickcanz_InfoQ精选文章