Rumah  >  Artikel  >  pangkalan data  >  Cara menggunakan Redis untuk mengunci sumber

Cara menggunakan Redis untuk mengunci sumber

WBOY
WBOYke hadapan
2023-05-28 11:01:45897semak imbas

1. Gambaran Keseluruhan

Memandangkan teknologi ini terus dikemas kini dan diulangi, konsep pengedaran semakin bertambah berat dalam perusahaan! Apabila bercakap tentang pengedaran, tidak dapat dielakkan untuk menyebut kunci yang diedarkan Pada masa ini, terdapat tiga kaedah pelaksanaan utama bagi kunci yang diedarkan, Zookeeper, DB dan Redis Dalam artikel ini, kami menggunakan Redis sebagai contoh.

Dari perspektif kami, ketiga-tiga sifat ini adalah jaminan minimum yang diperlukan untuk menggunakan kunci teragih dengan berkesan.

  1. Ciri keselamatan: Pengecualian bersama. Pada bila-bila masa, hanya seorang pelanggan boleh memegang kunci.

  2. Atribut kecergasan: Tiada jalan buntu. Akhirnya, kunci sentiasa boleh diperolehi walaupun pelanggan yang mengunci sumber ranap atau sekatan.

  3. Kehidupan: toleransi kesalahan. Selagi majoriti nod Redis sedang berjalan, pelanggan boleh memperoleh dan melepaskan kunci.

2 Cabaran yang dibawa oleh pelaksanaan berbilang nod redis bagi kunci teragih

Cara paling mudah untuk kami menggunakan Redis untuk mengunci sumber ialah:

  1. Buat kunci pada contoh.

  2. Kunci biasanya wujud untuk masa yang terhad menggunakan ciri tamat tempoh Redis, jadi ia akhirnya akan dikeluarkan dan akhirnya akan dipadamkan selepas tempoh tertentu.

  3. Apabila pelanggan perlu melepaskan sumber, ia akan mengeluarkan kunci.

Pada pandangan pertama, nampaknya tiada apa-apa yang salah. Tetapi mari kita lihat dengan lebih dekat Penyelesaian pelaksanaan ini nampaknya tidak mempunyai masalah dalam persekitaran yang berdiri sendiri! Tetapi bagaimana jika nod itu turun? Okey, jadi mari tambah nod slave! Jika pelayan utama tidak berfungsi, gunakan nod ini! Tetapi mari kita lihat dan lihat sama ada dia benar-benar dijamin untuk tersedia?

Apabila bercakap tentang kecacatan maut ini, kita perlu memahami satu perkara pengetahuan, Redis复制是异步的。

  1. Klien A memperoleh kunci dalam pelayan utama.

  2. Tuan terhempas sebelum menyalin kunci kepada hamba.

  3. slaveDinaikkan pangkat kepada    master.

  4. Klien B memperoleh kunci kerana hamba tidak mempunyai objek untuk kunci, dan pemerolehan berjaya!

Jelas sekali, ini adalah salah Nod induk turun kerana ia tidak mempunyai masa untuk menyegerakkan data, jadi nod hamba tidak mempunyai data, menyebabkan kunci yang diedarkan gagal. . Kemudian penulis antirezMaksudnya ialah bagaimana untuk menyelesaikan perkara ini?

3. Algoritma Redlock

Penulis percaya bahawa kita harus menggunakan berbilang Redis nod ini adalah bebas sepenuhnya dan tidak perlu menggunakan replikasi atau sebarang sistem untuk menyelaraskan data Proses mendapatkan kunci menjadi langkah berikut:

  1. Dapatkan masa pelayan semasa dalam milisaat

  2. Cuba gunakan kunci yang sama dan nilai Rawak digunakan untuk memperoleh kunci. Perlu ada masa tamat untuk setiap mesin apabila memperoleh kunci tersebut daripada ini adalah Untuk memastikan pelanggan disambungkan ke mesin yang gagal, masa tambahan dibelanjakan! Jika data tidak diperolehi dalam tempoh tamat masa, nod akan ditinggalkan dan nod seterusnya akan diperolehi sehingga semua nod diperoleh!

  3. Selepas pemerolehan selesai, dapatkan masa semasa tolak masa yang diperolehi dalam langkah 1. Jika dan hanya jika lebih separuh daripada pelanggan berjaya memperoleh dan masa untuk memperoleh kunci adalah kurang daripada tamat masa jumlah kunci, terbukti bahawa Kunci itu berkuat kuasa!

  4. Selepas memperoleh kunci, tamat masa kunci adalah sama dengan 设置的有效时间-获取锁花费的时间

  5. Jika lebih separuh daripada mesin yang memperoleh kunci tidak berpuas hati, atau tamat masa kunci adalah negatif selepas pengiraan, atau operasi abnormal lain, sistem akan cuba membuka kunci semua keadaan, walaupun beberapa keadaan Jika kunci tidak berjaya diperoleh, anda masih akan cuba membuka kuncinya!

  6. Lepaskan kunci, cuma lepaskan kunci dalam semua keadaan, tidak kira sama ada pelanggan berpendapat ia boleh berjaya mengunci tika yang diberikan.

4 Tetapi adakah Redlock benar-benar boleh menyelesaikan masalah?

Martin Kleppmann menerbitkan tugas artikel, Redlock tidak dapat menjamin keselamatan kunci!

Dia percaya hanya terdapat dua kegunaan kunci

  1. Meningkatkan kecekapan, menggunakan kunci untuk memastikan sesuatu tugasan tidak perlu dilaksanakan dua kali. Contohnya (pengiraan yang sangat mahal)

  2. Untuk memastikan ketepatan, mekanisme kunci digunakan untuk memastikan tugas dilakukan mengikut urutan proses biasa untuk mengelakkan dua nod beroperasi pada data yang sama pada masa yang sama, mengakibatkan konflik Fail dan kehilangan data.

Untuk sebab pertama, kami mempunyai toleransi tertentu untuk kunci Walaupun dua nod berfungsi pada masa yang sama, impak pada sistem hanya akan menjadi usaha tambahan kos pengiraan, tiada kesan tambahan. Pada masa ini, menggunakan satu titik Redis boleh menyelesaikan masalah dengan baik. Tidak perlu menggunakan RedLock untuk mengekalkan begitu banyak contoh Redis dan meningkatkan kos penyelenggaraan sistem.

1. Kelemahan yang disebabkan oleh tamat masa kunci yang diedarkan

Tetapi untuk senario kedua, anda harus lebih berhati-hati, kerana ia berkemungkinan melibatkan beberapa urus niaga kewangan, Dan jika dua nod memproses data yang sama pada masa yang sama, hasilnya akan menjadi rasuah fail, kehilangan data, ketidakkonsistenan kekal atau kerugian kewangan!

Mari kita andaikan senario di mana kita mempunyai dua pelanggan Setiap pelanggan mesti mendapatkan kunci sebelum ia boleh menyimpan data ke pangkalan data Apakah masalah yang akan berlaku jika kita menggunakan algoritma RedLock untuk melaksanakannya. Dalam RedLock, untuk mengelakkan kebuntuan, kunci mempunyai masa tamat tempoh, tetapi Martin berpendapat ini tidak selamat! Carta alir kelihatan seperti ini!

Cara menggunakan Redis untuk mengunci sumber

Selepas pelanggan 1 berjaya memperoleh kunci, ia mula melaksanakan separuh jalan pelaksanaan, GC Penuh berlaku dalam sistem, perkhidmatan sistem telah digantung dan kunci tamat masa selepas beberapa ketika.

Selepas pelanggan 2 menunggu kunci pelanggan 1 untuk tamat masa, ia berjaya mendapatkan kunci dan mula menjalankan operasi pergudangan Selepas selesai, pelanggan 1 menyelesaikan GC Penuh dan melakukan operasi pergudangan yang lain. Ini tidak selamat! Bagaimana untuk menyelesaikannya?

Martin mencadangkan mekanisme pelaksanaan yang serupa dengan penguncian optimistik Contoh rajah adalah seperti berikut:

Cara menggunakan Redis untuk mengunci sumber

Selepas pelanggan 1 digantung untuk masa yang lama, pelanggan 2 memperoleh kunci dan mula menulis ke pangkalan data, membawa token pada masa yang sama 34 Selepas menulis ke pangkalan data selesai, pelanggan 1 bangun dan memulakan operasi pergudangan, tetapi kerana token yang dibawa adalah 33 yang lebih kecil daripada token terkini, penyerahan ditolak!

Walaupun terdapat masalah dengan sistem yang menyebabkan hang, idea itu kelihatan lengkap untuk memastikan data masih diproses dengan betul. Tetapi fikirkanlah:

  • Penyimpan data boleh linearizable jika ia sentiasa boleh menerima penulisan hanya jika token anda lebih besar daripada semua token lalu , yang bersamaan dengan menggunakan pangkalan data untuk melaksanakan kunci yang diedarkan sistem, maka peranan RedLock menjadi minimum! Anda tidak perlu menggunakan redis untuk menjamin kunci yang diedarkan!

2. RedLock sangat bergantung pada jam sistem

Imbas kembali Redlock算法 langkah-langkah untuk mendapatkan kunci, anda akan mendapati bahawa keberkesanan kunci adalah berkaitan kepada sistem semasa Jam sangat bergantung, kami menganggap:

Kami mempunyai, A B C D E lima nod redis:

  1. Klien 1 memperoleh kunci nod A, B, C. D dan E tidak boleh diakses kerana masalah rangkaian.

  2. Jam pada nod C melompat ke hadapan, menyebabkan kunci tamat tempoh.

  3. Klien 2 memperoleh kunci nod C, D, E. A dan B tidak boleh diakses kerana masalah rangkaian.

  4. Kini, kedua-dua pelanggan 1 dan 2 berpendapat mereka memegang kunci.

Masalah yang sama mungkin berlaku jika C ranap dan dimulakan semula serta-merta sebelum meneruskan kunci pada cakera.

Martin percaya bahawa lonjakan masa sistem terutamanya datang dari dua aspek (dan penyelesaian yang diberikan oleh pengarang):

  1. Pengubahsuaian manusia.

  • Apa yang anda boleh katakan tentang pengubahsuaian manusia? Tidak ada cara untuk menghalang orang daripada menyebabkan kemusnahan.

  • Kemas kini jam masa lompat telah diterima daripada perkhidmatan NTP.

    • Kakitangan operasi dan penyelenggaraan perlu menangani masalah NTP menerima kemas kini jam langkah. Apabila anda perlu mengemas kini masa langkah ke pelayan, anda harus mengambil langkah kecil dan berjalan dengan cepat. Ubah suai beberapa kali, dan masa untuk setiap kemas kini hendaklah sekecil mungkin.

    3 Tebus kekurangan yang disebabkan oleh tamat masa kunci yang diedarkan berdasarkan bahasa pengaturcaraan

    Mari kita semak 1 sudut pandangan dan mendalami akarnya. punca kecacatan ini dalam pengabstrakan Sebabnya adalah untuk menyelesaikan satu siri masalah yang disebabkan oleh kegagalan kunci yang disebabkan oleh masa henti sistem dan mengenakan masa tamat pada kunci Dalam keadaan tidak normal, masa pelaksanaan program (perniagaan) adalah lebih besar daripada kunci masa tamat tempoh. Bolehkah kita mempertimbangkan aspek ini dan menggunakan program untuk menyelesaikan situasi mati?

    Kami boleh memastikan bahawa masa pelaksanaan program perniagaan benar-benar kurang daripada tamat masa kunci, supaya kami dapat mengelakkan masalah masa tamat tempoh kunci kurang daripada masa perniagaan

    Bahasa Java redisson melaksanakan masa tamat tempoh kunci yang terjamin Masa pastinya lebih besar daripada masa pelaksanaan program perniagaan. Secara rasmi dipanggil mekanisme pengawas (Watchdog), prinsip utamanya ialah selepas program berjaya memperoleh kunci, ia akan bercabang benang kanak-kanak untuk memperbaharui kunci secara berterusan sehingga kunci dilepaskan! Gambarajah skematiknya mungkin kelihatan seperti ini:

    Cara menggunakan Redis untuk mengunci sumber

    redisson menggunakan benang daemon untuk memperbaharui kunci (Peranan benang daemon: apabila benang utama dimusnahkan, ia akan dimusnahkan bersama dengan benang utama<.>.) Halang program Selepas masa henti, benang terus hidup, menyebabkan kebuntuan!

    Selain itu, Redisson juga melaksanakan dan mengoptimumkan algoritma RedLock, kunci saksama, kunci masuk semula, rantai dan operasi lain, menjadikan pelaksanaan kunci yang diedarkan Redis lebih mudah dan lebih cekap!

    Atas ialah kandungan terperinci Cara menggunakan Redis untuk mengunci sumber. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam