Yaprak, Meituan'ın temel araştırma ve geliştirme platformu tarafından başlatılan dağıtılmış bir kimlik oluşturma hizmetidir.Adı, Alman filozof ve matematikçi Leibniz'in "Dünyada aynı iki yaprak yoktur" ifadesinden alınmıştır. Leaf, yüksek güvenilirlik, düşük gecikme süresi ve küresel benzersizlik özelliklerine sahiptir. Şu anda, Meituan Finans, Meituan Paket Servisi ve Meituan Likörü gibi birçok departmanda yaygın olarak kullanılmaktadır. Spesifik teknik ayrıntılar için lütfen önceki Meituan Teknoloji Blogundaki bir makaleye bakın: "Yaprak Meituan Dağıtılmış Kimlik Oluşturma Hizmeti". Son zamanlarda, Leaf projesi Github'da açık kaynaklı: https://github.com/Meituan-Dianping/Leaf, daha teknik meslektaşlarla iletişim kurmayı ve birlikte inşa etmeyi umuyorum.
Yaprak özellikleri
Yaprak, tasarımın başlangıcında çeşitli gereksinimleri karşıladı:
Yaprak doğar
Leaf'in ilk sürümü, kimlik oluşturmak için bir ön dağıtım yöntemi kullanır, yani N sunucu DB'ye bağlanabilir.Her sunucu başladığında, sabit uzunlukta bir kimlik listesi almak için DB'ye gidecektir. Bu, tamamen dağıtılmış bir mimariye ulaşır ve kimlik bellek tarafından dağıtıldığı için çok verimli olabilir. Sırada veri kalıcılığı sorunu var: Leaf sabit uzunlukta bir Kimlik Listesi almak için DB'ye her gittiğinde ve daha sonra en büyük kimliği devam ettirdiğinde, yani her kimlik kalıcı değildir, ancak bir grup kimlikteki en büyük kimlik kalır. Bir. Bu yöntem, oyundaki normal arşiv işlevine biraz benzer, ancak arşivin gelecekte belirli bir zamanda kullanıcıya verilen kimlik olması, bu da DB kalıcılığının baskısını büyük ölçüde azaltır.
Tüm hizmetin spesifik süreci aşağıdaki gibidir:
Kullanıcı, Leaf Server'ın çeşitli hizmetlerini Round-robin aracılığıyla çağırır, bu nedenle belirli bir İstemci tarafından elde edilen kimlik dizisi: 1, 1001, 2001, 2, 1002, 2002 ... veya: 1, 2 olabilir , 1001, 2001, 2002, 2003, 3, 4 ... Yaprak Sunucu numarası segmenti kullanıldığında, sonraki istek DB'den yeni bir numara segmenti yükleyecek ve bu da her yüklendiğinde Sayı segmenti artıyor.
Leaf veritabanındaki sayı segment tablosunun formatı aşağıdaki gibidir:
Leaf Server'ın sayı segmentini yüklemesi için SQL deyimi aşağıdaki gibidir:
Genel olarak, V1 sürümünün uygulanması nispeten basittir ve iş katmanı DB baskısı sorununu mümkün olan en kısa sürede çözmek için hızla yinelenen bir sürümdür. Bu nedenle üretim ortamında bazı sorunlar bulundu. gibi:
Yaprak çift tampon optimizasyonu
Leaf, bu iki sorunu çözmek için bir asenkron güncelleme stratejisi benimser ve aynı zamanda, DB ile ilgili bir sorun olduğunda, normal olarak hizmet sağlayabilen bir Tampon numarası segmenti olmasını sağlamak için çift Buffer yöntemiyle bir eşzamansız güncelleme stratejisi benimser. DB, bir Buffer yayınlama döngüsü içinde kurtarıldığı sürece, tüm Yaprağın kullanılabilirliğini etkilemeyecektir.
Kodun bu sürümü yaklaşık yarım yıldır çevrimiçi olarak kararlı bir şekilde çalışıyor ve Leaf yeni sorunlarla karşılaştı:
Leaf Step'i dinamik olarak ayarlar
Hipotez Hizmet QPS'si Q, sayı segment uzunluğu L, sayı segment güncelleme döngüsü T , Sonra S * T = L . Başlangıçta, L'nin uzunluğu sabittir ve bunun sonucunda Q arttıkça T küçülür ve küçülür. Ancak Leaf'in temel gereksinimi Hope T düzeltildi . O zaman L, Q ile pozitif olarak ilişkilendirilebilirse, T sabit bir değere yaklaşabilir. Bu nedenle, Leaf sayı segmentini her güncellediğinde, son güncelleme numarası segmentinin T periyoduna ve numara segment uzunluğu adımına göre bir sonraki adım segment uzunluğunu belirler:
Şimdiye kadar, belirli bir zaman aralığına eğilimli istikrarlı sayı segment tüketim talebi karşılandı. Elbette ani trafiğin ani olarak onlarca ila yüzlerce kez artması karşısında, bu çözüm veritabanının bir süre kullanılamaz olmasına tahammül edebilme ihtiyacını hala karşılayamamakta ve sistem yine de kararlı bir şekilde çalışabilmektedir. Çünkü özünde Leaf, DB katmanında bazı hataya dayanıklı çözümler üretti, ancak kimlik numara segmenti modunda yayınlandı ve sonuçta büyük ölçüde DB'ye güvenmesi gerekiyor.
MySQL yüksek kullanılabilirlik
MySQL katmanında, Leaf şu anda verileri senkronize etmek için yarı eşzamanlı bir yol kullanıyor ve şirketin DB ara yazılımı Zebra artı MHA'yı bir ana-bağımlı anahtar yapmak için kullanıyor. Gelecekte tamamen güçlü bir tutarlılık arayışında, MySQL Grup Çoğaltmaya geçmeyi düşüneceğiz.
Bu aşamada, şirketin veri tabanındaki güçlü tutarlılığı hala gelişmekte olduğundan, Leaf bilgisayar odası bağlantı kesintisi senaryosunda veri tutarlılığını sağlamak için geçici bir çözüm benimsemiştir:
Yaprak izleme
Hizmetin kendisinin izlenmesi için Leaf, tüm sayı segmentlerinin durumunu gerçek zamanlı olarak görebilen Web katmanının bir bellek veri eşleme arabirimi sağlar. Örneğin, her sayı segmentinin çift tamponunun kullanımı, geçerli kimliğin verildiği yer ve diğer bilgiler web arayüzünde görüntülenebilir.
Yaprak Kar Tanesi
Snowflake, Twitter tarafından sağlanan açık kaynaklı bir dağıtılmış kimlik oluşturma algoritması. 64-bit uygulamaya dayalı olarak, aşağıdaki şekil Snowflake algoritmasının ID kompozisyon diyagramını göstermektedir.
Bu şekilde, zaman + makine numarası + kendi kendine artan kimlik kombinasyonu ile tamamen dağıtılmış bir kimlik çıkışı gerçekleştirilir.
Burada Leaf, Java sürümünün uygulanmasını sağlar ve aynı zamanda ZooKeeper tarafından oluşturulan makine numarasına zayıf bir bağımlılık işlemi yapar, ZooKeeper bir sorun yaşasa bile, hizmeti etkilemeyecektir. Leaf, workerID'yi ZooKeeper'dan ilk kez aldıktan sonra, yerel dosya sisteminde bir workerID dosyasını önbelleğe alır. ZooKeeper ile ilgili bir sorun olsa ve makine yeniden başlatılıyor olsa bile, hizmetin normal çalışması garanti edilebilir. Bu şekilde, üçüncü taraf bileşenlerine olan zayıf bağımlılık, SLA'yı bir dereceye kadar iyileştirmiştir.
gelecek planı
Sayı segmenti yüklemesinin optimizasyonu: Leaf yeniden başlatıldıktan sonraki ilk istek MySQL'i eşzamanlı olarak yükleyecektir.Hizmetin yükleme numarası segmentini başlatmak yerine bunu yapmanın nedeni, MySQL'deki Leaf Key'in mutlaka Leaf servis düğümüne ait olmamasıdır. Yükleme, her bir Yaprak düğümü tüm Yaprak Anahtarlarını başlatıp yüklüyorsa, çok sayıda sayı segmenti israfına neden olacaktır. Bu nedenle, gelecekte Leaf hizmeti kapatıldığında, bu hizmet düğümü tarafından geçen gün kullanılan yaprak anahtar listesi yedeklenecek, böylece anahtar listesindeki sayı segmenti yeniden başlatıldıktan sonra MySQL'den önceden yüklenecektir.
Monotonik artış: Basit yol, kimliğin aynı anda bir Leaf hizmet düğümünden ve aynı Leaf Key'den elde edilmesini ve artışın garanti edilebilmesini sağlamaktır. Dikkat edilmesi gereken sorun, Leaf servis düğümü değiştirildiğinde, eski Leaf servisi tarafından kullanılan sayı segmentinin atılması gerektiğidir. Yönlendirme mantığı, her bir Yaprak Anahtarı için etkin / bekleme modeli veya yönlendirme tablosu yapılandırması kullanılarak uygulanabilir.
Açık kaynak hakkında
Dağıtılmış kimlikler oluşturmanın birçok yolu vardır. Leaf'in açık kaynak sürümü iki kimlik oluşturma yöntemi sağlar:
Okuyucular, gerektiğinde iş senaryolarına uyan kimlik dağıtım yöntemini seçebilirler. Umarım Meituan'ın planı size biraz yardım edebilir ve umarım birlikte iletişim kurabilir ve birlikte inşa edebilirsiniz.
Leaf projesinin Github adresi: https://github.com/Meituan-Dianping/Leaf.
Herhangi bir sorunuz veya sorununuz varsa, lütfen Github sorunlarını gönderin.