← 返回首页
🗄️

时序数据库架构

📂 architecture ⏱ 1 min 198 words

时序数据库架构

时序数据特点

时序数据按时间顺序产生,具有写多读少、追加写入、时间范围查询等特点。

metric_name,tag1=value1,tag2=value2 field1=value1,field2=value2 timestamp
cpu_usage,host=server1,region=us-east user=85.2,system=14.8 1700000000000

InfluxDB架构

InfluxDB采用TSM引擎,通过时间分区和压缩算法高效存储时序数据。

@Service
public class InfluxMetricsService {

    @Autowired
    private InfluxDB influxDB;

    public void writeMetric(String measurement, Map<String, String> tags,
                            Map<String, Object> fields) {
        Point point = Point.measurement(measurement)
            .tag(tags)
            .fields(fields)
            .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
            .build();
        influxDB.write(Point.measurement("cpu_usage")
            .tag("host", "server1")
            .field("user", 85.2)
            .field("system", 14.8)
            .build());
    }

    public List<Map<String, Object>> query(String flux) {
        QueryApi queryApi = influxDB.getQueryApi();
        return queryApi.query(flux).stream()
            .flatMap(table -> table.getRecords().stream())
            .map(record -> Map.of(
                "time", record.getTime(),
                "value", record.getValue())
            .collect(Collectors.toList());
    }
}
@Configuration
public class InfluxDBConfig {

    @Bean
    public InfluxDB influxDB() {
        InfluxDB influxDB = InfluxDBFactory.connect(
            "http://localhost:8086", "admin", "password");
        influxDB.setDatabase("metrics");
        influxDB.enableGzip();
        return influxDB;
    }
}

Prometheus架构

Pull模式采集指标数据,通过PromQL查询和AlertManager告警。

# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

rule_files:
  - 'alert_rules.yml'
// Spring Boot暴露Prometheus指标
@RestController
public class MetricsController {

    private final Counter requestCounter = Counter.builder("http_requests_total")
        .tag("method", "GET")
        .register(Metrics.globalRegistry);

    private final Timer timer = Timer.builder("http_request_duration")
        .publishPercentiles(0.5, 0.95, 0.99)
        .register(Metrics.globalRegistry);

    @GetMapping("/api/data")
    public ResponseEntity<Data> getData() {
        return timer.record(() -> {
            requestCounter.increment();
            return ResponseEntity.ok(dataService.getData());
        });
    }
}

告警规则

# alert_rules.yml
groups:
  - name: high_cpu
    rules:
      - alert: HighCpuUsage
        expr: cpu_usage_percent > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage is above 80% for 5 minutes"