Genel olarak dağıtılmış kilitleri açıklamak ve okuduktan sonra anlamazsanız yazar kaybeder

  • 1. Geleneksel kilitlere ne olur?
  • 2. Dağıtılmış kilitlerle nasıl başa çıkılır?
  • 3. Dağıtılmış kilitlerin uygulamaları nelerdir?
  • 4. Zookeeper'da kilitler nasıl eklenir?

Öncelikle, dağıtılmış kilitler temelde genellikle bahsettiğimiz kilit ilkeleriyle aynıdır.Amaç, birden fazla iş parçacığı eşzamanlı olduğunda, bu işi veya yöntemi veya değişkeni aynı anda yalnızca bir iş parçacığının çalıştırmasını sağlamaktır.

Bir süreçte, yani bir jvm'de veya uygulamada kontrolü ele almak bizim için kolaydır. Jdk java.util eşzamanlılık paketi bize senkronize anahtar kelime veya Kilit kilidi gibi kilitlemek için bu yöntemleri sağladı. uğraşmak.

Ancak mevcut uygulamamız yalnızca bir sunucu kullanıyorsa, eşzamanlılık miktarı çok düşüktür.Aynı anda on binlerce istek varsa, aşırı sunucu baskısına ve felce neden olabilir. Saat 22: 00'de Double Eleven ve New Year's Eve'i düşünün ve Alipay kırmızı zarflarını ve diğer iş senaryolarını ayırın. Doğal olarak, bu işleri aynı anda işlemek için birden fazla sunucuya ihtiyaç vardır ve bu hizmetlerin yüzlercesi aynı anda işlenebilir.

Ama bir düşünelim, kırmızı zarf işini halledecek 100 sunucu varsa, şimdi varsayalım ki 100 milyon kırmızı zarf, 10 milyon ayrı nokta var ve miktar rastgele, o zaman bu iş senaryosunda, bu 10 milyon insanı sağlamak gerekli midir? Son kırmızı zarfların toplamı 100 milyona eşit mi?

Eğer bunu iyi idare etmezseniz, herkes 1 milyon alır, o zaman Jack Manın babası, Yeni Yıl Günü'nde iflas ilan etmesi gerekeceğini tahmin eder.

1. Geleneksel kilitlere ne olur?

Önce neden kümelenmelerle uğraşmak istediğimizden bahsedeyim.

Basit anlayış, talebin (talep eşzamanlılığı) daha büyük hale gelmesi ve bir çalışanın sınırlı işlem kapasitesine sahip olması, bu nedenle bunu birlikte ele almak için daha fazla işçi işe alınması gerektiğidir.

10 milyon isteğin 100 sunucuya eşit olarak dağıtıldığını ve her sunucunun 10w istek aldığını varsayın. Bu 10 haftalık talepler aynı saniyede gelmedi. 1,2 saat içinde olabilir. 30 gecede kırmızı zarflar açtığımızı düşünebilirsiniz. 10: 20'de başladığında bazı insanlar hemen açar, bazıları da Sadece saat 12'de hatırladım.

Bu durumda, saniyedeki ortalama istek sayısı 1.000'den azdır ve bu tür bir baskı, sunucular için hala kabul edilebilir.

  • İlk kullanıcı onu böler. Talep geldikten sonra, 100 milyonu ona bölmesi gerekir, miktar rastgele. İlk kişinin 100'e ulaştığı varsayılırsa, 100 milyondan 100 yuan çıkarılır ve geriye 999999900 kalır. Engelle ~
  • İkinci kullanıcı tekrar bölecek, miktar rastgele, bu sefer 200 yuan'a bölünecek, sonra kalan 99999900 yuan'dan 200 yuan çıkarılması ve 99999700 yuan bırakılması gerekiyor.
  • 10. kullanıcı geldiğinde, hala 1000w var, o zaman bu 1000w onun.

Her sunucuda 100 milyonu bölmekle eşdeğerdir, yani 10w kullanıcı 100 milyona bölünür ve nihayet toplamda 100 sunucu vardır ki bu da 10 milyar gerektirir.

Durum böyleyse, Jack Manın babası iflas etmeyecek olsa da (son istatistiklere göre Jack Manın 230 milyar yuanı var), o zaman bonusu paylaşan geliştirme projesi ekibi ve ürün yöneticisi GG olabilir ~

Basitleştirilmiş yapı şeması aşağıdaki gibidir:

2. Dağıtılmış kilitlerle nasıl başa çıkılır?

Yani bu sorunu çözmek için 10 milyon kullanıcının 10 milyar yerine sadece 100 milyonu bölmesine izin verin Şu anda dağıtılmış kilitler işe yarıyor.

Dağıtılmış kilitler, tüm kümeyi bir uygulama olarak ele alabilir, bu nedenle kilidin hizmetten değil her hizmetten bağımsız olması gerekir.

Birinci sunucunun 1. kullanıcının talebini aldıktan sonra, kendi uygulamasında ne kadar para kaldığına karar veremeyeceğini, 100 milyon kırmızı paketi yönetmekten sorumlu kişiyi (hizmeti) istemek için dışarı çıkıp ona sorması gerektiğini varsayalım. : Hey, burada 100 yuan'ı bölmek istiyorum, bana 100 ver.

Kırmızı zarfı (hizmet) yöneten kız hala 100 milyon olduğunu gördü, bu iyi, sana 100 vereceğim ve sonra 999999900 kaldı.

İkinci istek geldikten sonra sunucu 2 tarafından alındı ve sorgulamaya devam ettim.Kırmızı zarfı yöneten kız için 10 parçaya bölmem gerekiyor.Kırmızı zarfı yöneten kız önce kontrol etti ve 99999900 var, sonra dedi ki: Tamam, sana 10 ver Parça. Sonra 99998890 yuan kaldı.

1000'inci istek geldikten sonra sunucu 100 isteği alıyor ve sorgulamaya devam ediyor.Kırmızı zarfı yöneten kız 100 istiyorum. Kız gözlerini devirdi ve sana sadece 1 yuan kaldı dedi. Sevmek istiyorsan bu sefer Size sadece 1 yuan verebilirim (1 yuan aynı zamanda paradır ve kök yaban turpu satın almak hala uygundur).

Bu 1, 2 numaralı talep, yürütme sırasını temsil etmez.Resmi bir senaryoda, 100 sunucu olmalıdır.Her sunucu, kırmızı zarfı yönetmekten sorumlu kıza (hizmete) erişim talebinde bulunur.Kırmızı zarfı yöneten kız da 100 istek alındı Bu sefer kırmızı zarftan sorumlu kıza bir kilit eklemeniz gerekiyor (ortancayı fırlatmak). 100 sunucunuzdan her kim kilidi alırsa (ortancayı kaparak), gelin ve benimle konuşun, vereceğim Onu bölüyorsunuz ve diğerleri gitmeyi bekliyor.

Yukarıdaki dağıtılmış kilit işleminden sonra, Jack Ma'nın babası nihayet rahatladı ve kırmızı zarf ekibinin her birine bir tavuk budu eklemeye karar verdi.

Basitleştirilmiş yapı şeması aşağıdaki gibidir:

3. Dağıtılmış kilitlerin uygulamaları nelerdir?

Dağıtılmış kilitlerin uygulanması söz konusu olduğunda, hala çok sayıda veritabanı yöntemi, Redis dağıtılmış kilitleri, Zookeeper dağıtılmış kilitleri vb. Vardır.

Redis'i dağıtılmış bir kilit olarak kullanırsak, yukarıdaki resimdeki "kırmızı zarftan (hizmet) sorumlu olan kız" Redis ile değiştirilebilir. Lütfen kendi kararınızı verin.

1. Redis neden dağıtılmış kilitleri uygulayabilir?

Her şeyden önce, Redis tek iş parçacıklıdır.Buradaki tek iş parçacığı, tek iş parçacığı kullanan ağ istek modülünü ifade eder (bu nedenle eşzamanlılık güvenliğini dikkate almaya gerek yoktur), yani bir iş parçacığı tüm ağ isteklerini işler ve diğer modüller hala birden çok iş parçacığı kullanır.

Gerçek operasyonda süreç kabaca şu şekildedir:

Sunucu 1, kırmızı zarfı gönderen kızı yani Redis'i ziyaret edecek, ardından "setnx anahtar değeri" işlemi ile Redis'e bir anahtar koyacak, değer önemli değil, önemli olan anahtar yani işarete sahip olmak. , Ve bu anahtar, tüm sunucular aynı anahtara sahip olduğu sürece istediğiniz şeydir.

Aşağıda gösterildiği gibi bir tane ayarladığımızı varsayalım:

O zaman 1'in döndüğünü görebiliriz, bu da başarı anlamına gelir.

Aynı anahtarı ayarlamak için aşağıda gösterildiği gibi başka bir istek varsa:

Şu anda 0 döndürecektir, bu da başarısızlık anlamına gelir.

Daha sonra kilidin mevcut olup olmadığını belirlemek veya "kırmızı zarf göndermekten sorumlu kızı" ziyaret etmek için bu işlemi kullanabiliriz, eğer 1 döndürürse, 0 döndürürse aşağıdaki mantığı çalıştırmaya başlayacağım, sonra Bu işgal edildiği anlamına geliyor ve ben beklemeye devam edeceğim.

Sunucu 1 kilidi aldıktan sonra, iş sürecini gerçekleştirir. Tamamlandıktan sonra, aşağıdaki şekilde gösterildiği gibi kilidi de bırakması gerekir:

Silme başarılı olursa ve 1 döndürürse, diğer sunucular kilidi alma amacına ulaşmak için bu anahtarı ayarlamak için yukarıdaki adımları tekrarlamaya devam edebilir.

Tabii ki yukarıdaki işlemler direkt olarak Redis istemcisi üzerinde gerçekleştiriliyor.Eğer onu bir program üzerinden çağırırsanız kesinlikle böyle yazamazsınız.Örneğin java'nın jedis üzerinden çağrılması gerekiyor ama tüm işlem mantığı temelde aynı.

Yukarıdaki yöntemle, dağıtılmış kilit sorununu çözmüş gibiyiz, ancak herhangi bir sorun var mı?

Evet, hala sorunlar var Kilitlenme meydana gelebilir Örneğin, sunucu 1 kurulduktan sonra, kilidi aldıktan sonra aniden çöküyor.

Daha sonra sonraki silme tuşu işlemi yürütülemez. Bu anahtar her zaman Redis'de bulunacaktır. Diğer sunucular her kontrol ettiğinde, 0 döndürür. Birisinin kilidi kullandığını düşünecekler. Beklemem gerekiyor.

Bu kilitlenme problemini çözmek için, anahtar için bir geçerlilik süresi belirlememiz gerekiyor.

Ayarlamanın iki yolu vardır:

  • Birincisi, anahtar ayarlandıktan sonra "anahtar zaman aşımının sona ermesi" anahtarının geçerlilik süresini doğrudan ayarlamak ve anahtar için saniye cinsinden bir zaman aşımı süresi ayarlamaktır Kilit, kilitlenmeyi önlemek için bu süreden sonra otomatik olarak serbest bırakılacaktır.

Bu yöntem, kilidin geçerlilik süresini kontrol için Redis'e devretmeye eşdeğerdir. Süre dolduysa ve anahtarı benim için silmediyseniz, Redis onu sizin için doğrudan siler ve diğer sunucular kilidi almak için setnx'e devam edebilir.

  • İkinci yol, anahtarı diğer sunuculara silme hakkı vermektir. Şu anda, sunucu 1 gibi değer değerini kullanmanız gerekir. Değer, geçerli zaman + 1 saniye olarak ayarlanır. Bu sırada, sunucu 2 geçişi Zamanın sistemin o anki zamanını aştığı tespit edilirse, sunucu 1'in kilidi açmadığı ve sunucu 1'in bir problemi olabileceği ve sunucu 2'nin anahtar işlemini silmeye başlayacağı ve setnx işlemini yürütmeye devam edeceği anlamına gelir.

Ancak bunda bir sorun var, yani sadece sunucunuz 2 sunucu 1'in zaman aşımına uğradığını bulmakla kalmaz, aynı zamanda sunucu 3 de sunucu 2'nin setnx işlemi tamamlanırsa sunucu 3'ün silineceğini görebilir.Sunucu 3 de başarılı bir şekilde ayarlayabilir mi? Yukarı mı?

Bu, hem Sunucu 2 hem de Sunucu 3'ün kilidi almasına eşdeğerdir ki bu büyük bir problemdir. Şu anda ne yapmalı?

Bu sefer "GETSET key value" komutunu kullanmanız gerekir. Bu komutun anlamı, mevcut anahtarın değerini almak ve yeni bir değer belirlemektir.

Sunucu 2'nin anahtarın süresinin dolduğunu bulduğunu ve getset komutunu çağırmaya başladığını ve sonra süresinin dolup dolmadığını belirlemek için elde edilen zamanı kullandığını varsayalım.Eğer elde edilen süre hala dolmuşsa, bu kilidin elde edildiği anlamına gelir.

Aksi takdirde, sunucu 2 getset'i yürütmeden önce, sunucu 3'ün kilidin sona erdiğini de bulabileceği ve sunucu 2'nin sona erme süresini sıfırlamak için sunucu 2'den önce getset işlemini yürüteceği anlamına gelir.

Ardından, sunucu 2'nin sonraki işlemleri bırakması ve sunucu 3'ün kilidi açmasını veya anahtarın geçerlilik süresinin dolup dolmadığını izlemesi için beklemeye devam etmesi gerekir.

Aslında bu alanda küçük bir problem var Sunucu 3 geçerlilik süresini değiştirdi.Kilidi aldıktan sonra sunucu 2 de geçerlilik süresini değiştirdi ancak kilidi alamadı ancak geçerlilik süresi sunucu 3 bazında artırıldı. Bazıları, ancak etki aslında çok küçük, neredeyse ihmal edilebilir.

2. Zookeeper neden dağıtılmış kilitleri uygulayabilir?

Baidu Ansiklopedisi böyle tanıtıldı: ZooKeeper, dağıtılmış, açık kaynak kodlu dağıtılmış bir uygulama koordinasyon hizmeti, Google'ın Chubby'sinin açık kaynaklı bir uygulaması ve önemli bir Hadoop ve Hbase bileşenidir.

İlk defa tanıdığımız kişiler için ZooKeeper'ın bilgisayar dosya sistemimiz gibi olduğu anlaşılabilir.D diskinde a klasörü oluşturabilir ve a klasöründe a1 ve a2 klasörleri oluşturmaya devam edebiliriz.

Dosya sistemimizin özellikleri nelerdir? Yani, aynı dizindeki dosya adları tekrar edilemez, aynı durum ZooKeeper için de geçerlidir.

ZooKeeper'daki tüm düğümler, yani klasör Znode olarak adlandırılır ve bu Znode düğümü verileri depolayabilir.

"Create / zkjjj nice" ile bir düğüm oluşturabiliriz Bu komut, nice değeriyle kök dizinde bir zkjjj düğümü oluşturmak anlamına gelir. Buradaki aynı değer daha önce bahsettiğim Redis'teki ile aynı, bir anlamı yok, istediğinizi verebilirsiniz.

Ek olarak, ZooKeeper 4 tür düğüm oluşturabilir, yani:

  • Kalıcı düğüm
  • Kalıcı sıra düğümü
  • Geçici düğüm
  • Geçici Sıra Düğümü

Her şeyden önce, kalıcı düğümler ve geçici düğümler arasındaki farktan bahsedelim:

  • Kalıcı düğüm, bu düğümü oluşturduğunuz sürece, ZooKeeper istemcinizin bağlantısı kesilmiş olsun veya olmasın, ZooKeeper sunucusunun bu düğümü kaydedeceği anlamına gelir;
  • Geçici düğümler tam tersidir ZooKeeper istemcinizin bağlantısı kesildiğinde, ZooKeeper sunucusu artık bu düğümü kaydetmeyecektir;
  • Bu arada sıralı düğümlerden de bahsedebiliriz Sıralı düğümler, bir düğüm oluştururken ZooKeeper'ın otomatik olarak 0000001, 0000002 gibi düğümü numaralandıracağı anlamına gelir.

Zookeeper bir izleme mekanizmasına sahiptir. İstemci, ilgilendiği dizin düğümlerini kaydeder ve dinler. Dizin düğümü değiştiğinde (veri değiştiğinde, silindiğinde, alt dizin düğümleri eklendiğinde veya silindiğinde), Zookeeper istemciyi bilgilendirecektir.

4. Zookeeper'da kilitler nasıl eklenir?

Zookeeper'da nasıl kilitleneceğinizi açıklamak için yukarıdaki bonus senaryomuzu birleştirmeye devam edelim.

Sunucu 1'in bir düğüm / zkjjj oluşturduğunu varsayalım. Başarılı olursa, sunucu 1 kilidi alır ve sunucu 2 aynı kilidi tekrar oluşturur ve başarısız olur. Şu anda yalnızca bu düğümün değişikliklerini izleyebilir.

Sunucu 1, işi işlemeyi bitirip düğümü sildikten sonra, kendisine bildirim gönderilecek ve ardından aynı düğümü oluşturacak, işi yürütmek için kilidi alacak ve ardından düğümü silecektir. Sonraki 100 sunucu da benzerdir.

Buradaki 100 sunucunun yukarıdaki düğüm oluşturma işlemini tek tek değil, aynı anda yürüttüğünü unutmayın. Sunucu 1 başarıyla oluşturulduğunda, kalan 99 sunucu bu düğümü kaydedecek ve dinleyecek, bildirimi bekleyecek vb.

Ama burada hala bir sorun olduğunu fark ettiniz mi, yoksa yine de kilitlenmeler olacak, değil mi?

Sunucu 1 bir düğüm oluşturduktan sonra telefonu kapattığında ve onu silemediğinde, diğer 99 sunucu bildirimleri beklemeye devam edecek ve sona erecektir. . .

Şu anda geçici bir düğüm kullanmanız gerekiyor.Daha önce de söylediğimiz gibi, geçici bir düğümün özelliği, istemci bağlantısı kesildiğinde, yani sunucu 1 bir düğüm oluşturduğunda, askıda kalırsa bu düğümün kaybolacağıdır. Otomatik olarak silinecek, böylece sonraki diğer sunucular düğümler oluşturmaya ve kilitler almaya devam edebilecek.

Ancak sürü etkisine de dikkat etmemiz gerekebilir: çok basit bir örnek vermek gerekirse, bir güvercin grubunun ortasına bir parça yiyecek attığınızda, sonunda yiyeceği sadece bir güvercin kapsa da, tüm güvercinler yarışmak için alarma geçecektir. Yakalandı ...

Yani, sunucu 1 düğümü değiştiğinde, kalan 99 sunucuya bildirimde bulunulacak, ancak sonunda yalnızca 1 sunucu başarıyla oluşturulacak, bu nedenle 98'in hala izleme için beklemesi gerekiyor, bu nedenle bu durumla başa çıkmak için geçici sıralı düğümler kullanmanız gerekir. Bunun kaba anlamı, 99 sunucunun tümü bir düğümü dinlemeden önce, şimdi her sunucunun kendi önündeki bir düğümü dinlemesidir.

Aynı anda 100 sunucunun istek gönderdiğini varsayalım. Şu anda, / zkjjj düğümü altında 100 geçici sıralı düğüm / zkjjj / 000000001, / zkjjj / 000000002 ve / zkjjj / 000000100 oluşturulacak. Bu sayı onlar için ayarlanmış olmasına eşdeğerdir Kilitlerin alındığı sıra.

001 düğümü işlendiğinde ve düğüm silindiğinde, 002 bir bildirim alır, kilidi alır, yürütmeyi başlatır, yürütmeyi bitirir, düğümü siler ve 003 ~ bildirir vb.

Kaynak:

:-D WeChat Kimliği Arama (ID: Taro kaynak kodu ), çeşitli Java kaynak kodu analizi, ilke açıklaması, mülakat soruları ve çalışma kılavuzları edinebilirsiniz.

:-D Ve yanıtla [ kitabın Bundan sonra, yazarın önerdiği mimariye girişten başlayarak 100 adet Java kitabı alabilirsiniz.

:-D Ve yanıtla [ Teknoloji Grubu ] Bundan sonra, Java, arka uç ve mimariyi tartışmaya adanmış bir teknoloji grubuna katılabilirsiniz.

Hadi, Sao Nian ~

Bugün, Pekin Daxing Uluslararası Havalimanı'nın ana projesi planlandığı gibi tamamlandı! 50 fotoğraf tüm süreci inceliyor
önceki
Neden büyük şirketler yalnızca 211 öğrenciyi işe alıyor? Yetenek ve eğitim değil, iç personel cevap veriyor
Sonraki
Çinli bir trafik polisi tarafından yakalanan ilk NBA yıldızı! Harden: Sadece manzarayı görmek istiyorum
Programcı içini çekti: kuzen ekipte küçük bir oyuncuydu ve gelirini yanlış okuduğunu düşündü
OCT Group'un Yoksulluğun Azaltılması için "Yaratıcı Fikirleri" - Dağlık bölgelerdeki çocuklara gülücükler getiren bir "Küçük Kırmızı Çiçek"
Daxing Uluslararası Havalimanı terminal alanı projesi tamamlanma kabulünü geçti
Öğretmenlere ve arkadaşlara veda edin ve ilerleyin
10 açık kaynak ve mükemmel arka plan yönetim sistemi UI paneli
Somut olmayan kültürel mirası size yaklaştırıyor: sevimli bebek üretimini öğretmek için el ele
Dalgalanmalara rasyonel bir şekilde yanıt verin: Yeni kan alımlarının bilim ve teknoloji inovasyon kurulu üzerindeki etkisinin körü körüne abartılması tavsiye edilmez.
İlk rapor | Başarıyla "dahil edildi"! Genel sekreter bu antik kentle neden bu kadar ilgileniyor?
Yaz ortasında en mutlu şey dünyayı sizinle birlikte izlemektir
Partinin doğum gününü kutlamak için İçişleri Bakanlığı bir "Kırmızı Pazar" düzenledi
Kuzenim üniversite giriş sınavında 650 puan aldı. Onu bilgisayardan vazgeçip tıp mesleğine gitmeye ikna ettim ama sonuç kayboldu
To Top