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.
Pertama, data perlu dibahagikan kepada serpihan yang berbeza mengikut peraturan tertentu. Peraturan pembahagian khusus boleh dirumus mengikut keperluan perniagaan yang biasa digunakan ialah:
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.
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(); }
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!