Tiresias v0.3

本文是 Self-made Wheels 系列的第 3 篇文章, 共 4 篇。

经过一段时间的摸鱼,Tiresias 发布了 v0.3 。新版本重新实现了 sync 的逻辑并且修复了部分 BUG,完整的 changelog 可以参考: https://github.com/Xuanwo/tiresias/blob/master/CHANGELOG.md 。这篇文章主要介绍一下新的 sync 逻辑是如何实现的并介绍一下新增的功能。

Tiresias 是一个服务器信息管理工具,其目标是自动化服务器信息管理,取代手工维护的 Hosts 和 SSH Config

新的 Sync 逻辑

最开始想做一个简单易用的工具,因此没有引入任何复杂的逻辑,只是简单的从不同的 Source 端点中读取数据并写入到配置好的 Destination 端点中。但是在实际的使用中遇到了这样的一些问题:

  • 无法处理 Source 端点不可达的情况,直接报错导致所有的 Source 都更新失败
  • 某些 Source 网络不可达(比如这个 Source 是一个在 VPC 中的 Consul 节点),但是 Tiresias 会一直尝试链接并等待
  • Source 的数据没有持久化,导致部分 Source 失败的时候,Destination 中被更新了不完整的数据

为了解决上述的问题,Tiresias 在 v0.3 中引入了一个全新的 Sync 逻辑:将 Source 的读取和 Destination 的更新拆开,从 Source 中读取到的数据将会写入本地的 leveldb 当中,而 Destination 更新时也会从 leveldb 中读取。更完整一些的逻辑是这样的:

  • 从 leveldb 中读取所有已经存储 Source,并保存在 StoredSources 当中
  • 从配置文件中读取到的所有初始化成功的 Source 将会存储在 ExpectedSources 当中
  • 尝试连接所有的 Source,连接失败的会跳过,而连接成功的会存储在 AvailableSources 当中
  • 遍历所有的 AvailableSources,更新 db 中的数据
  • 从 DB 中读取所有数据,更新所有已配置的 Destinations
  • 遍历 StoredSources,删除所有不存在于 ExpectedSources 中的数据

在新的 Sync 逻辑下,Tiresias 可以更好地处理如下情况:

  • 初始化失败的 Source 会被忽略并从 DB 中删除
  • 连接失败的 Source 将会跳过
  • 已经被删除的 Source 将会从 DB 删除
  • 有内容更新的 Source 将会完整的进行更新

新增的功能

从上一次发文章到现在,Tiresias 增加了对 fs glob path 的支持:

src:
  - type: fs
    options:
      path: /home/xuanwo/.tiresias/server/*.yaml

这样就可以很舒服的把服务器拆分到多个文件进行管理了(

除此以外,还增加了对 Consul 的支持:

src:
  - type: consul
    options:
      address: 1.2.4.8:8500
      schema: http
      datacenter: test
      prefix: test-
    default:
      user: root
      identity_file: ~/.ssh/key

告别手动维护 hosts 和在群里询问 XXX 环境的 IP 是多少的过去(

动态

  • 过了一个很平淡的生日,又老了一岁(
  • 为自己还能手写 Trie 树感到激动不已
  • 工作细胞 真香
  • Angels of Death 真甜
  • 周末把尼尔的六周目给通了(上一个三周目的时候特别感动把存档删了 = =)
  • 跟朋友去试了下包肉,第二天肚子疼+拉稀一天,差评
  • 终于找到由头又水了一篇,开心
comments powered by Disqus