Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kaedah PHP untuk melaksanakan pengembangan sharding pangkalan data

Kaedah PHP untuk melaksanakan pengembangan sharding pangkalan data

PHPz
PHPzasal
2023-05-16 08:36:051363semak imbas

Dalam era Internet, data telah menjadi salah satu aset terpenting sesebuah perusahaan. Memandangkan permintaan untuk penyimpanan dan pemprosesan data terus berkembang, pengembangan pangkalan data telah menjadi pilihan yang tidak dapat dielakkan bagi banyak perusahaan. Apabila pangkalan data tunggal tidak dapat memenuhi keperluan perusahaan, pembahagian pangkalan data menjadi penyelesaian pengembangan yang berkesan.

Perkongsian pangkalan data merujuk kepada membahagikan pangkalan data secara mendatar kepada berbilang perpustakaan bebas, dengan setiap perpustakaan menyimpan sebahagian daripada data, dengan itu mengurangkan beban pada pustaka tunggal dan meningkatkan prestasi sistem. Dalam senario aplikasi sebenar, sharding pangkalan data biasanya dibahagikan kepada dua kaedah: sharding menegak dan sharding mendatar Artikel ini terutamanya memperkenalkan kaedah pengembangan sharding mendatar yang dilaksanakan oleh PHP.

  1. Idea asas pemecahan mendatar pangkalan data

Pertama, data perlu dibahagikan kepada serpihan yang berbeza mengikut peraturan tertentu. Peraturan pembahagian khusus boleh dirumus mengikut keperluan perniagaan yang biasa digunakan ialah:

  • Pembahagian berasaskan julat: pembahagian dilakukan berdasarkan nilai lajur tertentu untuk memastikan julat data disimpan dalam setiap. shard adalah saling bebas;
  • Sharding berasaskan hash: lakukan operasi cincang pada nilai lajur tertentu untuk mendapatkan nilai, dan kemudian agihkan nilai kepada serpihan yang berbeza untuk memastikan data disimpan dalam setiap serpihan adalah kira-kira seimbang.

Selepas membahagikan serpihan, lapisan sambungan perlu diubah suai supaya ia boleh memilih pangkalan data yang sepadan untuk akses mengikut serpihan di mana data berada. Khususnya, lapisan sambungan perlu merekodkan maklumat yang berkaitan bagi setiap serpihan, seperti kapasiti serpihan, nilai mula serpihan, nilai akhir serpihan, dsb., dan mendedahkan antara muka untuk digunakan oleh lapisan perniagaan.

Akhir sekali, lapisan perniagaan perlu menghantar permintaan baca dan tulis ke pangkalan data kepada serpihan yang sepadan mengikut peraturan pembahagian. Operasi pangkalan data dalam lapisan perniagaan sebenarnya adalah enkapsulasi lapisan sambungan Ia perlu memilih pangkalan data yang sepadan mengikut peraturan sharding untuk melaksanakan operasi CRUD.

  1. Cara PHP melaksanakan pengembangan sharding pangkalan data

Dalam PHP, PDO boleh digunakan untuk melaksanakan pengembangan sharding pangkalan data MySQL. Secara khusus, anda perlu mengikuti langkah berikut:

2.1 Buat sambungan PDO

Apabila membuat sambungan PDO, anda perlu memberi perhatian kepada beberapa butiran. Mula-mula, sambungan PDO perlu menentukan maklumat konfigurasi yang berkaitan bagi perpustakaan utama dan senarai perpustakaan yang dipecahkan. Kedua, anda perlu menetapkan atribut PDO::ATTR_ERRMODE kepada PDO::ERRMODE_EXCEPTION supaya anda boleh menangkap dan mengendalikan pengecualian PDO. Akhir sekali, anda perlu menetapkan atribut PDO::ATTR_EMULATE_PREPARES kepada palsu supaya prapemprosesan sebenar boleh dicapai.

Kod sampel adalah seperti berikut:

// 主库配置信息
$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 Laksanakan pertanyaan shard

Apabila melakukan operasi pangkalan data dalam aplikasi, data perlu diperuntukkan kepada serpihan yang sepadan mengikut peraturan pembahagian. Lazimnya, struktur dalam satu set perpustakaan yang dipecahkan adalah sama, hanya data yang berbeza. Oleh itu, apabila melakukan pertanyaan shard, anda boleh mendapatkan maklumat shard terlebih dahulu dari perpustakaan utama dan memajukan permintaan pertanyaan ke perpustakaan shard yang sepadan berdasarkan maklumat shard.

Kod sampel adalah seperti berikut:

// 获取分片信息
$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 Melaksanakan urus niaga berpecah

Apabila melakukan transaksi teragih, operasi berbilang serpihan yang terlibat perlu dilayan secara keseluruhan . Secara khusus, protokol komit dua fasa boleh digunakan untuk mencapai konsistensi dalam transaksi yang diedarkan.

Antaranya, fasa pertama_Fasa Persediaan perlu menghantar permintaan Sediakan kepada semua serpihan yang terlibat untuk mendapatkan ID transaksi yang sepadan. Selepas semua serpihan mengembalikan respons yang berjaya, permintaan Komit/Batalkan perlu dihantar kepada semua serpihan untuk melakukan atau tarik balik urus niaga.

Kod sampel adalah seperti berikut:

// 开始分布式事务
$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. Ringkasan

Pecahan pangkalan data ialah penyelesaian pengembangan berkesan yang boleh membantu menyelesaikan masalah beban berlebihan pada satu soalan pangkalan data. Dalam PHP, PDO boleh digunakan untuk mencapai pengembangan serpihan pangkalan data MySQL Proses operasi khusus termasuk mewujudkan sambungan PDO, melaksanakan pertanyaan serpihan, dan melaksanakan transaksi serpihan. Dalam aplikasi praktikal, perhatian perlu diberikan kepada peraturan pembahagian data dan pengubahsuaian pada lapisan sambungan, serta konsistensi transaksi yang diedarkan.

Atas ialah kandungan terperinci Kaedah PHP untuk melaksanakan pengembangan sharding pangkalan data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn