Die Verarbeitung von Zeitreihendaten wie Logs, Events und Metriken stellt besondere Anforderungen an die Datenhaltung. Die Menge der Daten wächst kontinuierlich, während ältere Daten selten oder nie aktualisiert werden. Data Streams sind ein leistungsfähiges Konzept in OpenSearch, das speziell für diese Art von Daten entwickelt wurde.
Stellen Sie sich einen Data Stream als einen kontinuierlichen Fluss von Daten vor, ähnlich einem Fluss, in den ständig neue Informationen einströmen. Im Hintergrund besteht ein Data Stream aus mehreren Indizes, die automatisch verwaltet werden. Neue Daten werden immer in den aktuellsten Index geschrieben, während Suchanfragen über alle Indizes hinweg ausgeführt werden.
Diese Struktur bietet mehrere Vorteile:
Lassen Sie uns Schritt für Schritt einen Data Stream für Anwendungslogs erstellen. Zunächst benötigen wir ein Index Template, das die grundlegende Struktur definiert:
PUT _index_template/app-logs-template
{
"index_patterns": ["app-logs-*"],
"data_stream": {
"timestamp_field": {
"name": "@timestamp"
}
},
"template": {
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"message": { "type": "text" },
"level": { "type": "keyword" },
"service": { "type": "keyword" }
}
}
},
"priority": 100
}
Dieses Template definiert wichtige Aspekte:
Nach der Erstellung des Templates können wir den Data Stream anlegen:
PUT _data_stream/app-logs-production
Das Schreiben von Daten in einen Data Stream erfolgt wie bei normalen Indizes. Wichtig ist nur, dass jedes Dokument ein Zeitstempelfeld enthält:
POST app-logs-production/_doc
{
"@timestamp": "2024-01-13T10:15:30Z",
"message": "Benutzeranmeldung erfolgreich",
"level": "INFO",
"service": "auth-service"
}
OpenSearch leitet die Daten automatisch an den aktuellen Schreib-Index weiter. Versuchen Sie nicht, Dokumente ohne Zeitstempel zu indexieren - OpenSearch wird diese ablehnen.
Die Suche in einem Data Stream erfolgt transparent über alle zugrundeliegenden Indizes:
GET app-logs-production/_search
{
"query": {
"bool": {
"must": [
{ "match": { "message": "Benutzeranmeldung" }},
{ "range": {
"@timestamp": {
"gte": "now-1d"
}
}
}
]
}
}
}
Diese Suche findet alle Anmeldungsnachrichten des letzten Tages, unabhängig davon, in welchem der Backing-Indizes sie gespeichert sind.
Ein wichtiges Konzept bei Data Streams ist der Rollover - die Erstellung eines neuen Schreib-Index. Dies kann manuell oder automatisch erfolgen:
POST app-logs-production/_rollover
{
"conditions": {
"max_age": "7d",
"max_size": "50gb"
}
}
In der Praxis wird der Rollover meist über eine ISM-Policy (Index State Management) automatisiert:
PUT _plugins/_ism/policies/logs_policy
{
"policy": {
"description": "Management-Policy für Anwendungslogs",
"default_state": "hot",
"states": [
{
"name": "hot",
"actions": [],
"transitions": [
{
"state_name": "warm",
"conditions": {
"min_index_age": "7d"
}
}
]
},
{
"name": "warm",
"actions": [
{
"replica_count": {
"number_of_replicas": 1
}
}
],
"transitions": [
{
"state_name": "cold",
"conditions": {
"min_index_age": "30d"
}
}
]
},
{
"name": "cold",
"actions": [
{
"replica_count": {
"number_of_replicas": 0
}
}
],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "90d"
}
}
]
},
{
"name": "delete",
"actions": [
{
"delete": {}
}
]
}
]
}
}
Diese Policy implementiert einen vollständigen Lebenszyklus für unsere Logdaten:
Die Überwachung eines Data Streams erfolgt über verschiedene Endpunkte:
GET _data_stream/app-logs-production/_stats
Diese Abfrage liefert wichtige Informationen wie:
Data Streams eignen sich besonders gut für:
Kontinuierlich generierte Logs können effizient gespeichert und verwaltet werden. Die automatische Alterung und Löschung alter Daten spart Speicherplatz.
Sensor- oder Systemmetriken werden chronologisch erfasst und müssen nicht aktualisiert werden. Data Streams bieten hier eine optimale Struktur.
Sicherheitsrelevante Ereignisse können chronologisch erfasst und gemäß Aufbewahrungsrichtlinien automatisch archiviert oder gelöscht werden.
Bei der Arbeit mit Data Streams haben sich einige Praktiken bewährt:
Planen Sie Ihre Index-Templates sorgfältig. Einmal festgelegte Mappings können nicht mehr geändert werden - ein neuer Stream wäre erforderlich.
Implementieren Sie von Anfang an eine ISM-Policy. Die automatische Verwaltung des Lebenszyklus spart später viel manuelle Arbeit.
Überwachen Sie die Größe und Performance Ihrer Streams regelmäßig. Die Stats-API liefert wichtige Metriken für die Kapazitätsplanung.
Nutzen Sie die Möglichkeit, mehrere Streams für unterschiedliche Datentypen oder Umgebungen zu erstellen. Dies erleichtert die getrennte Verwaltung von Entwicklungs-, Test- und Produktionsdaten.