# Tiresias v0.3

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

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

<!--more-->

## 新的 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 的支持：

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

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

除此以外，还增加了对 Consul 的支持：

```yaml
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 树感到激动不已
- [工作细胞](https://www.bilibili.com/bangumi/media/md102392) 真香
- [Angels of Death](https://www.bilibili.com/bangumi/media/md102792) 真甜
- 周末把尼尔的六周目给通了（上一个三周目的时候特别感动把存档删了 = =）
- 跟朋友去试了下[包肉](http://www.dianping.com/shop/5864352)，第二天肚子疼+拉稀一天，差评
- 终于找到由头又水了一篇，开心

