NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:545180
用户头像

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

关注

评论

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

ubuntu编译安装kernel教程。

百度搜索:蓝易云

云计算 Linux ubuntu 云服务器 内核

阿里云出品—高分计算机好书推荐榜

穿过生命散发芬芳

计算机图书

Dify.AI 用户直面会总结:Embedding 技术与 Dify 数据集设计/规划

Dify

开源项目 AI技术实践 LLMOps

Ubuntu如何配置软件镜像源?

百度搜索:蓝易云

云计算 Linux ubuntu 运维 蓝易云

Flink Unaligned Checkpoint 在 Shopee 的优化和实践

Apache Flink

大数据 flink 实时计算

重磅更新 | 大幅提升数据集命中预期;AI 联网搜索能力也来了!

Dify

AI技术 开源软件 LLMOps

JMeter笔记17 | JMeter逻辑控制器简介

测试 单元测试 Jmeter 性能测试 接口测试

GPU 容器虚拟化新能力发布和全场景实践

百度Geek说

人工智能 企业号 8 月 PK 榜

可视化分析30天免费,瓴羊Quick BI助力企业转型

流量猫猫头

专家论道: 唐贤香云纱塑造中国非遗国际品牌

Geek_2d6073

CentOS搭建squid正向代理教程。

百度搜索:蓝易云

云计算 Linux centos 运维 squid

香港云主机的优势,为何成为新一代网站托管首选?

一只扑棱蛾子

云主机 香港云主机

IoT 场景下 TimescaleDB 与 TDengine 的性能对比测试报告出炉!点击查看

爱倒腾的程序员

数据库

🔥对线面试官-线程入门第一课

派大星

线程 Java 面试题

现代化税收征管的“四精”目标 科学技术发挥关键作用

用友BIP

税务管理

云智慧x统信软件:智能化IT服务管理,提升客户服务价值

云智慧AIOps社区

ITSM IT运维 智能运维AIOps 工单管理系统

山东布谷科技iOS端分析直播app源码秒开技术(二):缓冲功能

山东布谷科技

软件开发 ios 开发 首帧秒开 缓冲 直播APP源码

《云管理产品与服务图谱(2023)》发布!MIAOYUN荣登【运维平台】板块

MIAOYUN

云计算 运维平台 云管理平台 云管理 云管理产品与服务图谱

面试 JVM 一问三不知?看这篇就够

java易二三

Java 编程 程序员 计算机

AB实验遇到用户不均匀怎么办?—— vivo游戏中心业务实践经验分享

vivo互联网技术

AB实验 分层抽样 用户不均匀 事前用户分层

腾讯云 ES 重磅推出,一站式全托管的自治索引终于来了!

腾讯云大数据

ES

文本 Embedding 基本概念和应用实现原理

Dify

技术分享 Embedding word embedding

SUSECON 深圳 2023 创新峰会开启报名

Rancher

打包自己的Python应用并上传到PYPI

Rayzh

Python

百度搭台,千家打擂,文心杯创业大赛成投资人新宠?

热爱编程的小白白

北京信息化协会信息技术应用创新工作委员会一行到开放原子开源基金会交流学习

开放原子开源基金会

开源 开放原子开源基金

高效能ScrumMaster的三大权利

ShineScrum捷行

Scrum ScrumMaster

火山引擎DataLeap的Data Catalog系统搜索实践 (上)

字节跳动数据平台

数据中台 数据治理 数据安全 数据研发 企业号 8 月 PK 榜

Gartner首发中国数据、分析与人工智能技术成熟度曲线,柏睿数据入选实时数据管理典型厂商

新消费日报

「2023最新版」Java基础、中级、高级面试题总结(1000道题含答案解析)

架构师之道

Java 面试

基于YonGPT 的智能招聘,全新的数智化招聘体验!

用友BIP

企业服务大模型 YonGPT

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