# Ingester

Ingester负责将写入的指标数据存储到长期存储后端，在查询时返回内存中的短期指标数据。

写入的指标数据不会立即写入到存储中而是驻留在内存中，并周期性地刷写到存储中（在默认情况下使用chunks存储会驻留12小时，block存储会驻留2小时）。因此，querier在查询时需要同时从Ingester中和长期存储后端中获取短期数据和长期数据。

Ingester中包含了一个生命周期管理器用于管理Ingester的生命周期并且将其状态同步到哈希环中。有以下几种状态：

* PENDING
* JOINING
* ACTIVE
* LEAVING
* UNHEALTHY

ingester是有状态服务，需要使用独立的存储。通过两种方式保证了数据的持久可靠性：

* replication（多副本）。Distributor会写入多个副本（默认为3）的指标数据到多个Ingester上，在个别Ingester出现故障时，其余的Ingester仍然可以继续将其内存中的冗余副本数据写入到长期存储后端。
* WAL（预写日志）。还未刷写到长期存储后端的指标数据会以文件形式记录在本地。当Ingester发生故障后重启时，会从WAL中将数据再次加载回内存中。WAL目前对于chunks存储仍然是实验性功能，默认情况下为关闭状态。而在blocks存储中则默认开启。

### 避免写放大

ingester没有采取实时写入数据到存储后端的方式，目的是减轻频繁写入对长期存储后端产生的压力。并且，ingester还会对驻留在内存中的数据进行分批和压缩，周期性地刷写数据到长期存储后端。

