Zum Hauptinhalt springen
Zurück zur Kategorie

Datenbank-Connection-Pooling: PgBouncer und ProxySQL

PgBouncer und ProxySQL Installation für MySQL und PostgreSQL Connection Pooling, Node.js/Python/PHP Integration und Performance-Optimierung auf Linux-Servern.

Lesezeit: 18 min Datenbank
connection poolingpgbouncerproxysqlmysqlpostgresqlperformancedatenbankoptimierung
Autor
REXE Teknoloji Network & Security Team
Redaktion
REXE Teknoloji Technical Editorial
Erstveröffentlichung
Letzte Aktualisierung

Datenbank-Connection-Pooling: PgBouncer und ProxySQL

Datenbank-Connection-Pooling ermöglicht es Anwendungen, vorhandene Datenbankverbindungen wiederzuverwenden, anstatt für jede Anfrage eine neue Verbindung zu öffnen. Dies reduziert den Verbindungsaufbau-Overhead, begrenzt die Anzahl der Verbindungen auf dem Datenbankserver und verbessert die Gesamtleistung erheblich.

Warum Connection Pooling verwenden?

Jede Datenbankverbindung verbraucht Speicher und CPU-Ressourcen auf dem Server. Bei Anwendungen mit hohem Traffic:

SzenarioOhne Connection PoolMit Connection Pool
1000 gleichzeitige Anfragen1000 DB-Verbindungen20-50 DB-Verbindungen
Verbindungszeit5-50ms pro AnfrageNull (Wiederverwendung)
SpeicherverbrauchHochNiedrig
SkalierbarkeitBegrenztHoch

PgBouncer für PostgreSQL und ProxySQL für MySQL/MariaDB sind die am häufigsten verwendeten Connection-Pooling-Lösungen. Beide sind in Produktionsumgebungen bewährt.

PgBouncer Installation (PostgreSQL)

Installation

hljs bash
# Ubuntu/Debian
apt update
apt install -y pgbouncer

# CentOS/AlmaLinux
dnf install -y pgbouncer

# Version prüfen
pgbouncer --version

pgbouncer.ini Konfiguration

hljs bash
nano /etc/pgbouncer/pgbouncer.ini
hljs ini
[databases]
myapp = host=127.0.0.1 port=5432 dbname=myapp

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 25
min_pool_size = 5
reserve_pool_size = 5
server_idle_timeout = 600
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
admin_users = pgbouncer_admin

Benutzerliste erstellen

hljs bash
# Benutzer-Hashes aus PostgreSQL abrufen
psql -U postgres -c "SELECT '\"' || usename || '\"' || ' \"' || passwd || '\"' FROM pg_shadow;"

nano /etc/pgbouncer/userlist.txt
"appuser" "md5HASH_HIER"
"pgbouncer_admin" "md5HASH_HIER"
hljs bash
systemctl start pgbouncer
systemctl enable pgbouncer
systemctl status pgbouncer

PgBouncer Pool-Modi

hljs ini
; SESSION: Eine Serververbindung pro Client — am kompatiblen, am wenigsten effizient
pool_mode = session

; TRANSACTION: Verbindung wird nur während der Transaktion gehalten — empfohlen
pool_mode = transaction

; STATEMENT: Verbindung nach jeder SQL-Anweisung freigegeben — effizienteste, keine Prepared Statements
pool_mode = statement

PgBouncer Monitoring

hljs bash
psql -h 127.0.0.1 -p 6432 -U pgbouncer_admin pgbouncer
hljs sql
SHOW POOLS;
SHOW CLIENTS;
SHOW SERVERS;
SHOW STATS;
RELOAD;

ProxySQL Installation (MySQL/MariaDB)

hljs bash
wget https://github.com/sysown/proxysql/releases/download/v2.5.5/proxysql_2.5.5-ubuntu22_amd64.deb
dpkg -i proxysql_2.5.5-ubuntu22_amd64.deb
systemctl start proxysql
systemctl enable proxysql

ProxySQL Konfiguration

hljs bash
mysql -h 127.0.0.1 -P 6032 -u admin -padmin
hljs sql
-- MySQL-Server hinzufügen
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections)
VALUES
  (0, '127.0.0.1', 3306, 1000, 200),
  (1, '192.168.1.101', 3306, 1000, 200);

-- Benutzer hinzufügen
INSERT INTO mysql_users (username, password, default_hostgroup)
VALUES ('appuser', 'StarkesPW123!', 0);

-- Query-Routing-Regeln
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES
  (1, 1, '^SELECT.*FOR UPDATE', 0, 1),
  (2, 1, '^SELECT', 1, 1);

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

Node.js Integration

hljs javascript
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: '127.0.0.1',
  port: 6033,
  user: 'appuser',
  password: 'StarkesPW123!',
  database: 'myapp',
  waitForConnections: true,
  connectionLimit: 20,
  queueLimit: 0,
  enableKeepAlive: true
});

async function getUsers() {
  const [rows] = await pool.execute('SELECT * FROM users WHERE active = ?', [1]);
  return rows;
}

Python Integration

hljs python
from sqlalchemy import create_engine, text
from sqlalchemy.pool import QueuePool

engine = create_engine(
    'postgresql://appuser:StarkesPW123!@127.0.0.1:6432/myapp',
    poolclass=QueuePool,
    pool_size=10,
    max_overflow=20,
    pool_timeout=30,
    pool_recycle=1800,
    pool_pre_ping=True
)

with engine.connect() as conn:
    result = conn.execute(text('SELECT * FROM users WHERE active = :active'), {'active': 1})
    users = result.fetchall()

Fazit

Connection Pooling verbessert die Datenbankleistung bei Anwendungen mit hohem Traffic erheblich. PgBouncer für PostgreSQL und ProxySQL für MySQL sind die ausgereiftesten und zuverlässigsten Lösungen. Mit der richtigen Pool-Modus-Auswahl (Transaction-Modus bietet meist die beste Balance) erzielen Sie maximale Datenbankleistung auf REXE-Servern.

Häufig gestellte Fragen

Welchen PgBouncer Pool-Modus soll ich verwenden?

Für die meisten Anwendungen wird der 'transaction'-Modus empfohlen. In diesem Modus wird die Verbindung nur während der Transaktion gehalten und sofort an den Pool zurückgegeben. Der 'session'-Modus ist am kompatiblen, aber am wenigsten effizient. Der 'statement'-Modus ist am effizientesten, unterstützt aber keine Prepared Statements.

Wie konfiguriere ich Read/Write-Splitting mit ProxySQL?

ProxySQL verwendet Hostgroups: Hostgroup 0 für Schreiboperationen (Master), Hostgroup 1 für Lesevorgänge (Replica). Durch Hinzufügen von Regeln in mysql_query_rules können SELECT-Abfragen an Replicas und INSERT/UPDATE/DELETE an den Master weitergeleitet werden.

Wie bestimme ich die optimale Pool-Größe?

Allgemeine Regel: Pool-Größe = (CPU-Kerne * 2) + Anzahl der Festplatten. Für einen 4-Kern-Server sind 10-20 Verbindungen in der Regel ausreichend. Zu viele Verbindungen erhöhen den Context-Switching-Overhead. Führen Sie Lasttests mit pgbench oder sysbench durch, um den optimalen Wert zu finden.

Prepared Statements funktionieren nicht mit PgBouncer, was soll ich tun?

Dies ist eine bekannte Einschränkung des Transaction-Modus. Lösungen: 1) Wechseln Sie in den Session-Modus (Leistungseinbuße), 2) Deaktivieren Sie Prepared Statements auf Anwendungsseite, 3) PgBouncer 1.21+ unterstützt Prepared Statements im Transaction-Modus — aktualisieren Sie Ihre Version.

Verwandte Artikel

PostgreSQL Installation und Grundlegende Verwaltung

PostgreSQL-Installation auf Ubuntu/Debian und RHEL/CentOS, Benutzer und Datenbanken erstellen, grundlegende SQL-Befehle, Remote-Verbindung konfigurieren und Backup-Strategien. Schritt-fur-Schritt-Anleitung.

15 min
postgresqldatenbankinstallation
NetzwerkverkehrEingehend GbpsAusgehend Gbps