写点什么

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

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

关注

评论

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

数据特征采样在 MySQL 同步一致性校验中的实践

vivo互联网技术

MySQL 数据传输 端对端一致性校验 数据流校验

mac鼠标键盘共享:ShareMouse for Mac 激活版

你的猪会飞吗

Mac软件下载站

从裁员到入职18k+,收获4个Offer,道阻且长不怯步

测试人

软件测试

天工一刻 | 一文看懂小模型与端侧模型

新消费日报

全网寻找硬核球迷!| AI一键生成欧洲杯粉丝专属贴纸

阿里云大数据AI技术

人工智能 欧洲杯 AIGC ArtLab PAI

BetterDisplay Pro Mac(显示器管理工具)v2.0.11版

Mac相关知识分享

Mac软件

Proxyman Premium for Mac(网络调试和分析工具)v5.5.0版

Mac相关知识分享

网络调试 抓包分析工具

硬核解读,WeTune是如何提升数据库查询重写性能?

华为云开发者联盟

数据库 华为云 华为云GaussDB 华为云开发者联盟 企业号2024年7月PK榜

LED透明屏幕引领传媒新趋势

Dylan

技术 品牌 LED显示屏 led显示屏厂家 市场

数字身份管理发展趋势:扩展身份安全能力

芯盾时代

身份安全 iam 统一身份认证

双核驱动的新质生产力,阿里云如何做?

阿里云大数据AI技术

人工智能 大数据 阿里云 datafun

公有链、私有链与联盟链:区块链技术的多元化应用与比较

天津汇柏科技有限公司

区块链 联盟链 公有链 私有链

手工转测试开发成功秘籍揭秘:从裁员到入职18k+,收获4个Offer,道阻且长不怯步

霍格沃兹测试开发学社

Ample Sound Ample Guitar SJ for mac(原声吉他插件)v3.7.0版

Mac相关知识分享

吉他模拟插件

Live Home 3D Pro for mac(3D家庭室内设计工具)v4.9.2版

Mac相关知识分享

室内设计软件

字节跳动基于TrafficRoute DNS的超千亿级调度解析优化实践

火山引擎边缘云

DNS Tr IP 路由

福利来了!MoneyPrinterPlus可以自动配置环境和自动运行了

程序那些事

工具 程序那些事 AIGC MoneyPrinterPlus

基于STM32的重力感应售货机系统设计

DS小龙哥

7月月更

苹果获得OpenAI董事会观察员职位!Runway正筹集新一轮融资,估值40亿美元!|AI日报

可信AI进展

人工智能

通用Agent再升级,游戏办公全精通!昆仑万维/智源/NTU/北大联合发布Cradle

新消费日报

大模型时代数据库技术创新

百度Geek说

数据库 企业号2024年7月PK榜

基于心大陆AI大语言模型的多智能体应用

心大陆多智能体

人工智能 智能体 AI大模型 心理健康 数字心理

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