#冲刺创作新星#Thanos 架构剖析(四)数据存储 原创
Thanos Store 主要提供查询历史数据功能,当Querier组件调用Stroe 接口,Stroe 再通过对象存储接口获取数据,并将存储数据转换成Querier所需的数据格式。
Thanos 数据存储
Thanos 数据存储组件通过 thanos store
命令(也称为store Gateway)在对象存储桶中的历史数据上实现了 store API。它主要充当 API 网关,因此不需要大量的本地磁盘空间。Store 组件在启动时加入 Thanos 集群,并通过 gRPC 端口公布它可以访问的数据。它将所有远程数据块的少量信息保存在本地磁盘上,并使其与存储桶保持同步。在重启期间删除这些数据通常是安全的,但代价是增加了启动时间。
Thanos Store 组件简单的启动方式如下:
thanos store \
--data-dir "/local/state/data/dir" \
--objstore.config-file "bucket.yml"
bucket.yml 是访问对象存储的配置文件。
通常,存储在对象存储桶中的每个时序格式的监控数据块平均需要6 MB的本地磁盘空间,但是对于具有大标签集的高基数块,它甚至可以达到30MB甚至更多。 Store 中的数据是用于预先计算的索引,其中包括符号和发布的偏移量以及元数据JSON。
基于时间分区
默认情况下,Thanos Store Gateway查看 Store 对象中的所有数据,并根据查询的时间范围返回它。
Thanos Store 使用 -—min-time
,-—max-time
参数允许使用者根据当前时间的时间持续时间或者恒定时间来对 Thanos Store 进行分片。
例如设置 -—min-time=-6w
,-—max-time=-2w
将使 Thanos Store Gateway 的查询返回指标在距离现在过去 6 周到距离现在过去 2 周的时间范围内。
常量时间需要以 RFC3339 格式设置,比如 --min-time=2018-01-01T00:00:00Z
,--max-time=2019-01-01T23:59:59Z
。
Thanos Store Gateway 有时候不会立即获得新的块,因为时间分区部分是在异步块同步作业中完成的,默认情况下每3分钟完成一次。此外,一些对象存储在实现过程中提供了最终的读写一致性,这意味着 Thanos Store可能不会立即创建和上传块。
在使用过程中建议 Thanos Sidecar 和其他 Thanos Store 网关有重叠的时间范围,这即使部分失败也并不影响最后的数据查询。Thanos Query 通过合并它们来处理重叠的时间序列。
另外,因为过滤是在块级别上完成的,所以 Thanos Store 可能仍然返回 -—min-time
和-—max-time
之外的监控数据。
探针
Thanos Store 提供 2 个探针接口
/-/healthy 初始设置完成后立即启动,仅表示程序已经启动
/-/ready 在所有的引导完成后(例如初始的索引构建),并准备服务流量。
这两个接口的设计是符合云原生对应用的设计要求的,Kubernetes、Prometheus 都实现了这样的接口。
索引缓存
Thanos Store Gateway 支持一个索引缓存来加速TSDB块索引的并最终提高查询速度。支持三种类型的缓存:
- 内存
- memcached
- Redis
使用内存进行索引缓存
默认情况下,内存索引缓存是启用的,它的最大大小可以通过参数--index-cache-size
来配置。
另外,还可以使用 --index-cache.config-file
来指定内存索引缓存的配置文件的,或者通过 --index-cache.config
参数来放置 YAML 配置。
type: IN-MEMORY
config:
max_size: 0
max_item_size: 0
max_size: 缓存可以包含的总最大字节数,这个值使用字节单位指定(例如:250 MB)。
max_item_size: 单个条目的最大大小,以字节为单位。该值应该用字节单位指定(例如:125 MB)。
使用 memcached 进行索引缓存
memcached 索引缓存允许使用 memcached 作为缓存后端。该缓存类型使用--index-cache.config-file
来指定内存索引缓存的配置文件的,或者通过 --index-cache.config
参数来放置 YAML 配置。
type: MEMCACHED
config:
addresses: []
timeout: 0s
max_idle_connections: 0
max_async_concurrency: 0
max_async_buffer_size: 0
max_get_multi_concurrency: 0
max_item_size: 0
max_get_multi_batch_size: 0
dns_provider_update_interval: 0s
auto_discovery: false
使用 Redis 进行索引缓存
Redis 索引缓存允许使用 Redis 作为缓存后端,--index-cache.config-file
来指定内存索引缓存的配置文件的,或者通过 --index-cache.config
参数来放置 YAML 配置。
type: REDIS
config:
addr: ""
username: ""
password: ""
db: 0
dial_timeout: 5s
read_timeout: 3s
write_timeout: 3s
pool_size: 100
min_idle_conns: 10
idle_timeout: 5m0s
max_conn_age: 0s
max_get_multi_concurrency: 100
get_multi_batch_size: 100
max_set_multi_concurrency: 100
set_multi_batch_size: 100
为了从对象存储中查询块内部的序列,存储网关必须从每个块索引中知道某些初始信息。为了实现这一点,在启动时,网关为每个块构建一个索引头,并将其存储在本地磁盘上;这样的索引头是通过下载原始块的索引的特定片段,存储在本地磁盘上,然后映射并由存储网关使用。