Maison  >  Article  >  développement back-end  >  Méthode PHP pour implémenter l'expansion du partitionnement de base de données

Méthode PHP pour implémenter l'expansion du partitionnement de base de données

PHPz
PHPzoriginal
2023-05-16 08:36:051379parcourir

À l'ère d'Internet, les données sont devenues l'un des atouts les plus importants d'une entreprise. Alors que la demande de stockage et de traitement des données continue de croître, l’expansion des bases de données est devenue un choix inévitable pour de nombreuses entreprises. Lorsqu’une seule base de données ne peut pas répondre aux besoins de l’entreprise, le partage de base de données devient une solution d’expansion efficace.

Le partitionnement de base de données fait référence à la division horizontale d'une base de données en plusieurs bibliothèques indépendantes, chaque bibliothèque stockant une partie des données, réduisant ainsi la charge sur une seule bibliothèque et améliorant les performances du système. Dans les scénarios d'application réels, le partitionnement de base de données est généralement divisé en deux méthodes : le partitionnement vertical et le partitionnement horizontal. Cet article présente principalement la méthode d'expansion de partitionnement horizontal implémentée par PHP.

  1. L'idée de base du partage horizontal de la base de données

Tout d'abord, les données doivent être divisées en différents fragments selon certains règles. Des règles de partitionnement spécifiques peuvent être formulées en fonction des besoins de l'entreprise. Les règles couramment utilisées sont :

  • Partage basé sur une plage : partitionnement basé sur la valeur d'une certaine colonne pour garantir que les données sont stockées dans chacune. fragment Les plages sont indépendantes les unes des autres ;
  • Partage basé sur le hachage : effectuez une opération de hachage sur la valeur d'une certaine colonne pour obtenir une valeur, puis distribuez la valeur à différents fragments pour vous assurer que chacun fragment Les données stockées sont à peu près équilibrées.

Après avoir divisé les fragments, la couche de connexion doit être modifiée afin qu'elle puisse sélectionner la base de données correspondante pour y accéder en fonction du fragment où se trouvent les données. Plus précisément, la couche de connexion doit enregistrer les informations pertinentes de chaque fragment, telles que la capacité du fragment, la valeur de début du fragment, la valeur de fin du fragment, etc., et exposer les interfaces à utiliser par la couche métier.

Enfin, la couche métier doit envoyer des requêtes de lecture et d'écriture à la base de données vers les fragments correspondants selon les règles de partitionnement. L'opération de base de données dans la couche métier est en fait une encapsulation de la couche de connexion. Elle doit sélectionner la base de données correspondante selon les règles de partitionnement pour effectuer les opérations CRUD.

  1. Comment PHP implémente l'expansion du partitionnement de la base de données

En PHP, PDO peut être utilisé pour réaliser l'expansion du partitionnement de la base de données MySQL. Plus précisément, vous devez suivre les étapes suivantes :

2.1 Créer une connexion PDO

Lors de la création d'une connexion PDO, vous devez faire attention à certains détails. Tout d'abord, la connexion PDO doit spécifier les informations de configuration pertinentes de la bibliothèque principale et la liste des bibliothèques partitionnées. Deuxièmement, vous devez définir l'attribut PDO::ATTR_ERRMODE sur PDO::ERRMODE_EXCEPTION afin de pouvoir capturer et gérer les exceptions PDO. Enfin, vous devez définir l'attribut PDO::ATTR_EMULATE_PREPARES sur false afin qu'un véritable prétraitement puisse être réalisé.

L'exemple de code est le suivant :

// 主库配置信息
$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,
]);

2.2 Exécuter une requête fragmentée

Lors de l'exécution d'opérations de base de données dans une application, les données doivent être distribuées selon les règles de partitionnement vers la partition correspondante. Généralement, les structures d’un ensemble de bibliothèques partitionnées sont les mêmes, seules les données diffèrent. Par conséquent, lors de l'exécution d'une requête de partition, vous pouvez d'abord obtenir les informations de partition de la bibliothèque principale et transmettre la demande de requête à la bibliothèque de partition correspondante en fonction des informations de partition.

L'exemple de code est le suivant :

// 获取分片信息
$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);

2.3 Exécuter des transactions fragmentées

Lors de la réalisation de transactions distribuées, plusieurs fragments impliqués doivent être des opérations comme un entier. Plus précisément, un protocole de validation en deux phases peut être utilisé pour assurer la cohérence des transactions distribuées.

Parmi eux, la première phase phase_Prepare doit envoyer des requêtes Prepare à tous les fragments impliqués pour obtenir l'ID de transaction correspondant. Une fois que toutes les partitions ont renvoyé des réponses réussies, les requêtes Commit/Abort doivent être envoyées à toutes les partitions pour valider ou annuler la transaction.

L'exemple de code est le suivant :

// 开始分布式事务
$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();
}
  1. Summary

Le partitionnement de base de données est une solution d'extension efficace qui peut Aidez à résoudre le problème de la charge élevée sur une seule base de données. En PHP, PDO peut être utilisé pour réaliser l'expansion de partition de la base de données MySQL. Le processus opérationnel spécifique comprend la création d'une connexion PDO, l'exécution de requêtes de partition et l'exécution de transactions de partition. Dans les applications pratiques, il faut prêter attention aux règles de partitionnement des données et aux modifications de la couche de connexion, ainsi qu'à la cohérence des transactions distribuées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn