50 Troubleshooting

In der Praxis werden Sie unweigerlich auf Probleme stoßen, die eine systematische Fehlersuche erfordern. In diesem Kapitel lernen Sie, wie Sie Probleme in OpenSearch effektiv diagnostizieren und beheben können. Wir werden sowohl grundlegende Strategien als auch spezifische Lösungsansätze für häufige Probleme behandeln.

50.1 Systematischer Ansatz zur Problemlösung

Bevor wir uns mit spezifischen Problemen befassen, ist es wichtig, einen strukturierten Ansatz für das Troubleshooting zu entwickeln. Dieser sollte folgende Schritte umfassen:

  1. Problemidentifikation
  2. Datensammlung
  3. Analyse
  4. Lösungsentwicklung
  5. Umsetzung und Verifizierung

50.1.1 Diagnostische Werkzeuge

OpenSearch bietet verschiedene APIs für die Diagnose. Hier sind die wichtigsten:

# Cluster-Gesundheit prüfen
GET _cluster/health

# Node-Statistiken abrufen
GET _nodes/stats

# Aufgabenliste anzeigen
GET _tasks

# Hot Threads analysieren
GET _nodes/hot_threads

50.2 Häufige Problemszenarien

50.2.1 Cluster-Status ist Rot

Ein roter Cluster-Status bedeutet, dass primäre Shards nicht zugewiesen sind. Gehen Sie wie folgt vor:

# Identifizieren Sie die problematischen Indizes
GET _cat/indices?v&health=red

# Prüfen Sie den Shard-Status
GET _cat/shards?v&h=index,shard,prirep,state,unassigned.reason

# Analysieren Sie die nicht zugewiesenen Shards
GET _cluster/allocation/explain

Typische Lösungsansätze:

# Shard-Zuweisung erzwingen, wenn sicher
POST _cluster/reroute
{
  "commands": [
    {
      "allocate_stale_primary": {
        "index": "problematischer_index",
        "shard": 0,
        "node": "ziel_node",
        "accept_data_loss": true
      }
    }
  ]
}

# Oder Index wiederherstellen, falls Backup verfügbar
POST /_snapshot/backup_repository/snapshot_1/_restore
{
  "indices": "problematischer_index",
  "ignore_unavailable": true
}

50.2.2 Performance-Probleme

Bei Performance-Problemen sollten Sie systematisch vorgehen:

# Langsame Queries identifizieren
PUT /mein_index/_settings
{
  "index.search.slowlog.threshold.query.warn": "10s",
  "index.search.slowlog.threshold.fetch.warn": "1s",
  "index.indexing.slowlog.threshold.index.warn": "10s"
}

# Hot Threads analysieren
GET /_nodes/hot_threads

# Thread Pools überwachen
GET /_nodes/stats/thread_pool

Typische Optimierungsmöglichkeiten:

# Cache-Einstellungen optimieren
PUT /mein_index/_settings
{
  "index": {
    "queries": {
      "cache": {
        "enabled": true
      }
    },
    "fielddata": {
      "cache": {
        "size": "20%"
      }
    }
  }
}

# Refresh-Intervall anpassen
PUT /mein_index/_settings
{
  "index": {
    "refresh_interval": "30s"
  }
}

50.2.3 Speicherprobleme

Speicherprobleme gehören zu den häufigsten Herausforderungen:

# JVM-Heap-Nutzung prüfen
GET _nodes/stats/jvm

# Circuit Breaker Status prüfen
GET _nodes/stats/breaker

Lösungsansätze:

# Circuit Breaker Einstellungen anpassen
PUT _cluster/settings
{
  "persistent": {
    "indices.breaker.total.limit": "70%",
    "indices.breaker.fielddata.limit": "40%",
    "indices.breaker.request.limit": "30%"
  }
}

# Fielddata Cache begrenzen
PUT /mein_index/_settings
{
  "index.fielddata.cache.size": "20%"
}

50.2.4 Indexierungs-Probleme

Bei Problemen mit der Indexierung:

# Indexierungs-Statistiken prüfen
GET _stats/indexing

# Mapping-Probleme identifizieren
GET /mein_index/_mapping

Beispiel für die Behebung von Mapping-Konflikten:

# Neuen Index mit korrigiertem Mapping erstellen
PUT /neuer_index
{
  "mappings": {
    "properties": {
      "problematisches_feld": {
        "type": "keyword"
      }
    }
  }
}

# Daten reindexieren
POST /_reindex
{
  "source": {
    "index": "alter_index"
  },
  "dest": {
    "index": "neuer_index"
  }
}

50.3 Monitoring und Prävention

Ein proaktiver Monitoring-Ansatz hilft, Probleme frühzeitig zu erkennen:

PUT _plugins/_alerting/monitors/system_monitor
{
  "type": "monitor",
  "name": "System Health Monitor",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 5,
      "unit": "MINUTES"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": [".monitoring-opensearch-*"],
        "query": {
          "bool": {
            "must": [
              {
                "range": {
                  "@timestamp": {
                    "gte": "now-5m"
                  }
                }
              }
            ]
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "System Alert",
      "severity": "High",
      "condition": {
        "script": {
          "source": """
            def maxHeapUsage = 85.0;
            def maxDiskUsage = 85.0;
            
            return ctx.results[0].hits.hits.any(hit -> {
              def stats = hit._source;
              return stats.jvm.mem.heap_used_percent > maxHeapUsage ||
                     stats.fs.total.used_percent > maxDiskUsage;
            });
          """
        }
      }
    }
  ]
}

50.4 Debug-Logging aktivieren

In manchen Fällen benötigen Sie detailliertere Logging-Informationen:

# config/log4j2.properties
logger.action.name = org.opensearch.action
logger.action.level = debug

logger.transport.name = org.opensearch.transport
logger.transport.level = debug

50.5 Best Practices für Troubleshooting

  1. Dokumentation

  2. Monitoring

  3. Backup und Recovery

Diese Best Practices helfen Ihnen, effektiv mit Problemen umzugehen und sie zukünftig zu vermeiden.