{"id":22062,"date":"2026-11-09T11:30:00","date_gmt":"2026-11-09T10:30:00","guid":{"rendered":"https:\/\/webhosting.de\/?p=22062"},"modified":"2026-11-05T08:25:52","modified_gmt":"2026-11-05T07:25:52","slug":"mariadb-maxscale-databas-proxy-sql-routing","status":"publish","type":"post","link":"https:\/\/webhosting.de\/sv\/mariadb-maxscale-datenbank-proxy-sql-routing\/","title":{"rendered":"Anv\u00e4nda MariaDB MaxScale som databasproxy"},"content":{"rendered":"\n<div class=\"wh-article\" data-wh-layout=\"2.1.2\" style=\"width:100%;max-width:820px;margin:0 auto;color:#263b4b;font-family:inherit;font-size:18px;line-height:1.8;text-align:start;overflow-wrap:break-word;box-sizing:border-box\"><p class=\"wh-lead\" style=\"font-size:20px;line-height:1.7;color:#233746;margin:0 0 1.1em\">MariaDB MaxScale lohnt sich als <strong style=\"font-weight:700;color:inherit\">Datenbank-Proxy<\/strong>, wenn Anwendungen von wechselnden Primary-Replica-Rollen entkoppelt, geeignete Leseanfragen verteilt oder Zugriffe zentral kontrolliert werden sollen. F\u00fcr ein einzelnes System ohne solche Anforderungen bleibt die Direktverbindung oft einfacher. Entscheidend sind nicht pauschale Leistungsversprechen, sondern Routermodell, Replikationsverzug, Transaktionsgrenzen und ein belastbarer Betriebsprozess. Dieser Artikel ordnet MaxScale 25.10 ein und zeigt, wie SQL-Routing nachvollziehbar geplant wird.   <\/p>\n<nav class=\"wh-toc\" aria-label=\"Inhalt dieses Artikels\" style=\"display:block;margin:28px 0 38px;padding:22px;border:1px solid #d9e4e8;border-radius:14px;background:#f4f8f8\"><p class=\"wh-toc-title\" style=\"font-size:13px;font-weight:700;letter-spacing:.08em;color:#49656b;margin:0 0 14px\">Direkt zum Abschnitt<\/p><div class=\"wh-toc-grid\" style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:10px\"><div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#maxscale-rolle-und-version\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">MaxScale als Proxy-Schicht einordnen<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#primary-replica-und-monitoring\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">Primary-Replica-Topologie richtig \u00fcberwachen<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#routing-und-konsistenzgrenzen\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">SQL-Routing und Konsistenzgrenzen verstehen<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#readwritesplit-konfiguration\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">Readwritesplit sicher konfigurieren<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#routermodelle-vergleichen\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">Routermodelle nach Anwendung vergleichen<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#sitzungen-lag-und-umstellung\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">Sitzungen, Lag und Umstellung planen<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#tls-rechte-und-filter\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">TLS, Rechte und Filter absichern<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#betrieb-und-fehlersuche\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">Konfiguration und Fehler systematisch pr\u00fcfen<\/a><\/div>\n<div class=\"wh-toc-item\" style=\"display:block;min-width:0;margin:0;padding:0\"><a class=\"wh-toc-link\" href=\"#einsatzentscheidung-und-grenzen\" style=\"display:block;height:100%;padding:12px 15px;border:1px solid #dce6e8;border-radius:9px;background:#fff;color:#18575b;font-size:14px;line-height:1.5;font-weight:600;text-decoration:none;box-sizing:border-box\">MaxScale passend einsetzen oder weglassen<\/a><\/div>\n<\/div><\/nav><section class=\"wh-section\" aria-labelledby=\"maxscale-rolle-und-version\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"maxscale-rolle-und-version\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">MaxScale als Proxy-Schicht einordnen<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><strong style=\"font-weight:700;color:inherit\">MariaDB MaxScale<\/strong> ist eine eigenst\u00e4ndige Proxy-Schicht zwischen Anwendung und MariaDB-Servern. F\u00fcr einen belastbaren Betrieb m\u00fcssen Konfiguration, verf\u00fcgbare Funktionen und bekannte Grenzen stets zur tats\u00e4chlich installierten Version passen. Die Serie MaxScale 25.10 ist in der offiziellen Dokumentation mit eigenen Release Notes gef\u00fchrt.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Die Anwendung verbindet sich mit einem Listener von MaxScale statt unmittelbar mit einem Datenbankserver. Ein Dienst fasst dabei die Zugriffslogik zusammen, ein Router bestimmt das Backend, und Filter k\u00f6nnen Anfragen vor der Weiterleitung zus\u00e4tzlich verarbeiten. Die Daten bleiben auf den MariaDB-Backends; MaxScale wird nicht selbst zur Datenbank.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Diese Trennung ist besonders hilfreich, wenn eine Anwendung nicht selbst wissen soll, welcher Server aktuell welche Rolle besitzt. F\u00fcr Grundlagen zu Datenmodell, SQL und dem Betrieb der Datenbank ist der Beitrag <a href=\"https:\/\/webhosting.de\/mariadb-open-source-datenbank\/\">MariaDB als Open-Source-Datenbank<\/a> eine passende Erg\u00e4nzung. Der Proxy erg\u00e4nzt die Serverarchitektur, ersetzt aber weder Datenbankrechte noch ein Konzept f\u00fcr Replikation und Ausf\u00e4lle.<\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Beim <strong style=\"font-weight:700;color:inherit\">Verbindungs-Routing<\/strong> w\u00e4hlt MaxScale beim Aufbau einer Sitzung ein Ziel; dieses Backend bleibt f\u00fcr die Sitzung zust\u00e4ndig. Beim Statement-Routing kann der Router einzelne SQL-Anweisungen anhand ihres Inhalts unterschiedlich zuordnen. Welche Variante passt, h\u00e4ngt deshalb von Transaktionen, Sitzungszustand und der F\u00e4higkeit der Anwendung ab, Lese- und Schreibpfade selbst sauber zu trennen.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Ein <strong style=\"font-weight:700;color:inherit\">Database Proxy<\/strong> ist keine pauschale Leistungszusage. Er kann Routing zentralisieren, Rollenwechsel von Anwendungen entkoppeln oder geeignete Leseanfragen verteilen. Zus\u00e4tzliche Netzwerkknoten, SQL-Analyse und die konkrete Backend-Topologie beeinflussen jedoch das Verhalten. Belastbarkeit und Kapazit\u00e4t m\u00fcssen daher mit der eigenen Version, Konfiguration und Last gepr\u00fcft werden.<\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"primary-replica-und-monitoring\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"primary-replica-und-monitoring\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">Primary-Replica-Topologie richtig \u00fcberwachen<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Eine typische Zielarchitektur besteht aus einem schreibenden Primary und einer oder mehreren lesenden Replicas. MaxScale ist der einzige Datenbank-Endpunkt der Anwendung, etwa hinter einem festen DNS-Namen. Die Anwendung verbindet sich folglich nicht direkt mit einzelnen Hosts; die Auswahl eines erreichbaren und passenden Backends findet innerhalb der Proxy-Schicht statt.<\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">F\u00fcr eine Primary-Replica-Topologie ermittelt der Monitor <strong style=\"font-weight:700;color:inherit\">mariadbmon<\/strong> den Zustand der Backends und erkennt ihre Rollen als Primary oder Replica. Router k\u00f6nnen diese Informationen f\u00fcr ihre Zielauswahl verwenden. Der Monitor muss daher die reale Replikationstopologie sehen k\u00f6nnen; falsche Zuordnungen, nicht replizierte Daten oder unklare Rollen sind keine Routingprobleme, sondern Betriebsrisiken.  <\/p>\n<figure class=\"wp-block-image size-large wh-figure\" aria-describedby=\"wh-caption-detail1\" style=\"display:block;float:none;clear:both;width:100%;max-width:760px;margin:34px auto 40px;border:1px solid #dae5e9;border-radius:14px;overflow:hidden;background:#f5f8fa;box-shadow:0 10px 28px -17px rgba(24,47,60,.28);box-sizing:border-box\"><div class=\"wh-figure-media\" style=\"display:block;background:#eef3f5;line-height:0\"><img loading=\"lazy\" width=\"800\" height=\"534\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-primary-replica-verbindungen-5db7a258-detail1-9c30a4fdd0-1024x683.webp\" class=\"wp-image-22068\" alt=\"Draufsicht auf mehrere getrennte Ethernet-Kabel an einem kleinen neutralen aktiven Vermittlungsknoten.\" loading=\"lazy\" decoding=\"async\" srcset=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-primary-replica-verbindungen-5db7a258-detail1-9c30a4fdd0-1024x683.webp 1024w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-primary-replica-verbindungen-5db7a258-detail1-9c30a4fdd0-300x200.webp 300w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-primary-replica-verbindungen-5db7a258-detail1-9c30a4fdd0-768x512.webp 768w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-primary-replica-verbindungen-5db7a258-detail1-9c30a4fdd0-18x12.webp 18w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-primary-replica-verbindungen-5db7a258-detail1-9c30a4fdd0.webp 1536w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/ style=\"display:block;width:100%;max-width:100%;height:auto;margin:0;float:none\"><\/div><figcaption class=\"wh-caption\" id=\"wh-caption-detail1\" style=\"display:block;margin:0;padding:12px 18px 15px;border-top:1px solid #dce5e9;color:#506575;background:#f5f8fa;font-size:14px;line-height:1.55;text-align:start\">KI-generiertes Symbolbild verdeutlicht MaxScale als aktiven Vermittlungspunkt zwischen Anwendung und getrennten MariaDB-Backends.<\/figcaption><\/figure><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Das Erkennen einer Rolle ist von ihrer Ver\u00e4nderung zu trennen. Mit passender Konfiguration und Berechtigung kann mariadbmon Failover, geplante Switchover und Rejoin verwalten. Ein Switchover ist ein bewusst vorbereiteter Rollenwechsel f\u00fcr Wartung oder Betrieb; ein Failover reagiert auf einen Fehler. Beide Vorg\u00e4nge verlangen eindeutige Topologie, \u00dcberwachung, Alarmierung und einen dokumentierten Incident- oder R\u00fcckkehrprozess.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">F\u00fcr reine \u00dcberwachungsaufgaben sollte das Monitor-Konto nach dem Prinzip <strong style=\"font-weight:700;color:inherit\">Least Privilege<\/strong> nur die ben\u00f6tigten Rechte erhalten. Die aktuelle Dokumentation nennt daf\u00fcr REPLICA MONITOR. Zus\u00e4tzliche Rechte sind abh\u00e4ngig von aktivierten Funktionen erforderlich, etwa FILE bei einer Pr\u00fcfung des Speicherplatzes oder weitere gezielt gepr\u00fcfte Rechte f\u00fcr Topologiescans und Cluster-Manipulationen. Pauschale Vollrechte sind daf\u00fcr kein Ersatz.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Vor einer Automatisierung sollte das Team festlegen, wer einen Rollenwechsel freigibt, wie der Zustand der Replicas gepr\u00fcft wird und wie Anwendungen \u00fcber St\u00f6rungen informiert werden. MaxScale kann Routingziele anhand erkannter Rollen anpassen. Ob eine Umschaltung fachlich zul\u00e4ssig ist, entscheidet aber das Hochverf\u00fcgbarkeitskonzept mit seinen Daten-, Zeit- und Verantwortungsgrenzen.<\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"routing-und-konsistenzgrenzen\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"routing-und-konsistenzgrenzen\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">SQL-Routing und Konsistenzgrenzen verstehen<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Der Router <strong style=\"font-weight:700;color:inherit\">readwritesplit<\/strong> leitet schreibende SQL-Anweisungen zum Primary und verteilt geeignete Leseanfragen auf Replicas. Damit kann ein Primary-Replica-Verbund seine Lesekapazit\u00e4t gezielter nutzen, ohne dass die Anwendung jede Abfrage selbst einem Server zuordnen muss. Die Rolleninformation des Monitors bildet dabei die Grundlage f\u00fcr die Auswahl.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Diese Aufteilung garantiert im Standard nicht, dass ein Read direkt nach jedem Write den neuen Stand sieht. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">causal_reads<\/code> steht standardm\u00e4\u00dfig auf <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">none<\/code>. Schreibt eine Anwendung beispielsweise einen Bestellstatus und liest ihn anschlie\u00dfend \u00fcber eine unabh\u00e4ngige Abfrage, kann eine Replica daher noch den vorherigen Stand liefern. Ein bewusst gew\u00e4hlter Primary-Lesepfad oder ein gemeinsamer Transaktionskontext sind m\u00f6gliche Strategien, aber nicht die einzigen.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">F\u00fcr <strong style=\"font-weight:700;color:inherit\">Read-your-writes<\/strong> kann readwritesplit mit aktivierten Causal Reads vorausgehende Writes trotz Replica-Lag ber\u00fccksichtigen. Der Modus <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">local<\/code> sichert die Sichtbarkeit f\u00fcr dieselbe Verbindung. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">global<\/code> f\u00fchrt den vom Service gespeicherten GTID-Stand \u00fcber seine Verbindungen hinweg; eine globale Happens-before-Ordnung der Reads ist dabei nur garantiert, wenn alle Transaktionen innerhalb einer einzigen GTID-Dom\u00e4ne liegen. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">universal<\/code> bezieht den am Primary beobachtbaren Transaktionsstand des Clusters ein. Die st\u00e4rkeren Geltungsbereiche erh\u00f6hen jedoch den Synchronisations- und damit potenziell den Latenzaufwand.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Causal Reads arbeiten mit GTID-Informationen und warten bei den nicht schnellen Modi auf die Replikation. L\u00e4uft die Synchronisation l\u00e4nger als <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">causal_reads_timeout<\/code> \u2013 standardm\u00e4\u00dfig 10 Sekunden \u2013, versucht readwritesplit die Abfrage auf dem Primary auszuf\u00fchren. In einer schreibgesch\u00fctzten Transaktion kann ein Timeout stattdessen als Fehler zur\u00fcckkehren, weil die Abfrage nicht auf den Primary verschoben werden darf.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Die schnellen Modi <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">fast<\/code>, <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">fast_global<\/code> und <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">fast_universal<\/code> warten nicht auf eine Replica und verwenden bei Bedarf den Primary; der Timeout gilt dort nicht. Sie passen deshalb vor allem zu \u00fcberwiegend lesenden Workloads mit wenigen Writes. Ab MaxScale 24.02 richtet MaxScale das erforderliche Tracking f\u00fcr neue Backend-Verbindungen selbst ein; \u00e4ltere Versionen ben\u00f6tigen daf\u00fcr <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">last_gtid<\/code> in <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">session_track_system_variables<\/code> auf allen Backends. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Innerhalb einer offenen Read-Write-Transaktion leitet readwritesplit Lesezugriffe an den Primary. Das vermeidet, dass Anweisungen derselben Transaktion auf Backends mit unterschiedlichem Replikationsstand ausgef\u00fchrt werden. Diese konservative Regel entbindet nicht davon, Transaktionsgrenzen fachlich korrekt zu setzen und Replikationsverzug als eigene Architekturgrenze zu behandeln.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Auch bei Stored Procedures, UDF-Aufrufen und Multi-Statements f\u00e4llt die Entscheidung bewusst vorsichtiger aus: In dokumentierten F\u00e4llen werden solche Anfragen zum Primary geleitet. Der Grund ist, dass ihre Wirkung oder ihr Kontext nicht wie eine einfache Leseabfrage behandelt werden sollte. SQL-Routing ist damit keine blo\u00dfe Suche nach dem Wort SELECT, sondern folgt Regeln zur sicheren Sitzungs- und Semantikbehandlung.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Ein fachlich gew\u00e4hlter Grenzwert f\u00fcr <strong style=\"font-weight:700;color:inherit\">Replica-Lag<\/strong> kann Replicas von bestimmten Leseentscheidungen ausschlie\u00dfen, ersetzt aber keine Konsistenzanforderung. Der akzeptable R\u00fcckstand h\u00e4ngt etwa davon ab, ob ein veralteter Katalogeintrag tolerierbar ist oder ob ein gerade best\u00e4tigter Zahlungsstatus zwingend sichtbar sein muss. Diese Entscheidung geh\u00f6rt in die Anwendungslogik und den Betriebsvertrag, nicht in eine allgemeine Proxy-Voreinstellung.  <\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"readwritesplit-konfiguration\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"readwritesplit-konfiguration\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">Readwritesplit sicher konfigurieren<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Eine Read\/Write-Split-Konfiguration besteht aus getrennten Objektdefinitionen f\u00fcr Backends, Monitor, Service und Listener. Der folgende Ausschnitt zeigt die Struktur einer Datei, nicht eine unmittelbar produktionsf\u00e4hige Vorlage. Die Werte in spitzen Klammern sind ausdr\u00fccklich keine Kennw\u00f6rter, sondern Verweise auf Konten und Geheimnisse, die \u00fcber die Secret-Verwaltung des Betriebsumfelds bereitzustellen sind. Monitor und Service ben\u00f6tigen dabei jeweils eigene Zugangsdaten f\u00fcr ihre unterschiedlichen Aufgaben.   <\/p>\n<div class=\"wh-code-window\" data-wh-code style=\"margin:28px 0 34px;border:1px solid #2c4656;border-radius:12px;overflow:hidden;background:#132a3b;box-shadow:0 9px 25px -13px rgba(15,35,55,.2)\"><div class=\"wh-code-toolbar\" style=\"display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;padding:11px 16px;background:#223e50;color:#edf5fa;font-size:13px;line-height:1.5;font-weight:600\"><span>Code<\/span><button type=\"button\" class=\"wh-code-copy\" data-wh-copy hidden style=\"padding:6px 11px;border:1px solid #7893a1;border-radius:6px;background:transparent;color:#fff;font-size:12px;line-height:1.5;font-weight:600;cursor:pointer\">Code kopieren<\/button><span class=\"wh-copy-status\" aria-live=\"polite\"><\/span><span data-wh-copy-success hidden>Kopiert<\/span><span data-wh-copy-fallback hidden>Code markiert \u2013 bitte kopieren<\/span><\/div><pre class=\"wh-code\" data-no-translation translate=\"no\" style=\"display:block;margin:0;padding:20px;max-width:100%;overflow-x:auto;color:#edf5fa;background:#132a3b;font:14px\/1.75 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre;direction:ltr;text-align:left\"><code class=\"language-ini\" style=\"font:inherit;color:inherit;background:transparent;padding:0;border:0;white-space:inherit\">[db-primary]\ntype=server\naddress=db-primary.example.invalid\nport=3306\n\n[db-replica-1]\ntype=server\naddress=db-replica-1.example.invalid\nport=3306\n\n[db-replica-2]\ntype=server\naddress=db-replica-2.example.invalid\nport=3306\n\n[cluster-monitor]\ntype=monitor\nmodule=mariadbmon\nservers=db-primary,db-replica-1,db-replica-2\nuser=&lt;monitor-account-from-secret-management&gt;\npassword=&lt;monitor-secret-reference&gt;\n\n[RW-Service]\ntype=service\nrouter=readwritesplit\nservers=db-primary,db-replica-1,db-replica-2\nuser=&lt;service-account-from-secret-management&gt;\npassword=&lt;service-secret-reference&gt;\n\n[RW-Listener]\ntype=listener\nservice=RW-Service\nprotocol=MariaDBClient\nport=3306<\/code><\/pre><\/div><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Die Serverobjekte bezeichnen lediglich erreichbare MariaDB-Backends; welche Instanz Primary oder Replica ist, ermittelt der Monitor anhand der Topologie. Das Monitor-Konto wird f\u00fcr die Status- und Rollenabfragen verwendet. Das getrennte Servicekonto dient dazu, die f\u00fcr Client-Authentifizierung und Autorisierung ben\u00f6tigten Benutzer- und Rechteinformationen von den Backends abzurufen. Beide Konten ben\u00f6tigen nur die f\u00fcr ihre jeweilige Aufgabe dokumentierten Rechte. <strong style=\"font-weight:700;color:inherit\">Rollen erkennen<\/strong> und Benutzerinformationen laden sind getrennte Aufgaben.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Die Platzhalter im Beispiel m\u00fcssen beim Deployment durch einen gesch\u00fctzten Bereitstellungsweg aufgel\u00f6st werden; sie sind nicht als w\u00f6rtliche Konfigurationswerte gedacht. Nicht in frei lesbare Dateien oder Repositorys geh\u00f6ren Klartextpassw\u00f6rter, reale Zertifikatspfade oder ungepr\u00fcfte Rechtepakete. MaxScale verwaltet f\u00fcr MariaDB-Protokollverbindungen intern relevante Benutzerkonten und Berechtigungen aus den Systemtabellen. Werden Konten oder Rechte ge\u00e4ndert, k\u00f6nnen veraltete Informationen die Anmeldung oder Autorisierung beeintr\u00e4chtigen. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Vor der Freigabe sind deshalb Listener-Port, Netzwerkpfade, Benutzerabgleich und die tats\u00e4chliche Routerzuordnung getrennt zu pr\u00fcfen. Auch automatische Eingriffe des Monitors geh\u00f6ren nicht implizit in diesen Minimalaufbau: Failover-, Switchover- oder Rejoin-Funktionen verlangen zus\u00e4tzliche Konfiguration und ein getestetes Betriebskonzept. Eine scheinbar kurze Konfiguration ersetzt weder Secret-Management noch die Pr\u00fcfung der Backend-Topologie.  <\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"routermodelle-vergleichen\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"routermodelle-vergleichen\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">Routermodelle nach Anwendung vergleichen<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Die Routerwahl folgt dem Verhalten der Anwendung, nicht allein der Zahl vorhandener Replicas. Direkte Verbindungen halten den Aufbau einfach, \u00fcberlassen aber Zielwechsel und Rollenkenntnis der Anwendung. Zwei getrennte Endpunkte mit <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">readconnroute<\/code> passen, wenn die Anwendung Lese- und Schreibverbindungen bewusst selbst f\u00fchrt. <strong style=\"font-weight:700;color:inherit\">Statement-Routing<\/strong> mit readwritesplit ist sinnvoll, wenn eine Sitzung SQL-abh\u00e4ngig zum Primary oder zu Replicas geleitet werden soll.  <\/p>\n<div class=\"wh-table-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Entscheidungskriterien f\u00fcr direkte Verbindungen und MaxScale-Router\" style=\"width:100%;max-width:100%;overflow-x:auto;margin:28px 0;border:1px solid #dce5e9;border-radius:14px;background:#fff;box-shadow:0 10px 28px -16px rgba(24,47,60,.32);box-sizing:border-box\"><table style=\"width:100%;min-width:580px;border-collapse:separate;border-spacing:0;border:0;margin:0;font-size:15px;line-height:1.6;background:#fff\"><caption style=\"padding:20px;text-align:start;font-size:17px;line-height:1.5;font-weight:700;color:#173246;background:#fff\">Entscheidungskriterien f\u00fcr direkte Verbindungen und MaxScale-Router<\/caption><thead><tr><th scope=\"col\" style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#19394d;color:#fff\">Modell<\/th><th scope=\"col\" style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#19394d;color:#fff\">Routingebene<\/th><th scope=\"col\" style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#19394d;color:#fff\">Passende Topologie<\/th><th scope=\"col\" style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#19394d;color:#fff\">Konsistenzrisiko<\/th><th scope=\"col\" style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#19394d;color:#fff\">Backend-Ausfall und Schutz<\/th><\/tr><\/thead><tbody><tr><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Direkte Verbindung<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Anwendung w\u00e4hlt Ziel und Verbindung<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Einzelserver oder Anwendung mit eigener Rollenlogik<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Anwendung muss Lesezeitpunkt und Replikationsstand selbst ber\u00fccksichtigen<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Verbindung und Zielwechsel behandelt die Anwendung; minimale Rechte und TLS bleiben erforderlich<\/td><\/tr><tr><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#f4f7f9;color:#294252\">Getrennte readconnroute-Endpunkte<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#f4f7f9;color:#294252\">Pro Verbindung; SQL wird nicht je Statement bewertet<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#f4f7f9;color:#294252\">Primary-Replica, Anwendung trennt Reads und Writes<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#f4f7f9;color:#294252\">Ein Read-Endpunkt kann veraltete Replica-Daten liefern<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#f4f7f9;color:#294252\">Eine unterbrochene Backend-Sitzung wird nicht umgezogen; bei router_options=slave ist ein Primary-Fallback m\u00f6glich, wenn alle Replicas ausgefallen sind; Writes zus\u00e4tzlich blockieren oder zuverl\u00e4ssig vermeiden<\/td><\/tr><tr><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">readwritesplit<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Pro SQL-Statement unter Ber\u00fccksichtigung des Sitzungszustands<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Primary-Replica mit geeigneter SQL- und Transaktionsnutzung<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Replica-Lag bleibt relevant; kritische Reads bewusst am Primary ausf\u00fchren<\/td><td style=\"padding:15px 18px;border:0;border-bottom:1px solid #e2e9ed;text-align:start;vertical-align:top;white-space:normal;font-size:15px;line-height:1.6;background:#fff;color:#294252\">Routing ber\u00fccksichtigt Rollen; Transaktionen, tempor\u00e4re Tabellen und Replay-Grenzen pr\u00fcfen<\/td><\/tr><\/tbody><\/table><\/div><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">readconnroute bewertet beim Verbindungsaufbau einen Zielserver und analysiert nicht jedes folgende SQL-Statement. F\u00e4llt das gew\u00e4hlte Backend aus, endet die Sitzung; der Router verbindet sie nicht automatisch mit einem anderen Server. Das ist f\u00fcr klar getrennte, kurzlebige Leseverbindungen oft nachvollziehbar, kann aber f\u00fcr zustandsreiche Anwendungsabl\u00e4ufe ungeeignet sein. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Besondere Vorsicht gilt einem als Read-Endpunkt gedachten Service mit <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">router_options=slave<\/code>. Die Option bevorzugt Server mit Replica-Rolle; sind alle Replicas ausgefallen und ist der Primary verf\u00fcgbar, kann readconnroute jedoch auf den Primary zur\u00fcckfallen. Zudem erzeugt die Option keinen Schreibschutz. Die Anwendung muss ausschlie\u00dflich lesendes SQL senden, oder ein zus\u00e4tzlicher ReadOnly-Filter muss Schreibzugriffe unterbinden. Routingziel und Rollenpr\u00e4ferenz sind damit weder eine Berechtigungsgrenze noch ein Ersatz f\u00fcr restriktive Datenbankrechte. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">readwritesplit reduziert dagegen die Zielentscheidungen im Anwendungscode, verlangt aber eine pr\u00e4zise Pr\u00fcfung der Semantik. Geeignete Reads k\u00f6nnen auf Replicas verteilt werden, w\u00e4hrend Schreiboperationen zum Primary gehen. F\u00fcr Abl\u00e4ufe mit strengen Aktualit\u00e4tsanforderungen bleibt entscheidend, ob eine Abfrage nach einem Write auf replizierte Daten warten darf oder bewusst den Primary verwenden muss. <\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"sitzungen-lag-und-umstellung\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"sitzungen-lag-und-umstellung\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">Sitzungen, Lag und Umstellung planen<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Eine Datenbanksitzung enth\u00e4lt mehr als die einzelne Abfrage. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">SET<\/code>, <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">USE<\/code>, <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">CHANGE USER<\/code> und Prepared-Statement-Operationen ver\u00e4ndern ihren Kontext. readwritesplit repliziert relevante Sitzungsbefehle auf m\u00f6gliche Zielserver, damit sp\u00e4ter geroutete Statements mit passendem Sitzungszustand ausgef\u00fchrt werden k\u00f6nnen. Das unterscheidet den Router von einfachem TCP-Load-Balancing, beseitigt jedoch nicht jede Spezialfallgrenze. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Bei Prepared Statements f\u00fcr tempor\u00e4re Tabellen ist diese Grenze besonders wichtig. Wird ein solches Statement auf dem Primary vorbereitet, k\u00f6nnen Replicas es nicht zwangsl\u00e4ufig ausf\u00fchren. Die Anwendung sollte tempor\u00e4re Objekte, Prepared Statements und Transaktionsabl\u00e4ufe deshalb mit dem vorgesehenen Routingmodell erproben. <strong style=\"font-weight:700;color:inherit\">Session-Zustand<\/strong> ist keine Nebenbedingung, sondern bestimmt, ob eine SQL-Verteilung fachlich und technisch passt. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">F\u00fcr eine leselastige Anwendung kann das Team einen fachlich festgelegten Lag-Grenzwert als Ausschlusskriterium f\u00fcr Replicas definieren. Allein <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">max_replication_lag<\/code> stellt jedoch nicht sicher, dass ein vorheriger Write auf einer Replica bereits sichtbar ist. F\u00fcr kritische Folge-Reads kommen je nach Ablauf ein bewusster Primary-Pfad, ein gemeinsamer Schreibkontext oder aktivierte Causal Reads in Betracht.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Bei Causal Reads ist der Geltungsbereich bewusst zu w\u00e4hlen. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">local<\/code> wahrt die Kausalit\u00e4t innerhalb einer Verbindung. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">global<\/code> verwendet einen serviceweit gespeicherten GTID-Stand, garantiert die globale Happens-before-Ordnung der Reads aber nur, wenn s\u00e4mtliche Transaktionen in einer einzigen GTID-Dom\u00e4ne liegen. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">universal<\/code> ber\u00fccksichtigt den am Primary beobachtbaren Transaktionsstand des Clusters. Nicht schnelle Modi synchronisieren mit GTIDs; holt eine Replica nicht innerhalb des konfigurierten Timeouts auf, wird die Abfrage grunds\u00e4tzlich auf dem Primary wiederholt, soweit der Transaktionsmodus dies zul\u00e4sst.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Die Funktion ist versionsabh\u00e4ngig einzuordnen. Ab MaxScale 24.02 erg\u00e4nzt MaxScale <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">last_gtid<\/code> f\u00fcr neue Backend-Verbindungen selbst; in \u00e4lteren Versionen musste <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">session_track_system_variables<\/code> auf den MariaDB-Backends entsprechend gesetzt sein. Die schnellen Modi vermeiden das Warten, k\u00f6nnen bei noch nicht aufgeholten Replicas aber Reads zum Primary lenken und eignen sich daher nicht pauschal f\u00fcr schreibintensive Lasten. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Ein geplanter Switchover und ein automatisches Failover sind ebenfalls getrennt zu behandeln. Beim Switchover wird ein Rollenwechsel kontrolliert vorbereitet, bei einem Failover reagiert der Betrieb auf einen Fehlerzustand. mariadbmon kann Rollen und Backend-Zust\u00e4nde \u00fcberwachen und kann, sofern bewusst eingerichtet, diese Abl\u00e4ufe unterst\u00fctzen. Replizierter Datenstand, eindeutige Topologie, Alarmierung und ein Incident-Prozess bleiben dabei Voraussetzungen. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">In MaxScale 25.10 kann <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">discover-replicas<\/code> Server erkennen, die direkt am aktuellen Primary replizieren, und sie zu Monitor und MaxScale hinzuf\u00fcgen. Diese Funktion ist nicht mit Konfigurationssynchronisierung kompatibel. Vor ihrem Einsatz muss das Team daher festlegen, ob Topologie\u00e4nderungen automatisch entdeckt oder \u00fcber eine synchronisierte Konfiguration gesteuert werden; beides zugleich ist in diesem Rahmen keine zul\u00e4ssige Annahme. <\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"tls-rechte-und-filter\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"tls-rechte-und-filter\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">TLS, Rechte und Filter absichern<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">TLS ist bei MaxScale auf zwei getrennten Strecken zu planen: von der Anwendung zum Listener und vom Proxy zu den MariaDB-Backends. Beide Verbindungen brauchen eigene Vorgaben f\u00fcr Verschl\u00fcsselung und Zertifikatspr\u00fcfung; eine abgesicherte Client-Strecke verschl\u00fcsselt nicht automatisch den nachgelagerten Verkehr. Die Konfiguration muss deshalb den Schutzbedarf und die Vertrauenskette f\u00fcr beide Abschnitte abbilden. <\/p>\n<figure class=\"wp-block-image size-large wh-figure\" aria-describedby=\"wh-caption-detail2\" style=\"display:block;float:none;clear:both;width:100%;max-width:760px;margin:34px auto 40px;border:1px solid #dae5e9;border-radius:14px;overflow:hidden;background:#f5f8fa;box-shadow:0 10px 28px -17px rgba(24,47,60,.28);box-sizing:border-box\"><div class=\"wh-figure-media\" style=\"display:block;background:#eef3f5;line-height:0\"><img loading=\"lazy\" width=\"800\" height=\"534\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-tls-verbindungsstrecken-5db7a258-detail2-0dc4f552bc-1024x683.webp\" class=\"wp-image-22069\" alt=\"Illustration zweier getrennt gesch\u00fctzter Verbindungsstrecken \u00fcber einen zentralen Proxy.\" loading=\"lazy\" decoding=\"async\" srcset=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-tls-verbindungsstrecken-5db7a258-detail2-0dc4f552bc-1024x683.webp 1024w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-tls-verbindungsstrecken-5db7a258-detail2-0dc4f552bc-300x200.webp 300w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-tls-verbindungsstrecken-5db7a258-detail2-0dc4f552bc-768x512.webp 768w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-tls-verbindungsstrecken-5db7a258-detail2-0dc4f552bc-18x12.webp 18w, https:\/\/webhosting.de\/wp-content\/uploads\/2026\/11\/maxscale-tls-verbindungsstrecken-5db7a258-detail2-0dc4f552bc.webp 1536w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/ style=\"display:block;width:100%;max-width:100%;height:auto;margin:0;float:none\"><\/div><figcaption class=\"wh-caption\" id=\"wh-caption-detail2\" style=\"display:block;margin:0;padding:12px 18px 15px;border-top:1px solid #dce5e9;color:#506575;background:#f5f8fa;font-size:14px;line-height:1.55;text-align:start\">KI-generierte Illustration zeigt, dass Client- und Backend-Strecke jeweils eigene TLS-Vorgaben ben\u00f6tigen.<\/figcaption><\/figure><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">F\u00fcr TLS aktiviert <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">ssl=true<\/code> die Verschl\u00fcsselung in der jeweiligen Listener- oder Server-Konfiguration. Erwartet ein Client ein Serverzertifikat, ben\u00f6tigt der Listener Zertifikat und privaten Schl\u00fcssel. Ein Konto mit <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">REQUIRE SSL<\/code> kann sich nicht \u00fcber einen Listener ohne TLS anmelden. Zertifikatsdateien und Schl\u00fcssel geh\u00f6ren in eine gesch\u00fctzte Betriebsumgebung, nicht in frei lesbare Beispiel- oder Repository-Konfigurationen. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Auch das <strong style=\"font-weight:700;color:inherit\">Rechtekonzept<\/strong> bleibt auf den Backends ma\u00dfgeblich: MaxScale vermittelt Verbindungen, ersetzt aber keine pr\u00e4zisen Datenbankkonten. Servicekonten erhalten nur die Berechtigungen, die ihre Aufgabe erfordert. F\u00fcr die Anmeldung und Autorisierung st\u00fctzt sich MaxScale auf Benutzerkonten und Rechte aus den MariaDB-Systemtabellen; \u00c4nderungen an diesen Konten m\u00fcssen daher in der internen Benutzerverwaltung zeitnah verf\u00fcgbar sein. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Der Firewall-Filter kann SQL vor dem Weiterleiten anhand gelernter oder definierter Regeln pr\u00fcfen. Er kennt Leerlauf-, Lern-, \u00dcberwachungs- und Erzwingungsmodi; im Erzwingungsmodus werden nicht erlaubte Statement-Muster je nach Einstellung mit einem Fehler beantwortet oder die Verbindung wird getrennt. Die Lernphase muss repr\u00e4sentative, erlaubte Anwendungsabl\u00e4ufe abdecken, damit der Filter nicht regul\u00e4re Queries blockiert.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Der Filter ist eine zus\u00e4tzliche Kontrollschicht f\u00fcr erwartete SQL-Muster, keine Ersatzberechtigung. Restriktive Datenbankrechte, gesch\u00fctzte Zugangsdaten und gepr\u00fcfter Anwendungscode bleiben erforderlich, weil der Filter nur die vor ihm eingehenden Anfragen anhand seiner Regeln bewertet. Aussagen \u00fcber andere Filter sollten getrennt anhand ihrer jeweiligen Dokumentation gepr\u00fcft werden. <\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"betrieb-und-fehlersuche\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"betrieb-und-fehlersuche\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">Konfiguration und Fehler systematisch pr\u00fcfen<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Bei Verbindungs- oder Routingfehlern hilft eine feste Pr\u00fcfreihenfolge statt \u00c4nderungen auf Verdacht. Pr\u00fcfe zuerst den Monitorstatus: Sind alle Backends erreichbar, und sind Primary- und Replica-Rollen erwartungsgem\u00e4\u00df erkannt? Erst dann lassen sich Routerentscheidungen sinnvoll beurteilen. Ein falsch erkannter oder nicht erreichbarer Knoten ist kein reines Listener-Problem. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Danach folgen Listener und TLS: Port, Protokoll, Zertifikat, Schl\u00fcssel und die Anforderungen der verwendeten Konten m\u00fcssen zusammenpassen. Pr\u00fcfe anschlie\u00dfend, ob die Benutzerkontenverwaltung aktuelle Backend-Konten und Rechte kennt. Besonders nach \u00c4nderungen an Nutzern oder Berechtigungen k\u00f6nnen veraltete Kontendaten Anmeldungen verhindern, obwohl das Konto auf MariaDB selbst korrekt eingerichtet ist.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Als N\u00e4chstes ordnest du Service, Router und die vorgesehenen Server zu. Bei Read\/Write Splitting geh\u00f6ren au\u00dferdem Replica-Lag, <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">causal_reads<\/code> und die Transaktionsgrenzen der Anwendung auf die Pr\u00fcfliste. Ohne aktivierte Causal Reads kann ein Read au\u00dferhalb des erforderlichen Schreibkontexts auf einer Replica einen \u00e4lteren Stand liefern; ein Lag-Grenzwert allein garantiert die Sichtbarkeit eines vorherigen Writes nicht.  <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Lege au\u00dferdem eine einzige <strong style=\"font-weight:700;color:inherit\">Konfigurationsquelle<\/strong> fest. MaxScale kann \u00c4nderungen zur Laufzeit persistieren; beim Neustart kann die persistierte Konfiguration statische Dateien \u00fcberlagern. Wenn ein Team teils Dateien bearbeitet und teils <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">maxctrl<\/code> verwendet, m\u00fcssen \u00c4nderungsweg, Review und Sicherung dieser Laufzeitkonfiguration verbindlich dokumentiert sein. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Wartungsfenster f\u00fcr Schema\u00e4nderungen behandelst du als eigenes Betriebsfeld: Abh\u00e4ngigkeiten, Sperrverhalten und Replikation sind vorab zu pr\u00fcfen, nicht dem Proxy zuzuschreiben. F\u00fcr die Planung kontrollierter \u00c4nderungen an gro\u00dfen MariaDB-Tabellen bietet der Beitrag zu <a href=\"https:\/\/webhosting.de\/mariadb-instant-add-column-ohne-downtime-schemaupdate-datenbank\/\">Schema\u00e4nderungen ohne Downtime<\/a> erg\u00e4nzenden Kontext. MaxScale kann danach Verbindungen und Routing wieder anhand der Backend-Rollen steuern, f\u00fchrt aber keine Datenbank-DDL-Strategie aus.<\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Warnung: \u00c4nderungen an Rollen, Zertifikaten, Benutzerrechten und Routing solltest du zuerst in einer vergleichbaren Umgebung nachvollziehen. F\u00fcr den produktiven Eingriff geh\u00f6ren R\u00fccksetzweg, Beobachtung der Anwendungsfehler und klare Zust\u00e4ndigkeiten dazu. So bleibt unterscheidbar, ob eine St\u00f6rung aus der Proxy-Konfiguration, dem Backend oder dem Client-Verhalten stammt.<\/p>\n<\/section><section class=\"wh-section\" aria-labelledby=\"einsatzentscheidung-und-grenzen\" style=\"display:block;margin:0 0 36px;min-width:0\"><h2 id=\"einsatzentscheidung-und-grenzen\" style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">MaxScale passend einsetzen oder weglassen<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Bei einem einzelnen MariaDB-Server ohne Anforderungen an Routing, Umschaltung oder SQL-Filter sind direkte Verbindungen meist die einfachere Betriebsform. Die Anwendung muss dann allerdings einen sp\u00e4teren Zielwechsel selbst handhaben. MaxScale lohnt sich, wenn der zus\u00e4tzliche Endpunkt eine konkrete Aufgabe erf\u00fcllt, etwa Rollenwechsel abzufangen, Zugriffe zu filtern oder Reads kontrolliert auf Replicas zu verteilen. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Kann die Anwendung Lese- und Schreibpfade bewusst selbst w\u00e4hlen, sind getrennte Endpunkte mit <strong style=\"font-weight:700;color:inherit\">readconnroute<\/strong> oft nachvollziehbar. Dieser Router w\u00e4hlt beim Verbindungsaufbau ein Backend, analysiert jedoch nicht jedes SQL-Statement und zieht eine unterbrochene Sitzung nicht auf einen anderen Server um. Bei <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">router_options=slave<\/code> werden Replicas bevorzugt; sind alle Replicas ausgefallen und ist der Primary noch verf\u00fcgbar, kann der Router den Primary verwenden. Die Option macht den Endpunkt au\u00dferdem nicht schreibgesch\u00fctzt. Daf\u00fcr sind ein geeigneter ReadOnly-Filter, restriktive Backend-Rechte oder strikt kontrolliertes Anwendungs-SQL n\u00f6tig. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">F\u00fcr Primary-Replica-Workloads, deren ORM und Transaktionsmodell dazu passen, nimmt <strong style=\"font-weight:700;color:inherit\">readwritesplit<\/strong> der Anwendung die SQL-Zielwahl pro Statement ab. Bei der Standardvorgabe <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">causal_reads=none<\/code> bleibt Replikationsverzug jedoch sichtbar. Nach kritischen Writes kann die Anwendung einen Primary-Lesepfad oder einen passenden gemeinsamen Transaktionskontext verwenden; alternativ lassen sich Causal Reads gezielt f\u00fcr den ben\u00f6tigten Sichtbarkeitsbereich konfigurieren. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Causal Reads unterscheiden zwischen Sichtbarkeit innerhalb derselben Sitzung, einem vom Service gef\u00fchrten globalen GTID-Stand und dem am Primary beobachtbaren Zustand des Clusters. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">local<\/code> gilt f\u00fcr dieselbe Verbindung. Bei <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">global<\/code> ist die globale Happens-before-Ordnung der Reads nur garantiert, wenn alle Transaktionen einer einzigen GTID-Dom\u00e4ne angeh\u00f6ren; der Modus darf daher nicht pauschal als uneingeschr\u00e4nkte serviceweite Konsistenzgarantie verstanden werden. <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">universal<\/code> pr\u00fcft vor Reads den beobachtbaren Stand am Primary. Die synchronisierenden Modi k\u00f6nnen zus\u00e4tzliche Wartezeit erzeugen; schnelle Varianten warten nicht, k\u00f6nnen aber bei Writes die Last st\u00e4rker zum Primary verschieben. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Grenzf\u00e4lle verdienen vor der Einf\u00fchrung gezielte Tests mit dem realen Treiber und Datenmodell. Tempor\u00e4re Tabellen und darauf vorbereitete Statements k\u00f6nnen auf Replicas nicht verf\u00fcgbar sein, wenn die Vorbereitung am Primary erfolgt. Auch Stored Procedures, UDF-Aufrufe, Multi-Statements und Sitzungszustand beeinflussen, ob der Router konservativ zum Primary routet. <\/p>\n<p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Transaction Replay ist keine Zusage f\u00fcr verlustfreie Transaktionen. Bricht eine Verbindung w\u00e4hrend <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">COMMIT<\/code> ab, kann offenbleiben, ob das Commit bereits erfolgreich war. Riskante Replay-Konfigurationen k\u00f6nnen Schreiboperationen doppelt ausf\u00fchren; serverabh\u00e4ngige Ergebnisse wie <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">NOW()<\/code> oder <code data-no-translation style=\"font:600 .87em\/1.5 ui-monospace,monospace;color:#235063;background:#edf3f5;border-radius:4px;padding:.1em .3em\">@@server_id<\/code> k\u00f6nnen zudem Pr\u00fcfsummenabweichungen ausl\u00f6sen. Beurteile den Einsatz daher anhand von Konsistenzbedarf, Fehlerabl\u00e4ufen und Wiederholbarkeit der Writes, nicht anhand pauschaler Leistungsversprechen. <\/p>\n<\/section><section class=\"wh-sources\" style=\"margin:40px 0 0;padding:24px 0 0;border-top:1px solid #dce5e9;color:#596b7b;font-size:14px;line-height:1.65\"><h2 style=\"margin:38px 0 18px;color:#172f41;font-size:clamp(24px,1.25rem + 1vw,30px);font-weight:700;line-height:1.3;scroll-margin-top:115px\">Quellen und fachlicher Stand<\/h2><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Recherche-Stand: <time datetime=\"2026-11-02\">2026-11-02<\/time><\/p><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\">Versionsrahmen: MaxScale 25.10, dokumentierte Release-Serie. Konfiguration, verf\u00fcgbare Parameter und Grenzen vor dem Einsatz mit der tats\u00e4chlich installierten MaxScale- und MariaDB-Version abgleichen.<\/p><div class=\"wh-source-urls\"><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><span class=\"wh-source-url\" data-no-translation dir=\"ltr\" style=\"overflow-wrap:anywhere;font:12px\/1.6 ui-monospace,monospace;direction:ltr\">https:\/\/mariadb.com\/docs\/release-notes\/maxscale\/25.10<\/span><\/p><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><span class=\"wh-source-url\" data-no-translation dir=\"ltr\" style=\"overflow-wrap:anywhere;font:12px\/1.6 ui-monospace,monospace;direction:ltr\">https:\/\/mariadb.com\/docs\/maxscale\/reference\/maxscale-routers\/maxscale-readwritesplit<\/span><\/p><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><span class=\"wh-source-url\" data-no-translation dir=\"ltr\" style=\"overflow-wrap:anywhere;font:12px\/1.6 ui-monospace,monospace;direction:ltr\">https:\/\/mariadb.com\/docs\/maxscale\/maxscale-management\/deployment\/installation-and-configuration\/maxscale-configuration-guide<\/span><\/p><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><span class=\"wh-source-url\" data-no-translation dir=\"ltr\" style=\"overflow-wrap:anywhere;font:12px\/1.6 ui-monospace,monospace;direction:ltr\">https:\/\/mariadb.com\/docs\/maxscale\/reference\/maxscale-monitors\/mariadb-monitor<\/span><\/p><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><span class=\"wh-source-url\" data-no-translation dir=\"ltr\" style=\"overflow-wrap:anywhere;font:12px\/1.6 ui-monospace,monospace;direction:ltr\">https:\/\/mariadb.com\/docs\/maxscale\/maxscale-security\/authentication-modules<\/span><\/p><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><span class=\"wh-source-url\" data-no-translation dir=\"ltr\" style=\"overflow-wrap:anywhere;font:12px\/1.6 ui-monospace,monospace;direction:ltr\">https:\/\/mariadb.com\/docs\/maxscale\/reference\/maxscale-routers\/maxscale-readconnroute<\/span><\/p><p style=\"margin:0 0 1.1em;font-size:inherit;line-height:inherit\"><span class=\"wh-source-url\" data-no-translation dir=\"ltr\" style=\"overflow-wrap:anywhere;font:12px\/1.6 ui-monospace,monospace;direction:ltr\">https:\/\/mariadb.com\/docs\/maxscale\/reference\/maxscale-filters\/maxscale-firewall-filter<\/span><\/p><\/div><\/section><\/div>\n","protected":false},"excerpt":{"rendered":"<p>MariaDB MaxScale separerar applikationer fr\u00e5n rollerna som prim\u00e4rserver och replik och kan dirigera SQL-f\u00f6rfr\u00e5gningar p\u00e5 ett m\u00e5linriktat s\u00e4tt. Avg\u00f6rande faktorer \u00e4r val av router, replikeringsf\u00f6rdr\u00f6jning, sessionsstatus, TLS och en tydlig driftsprocess.<\/p>","protected":false},"author":1,"featured_media":22067,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[781],"tags":[],"class_list":["post-22062","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-datenbanken-administration-anleitungen"],"acf":[],"_links":{"self":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts\/22062","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/comments?post=22062"}],"version-history":[{"count":5,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts\/22062\/revisions"}],"predecessor-version":[{"id":22070,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts\/22062\/revisions\/22070"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/media\/22067"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/media?parent=22062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/categories?post=22062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/tags?post=22062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}