Heim > Backend-Entwicklung > PHP-Tutorial > PHP-Methode zur Implementierung der Datenbank-Sharding-Erweiterung

PHP-Methode zur Implementierung der Datenbank-Sharding-Erweiterung

PHPz
Freigeben: 2023-05-16 09:20:02
Original
1425 Leute haben es durchsucht

Im Internetzeitalter sind Daten zu einem der wichtigsten Vermögenswerte eines Unternehmens geworden. Da der Bedarf an Datenspeicherung und -verarbeitung weiter wächst, ist die Datenbankerweiterung für viele Unternehmen zu einer unumgänglichen Entscheidung geworden. Wenn eine einzelne Datenbank die Anforderungen des Unternehmens nicht erfüllen kann, wird Datenbank-Sharding zu einer effektiven Erweiterungslösung.

Datenbank-Sharding bezeichnet die horizontale Aufteilung einer Datenbank in mehrere unabhängige Bibliotheken, wobei jede Bibliothek einen Teil der Daten speichert, wodurch die Belastung einer einzelnen Bibliothek verringert und die Systemleistung verbessert wird. In tatsächlichen Anwendungsszenarien wird das Datenbank-Sharding im Allgemeinen in zwei Methoden unterteilt: vertikales Sharding und horizontales Sharding. In diesem Artikel wird hauptsächlich die von PHP implementierte horizontale Sharding-Erweiterungsmethode vorgestellt.

  1. Die Grundidee des horizontalen Datenbank-Shardings

Zunächst müssen die Daten nach bestimmten Regeln in verschiedene Shards aufgeteilt werden. Spezifische Partitionierungsregeln können entsprechend den Geschäftsanforderungen formuliert werden:

  • Bereichsbasiertes Sharding: Sharding basierend auf dem Wert einer bestimmten Spalte, um sicherzustellen, dass der in jedem Shard gespeicherte Datenbereich unabhängig voneinander ist
  • Basierend auf Hash-Sharding: Führen Sie eine Hash-Operation für den Wert einer bestimmten Spalte durch, um einen Wert zu erhalten, und verteilen Sie den Wert dann auf verschiedene Shards, um sicherzustellen, dass die in jedem Shard gespeicherten Daten ungefähr ausgeglichen sind.

Nach der Aufteilung der Shards muss die Verbindungsschicht geändert werden, damit sie entsprechend dem Shard, in dem sich die Daten befinden, die entsprechende Datenbank für den Zugriff auswählen kann. Insbesondere muss die Verbindungsschicht die relevanten Informationen jedes Fragments aufzeichnen, z. B. Fragmentkapazität, Fragmentstartwert, Fragmentendwert usw., und Schnittstellen für die Verwendung durch die Geschäftsschicht verfügbar machen.

Schließlich muss die Business-Schicht gemäß den Partitionierungsregeln Lese- und Schreibanforderungen an die Datenbank an die entsprechenden Shards senden. Die Datenbankoperation in der Geschäftsschicht ist eigentlich eine Kapselung der Verbindungsschicht. Sie muss die entsprechende Datenbank gemäß den Sharding-Regeln auswählen, um CRUD-Operationen durchzuführen.

  1. So implementieren Sie eine Datenbank-Sharding-Erweiterung in PHP

In PHP können Sie PDO verwenden, um eine Sharding-Erweiterung der MySQL-Datenbank zu erreichen. Im Einzelnen müssen Sie die folgenden Schritte ausführen:

2.1 Erstellen einer PDO-Verbindung

Beim Erstellen einer PDO-Verbindung müssen Sie auf einige Details achten. Zunächst muss die PDO-Verbindung die relevanten Konfigurationsinformationen der Hauptbibliothek und die Liste der Shard-Bibliotheken angeben. Zweitens müssen Sie das Attribut PDO::ATTR_ERRMODE auf PDO::ERRMODE_EXCEPTION setzen, damit Sie PDO-Ausnahmen erfassen und behandeln können. Abschließend müssen Sie das Attribut PDO::ATTR_EMULATE_PREPARES auf false setzen, damit eine echte Vorverarbeitung erreicht werden kann.

Der Beispielcode lautet wie folgt:

// 主库配置信息
$masterConfig = [
    'dsn'      => 'mysql:host=127.0.0.1;port=3306;dbname=test',
    'username' => 'root',
    'password' => 'root',
];

// 分片库列表
$shardConfigList = [
    [
        'dsn'      => 'mysql:host=127.0.0.1;port=3306;dbname=test_shard_0',
        'username' => 'root',
        'password' => 'root',
    ],
    [
        'dsn'      => 'mysql:host=127.0.0.1;port=3306;dbname=test_shard_1',
        'username' => 'root',
        'password' => 'root',
    ],
];

// 创建PDO连接
$pdo = new PDO($masterConfig['dsn'], $masterConfig['username'], $masterConfig['password'], [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
]);
Nach dem Login kopieren

2.2 Shard-Abfrage ausführen

Bei der Durchführung von Datenbankoperationen in einer Anwendung müssen die Daten den entsprechenden Shards gemäß den Partitionierungsregeln zugeordnet werden. Typischerweise sind die Strukturen in einer Reihe von Shard-Bibliotheken gleich, nur die Daten unterscheiden sich. Wenn Sie eine Shard-Abfrage durchführen, können Sie daher zunächst die Shard-Informationen von der Hauptbibliothek abrufen und die Abfrageanforderung basierend auf den Shard-Informationen an die entsprechende Shard-Bibliothek weiterleiten.

Der Beispielcode lautet wie folgt:

// 获取分片信息
$sql = 'SELECT * FROM `shard_info` WHERE shard_id = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$shardId]);
$info = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$info) {
    throw new RuntimeException('Shard not found');
}

// 创建分片PDO连接
$pdoShard = new PDO($info['dsn'], $info['username'], $info['password'], [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
]);

// 执行查询
$sql = 'SELECT * FROM `table` WHERE `key` = ?';
$stmt = $pdoShard->prepare($sql);
$stmt->execute([$key]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
Nach dem Login kopieren

2.3 Ausführen von Shard-Transaktionen

Bei der Durchführung verteilter Transaktionen müssen die Vorgänge mehrerer beteiligter Shards als Ganzes behandelt werden. Insbesondere kann ein zweiphasiges Festschreibungsprotokoll verwendet werden, um Konsistenz bei verteilten Transaktionen zu erreichen.

Unter anderem erfordert die erste Phase_Vorbereitungsphase das Senden von Vorbereitungsanforderungen an alle beteiligten Shards, um die entsprechende Transaktions-ID zu erhalten. Nachdem alle Shards erfolgreiche Antworten zurückgegeben haben, müssen Commit-/Abort-Anfragen an alle Shards gesendet werden, um die Transaktion festzuschreiben oder rückgängig zu machen.

Der Beispielcode lautet wie folgt:

// 开始分布式事务
$pdo->beginTransaction();

try {
    // 准备分片事务
    $xid = uniqid();
    $prepares = [];

    foreach ($shardConfigList as $shardConfig) {
        $pdoShard = new PDO($shardConfig['dsn'], $shardConfig['username'], $shardConfig['password'], [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES => false,
        ]);

        $pdoShard->beginTransaction();
        $stmt = $pdoShard->prepare('INSERT INTO `table` (`key`, `value`) VALUES (?, ?)');
        $stmt->execute([$key, $value]);
        $prepares[] = [$pdoShard, $xid];
    }

    // 提交分片事务
    foreach ($prepares as [$pdoShard, $xid]) {
        $stmt = $pdoShard->prepare('PREPARE TRANSACTION ?');
        $stmt->execute([$xid]);
    }

    foreach ($prepares as [$pdoShard, $xid]) {
        $stmt = $pdoShard->prepare('COMMIT PREPARED ?');
        $stmt->execute([$xid]);
    }

    // 提交整个事务
    $pdo->commit();
} catch (Exception $ex) {
    // 回滚分片事务
    foreach ($prepares as [$pdoShard, $xid]) {
        $stmt = $pdoShard->prepare('ROLLBACK PREPARED ?');
        $stmt->execute([$xid]);
    }

    // 回滚整个事务
    $pdo->rollback();
}
Nach dem Login kopieren
  1. Zusammenfassung

Datenbank-Sharding ist eine effektive Erweiterungslösung, die dabei helfen kann, das Problem der hohen Auslastung einer einzelnen Datenbank zu lösen. In PHP kann PDO verwendet werden, um eine Shard-Erweiterung der MySQL-Datenbank zu erreichen. Der spezifische Vorgang umfasst das Erstellen einer PDO-Verbindung, das Ausführen von Shard-Abfragen und das Ausführen von Shard-Transaktionen. In praktischen Anwendungen muss auf die Regeln der Datenpartitionierung und Änderungen an der Verbindungsschicht sowie auf die Konsistenz verteilter Transaktionen geachtet werden.

Das obige ist der detaillierte Inhalt vonPHP-Methode zur Implementierung der Datenbank-Sharding-Erweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage