Tarantool Data Grid'in mimarisi ve yetenekleri

Tarantool Data Grid'in mimarisi ve yetenekleri

2017 yılında Alfa-Bank'ın yatırım işinin işlemsel çekirdeğini geliştirmek için bir yarışmayı kazandık ve çalışmaya başladık (HighLoad++ 2018'de yatırım işinin özü hakkında bir raporla) hareket Vladimir Drynkin, Alfa Bank'ın yatırım işinin işlem merkezi başkanı). Bu sistemin farklı kaynaklardan gelen işlem verilerini çeşitli formatlarda toplaması, verileri birleşik bir forma getirmesi, saklaması ve erişim sağlaması gerekiyordu.

Geliştirme süreci sırasında sistem gelişti ve işlevsellik kazandı ve bir noktada, kesin olarak tanımlanmış bir dizi görevi çözmek için oluşturulmuş uygulama yazılımından çok daha fazlasını kristalize ettiğimizi fark ettik: başardık Kalıcı depolamaya sahip dağıtılmış uygulamalar oluşturmaya yönelik sistem. Kazandığımız deneyim yeni bir ürünün temelini oluşturdu - Tarantool Veri Izgarası (TDG).

TDG mimarisinden ve geliştirme sürecinde ulaştığımız çözümlerden bahsetmek, size ana işlevleri tanıtmak ve ürünümüzün nasıl eksiksiz çözümler oluşturmanın temeli olabileceğini göstermek istiyorum.

Mimari olarak sistemi ayrı bölümlere ayırdık. ролиHer biri belirli bir dizi sorunu çözmekten sorumludur. Çalışan tek bir uygulama örneği, bir veya daha fazla rol türünü uygular. Bir kümede aynı türde birden fazla rol olabilir:

Tarantool Data Grid'in mimarisi ve yetenekleri

Bağlayıcı

Bağlayıcı dış dünyayla iletişimden sorumludur; Görevi, isteği kabul etmek, ayrıştırmak ve bu başarılı olursa verileri işlenmek üzere giriş işlemcisine göndermektir. HTTP, SOAP, Kafka, FIX formatlarını destekliyoruz. Mimari, yeni biçimler için kolayca destek eklemenizi sağlar; IBM MQ desteği de yakında sunulacaktır. İsteğin ayrıştırılması başarısız olursa bağlayıcı bir hata döndürür; aksi takdirde, daha sonraki işlemler sırasında bir hata meydana gelse bile, isteğin başarıyla işlendiği yanıtını verecektir. Bu, özellikle isteklerin nasıl tekrarlanacağını bilmeyen veya tam tersine bunu çok ısrarla yapan sistemlerle çalışmak için yapıldı. Verileri kaybetmemek için bir onarım kuyruğu kullanılır: nesne önce ona girer ve ancak başarılı bir işlemden sonra ondan kaldırılır. Yönetici, onarım kuyruğunda kalan nesneler hakkında uyarı alabilir ve bir yazılım hatasını veya donanım arızasını giderdikten sonra yeniden deneyebilir.

Giriş işlemcisi

Giriş işlemcisi, alınan verileri karakteristik özelliklerine göre sınıflandırır ve uygun işlemcileri çağırır. İşleyiciler, korumalı alanda çalışan Lua kodudur, dolayısıyla sistemin işleyişini etkileyemezler. Bu aşamada veriler istenilen forma indirgenebilir ve gerekirse gerekli mantığı uygulayabilecek isteğe bağlı sayıda görev başlatılabilir. Örneğin Tarantool Data Grid üzerine kurulu MDM (Master Data Management) ürününde, yeni bir kullanıcı eklerken, isteğin işlenmesini yavaşlatmamak adına, altın kayıt oluşturulmasını ayrı bir görev olarak başlatıyoruz. Korumalı alan, veri okuma, değiştirme ve ekleme isteklerini destekler, depolama türünün tüm rolleri üzerinde bazı işlevler gerçekleştirmenize ve sonucun toplanmasına (haritalama/azaltma) olanak tanır.

İşleyiciler dosyalarda açıklanabilir:

sum.lua

local x, y = unpack(...)
return x + y

Ve sonra konfigürasyonda bildirildi:

functions:
  sum: { __file: sum.lua }

Neden Lua? Lua çok basit bir dildir. Deneyimlerimize göre insanlar bunu öğrendikten birkaç saat sonra sorunlarını çözen kod yazmaya başlıyorlar. Ve bunlar sadece profesyonel geliştiriciler değil, örneğin analistler. Ayrıca jit derleyicisi sayesinde Lua çok hızlı çalışıyor.

Depolama

Depolama kalıcı verileri saklar. Kaydetmeden önce veriler, veri şemasına göre doğrulanır. Devreyi tanımlamak için genişletilmiş bir format kullanıyoruz Apaçi Avro. Örnek:

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

Bu açıklamaya dayanarak Tarantula DBMS için otomatik olarak DDL (Veri Tanımlama Dili) oluşturulur ve GraphQL Veri erişimi şeması.

Eşzamansız veri çoğaltma desteklenir (eşzamanlı olanı ekleme planları vardır).

Çıkış işlemcisi

Bazen harici tüketicileri yeni verilerin gelişiyle ilgili bilgilendirmek gerekebilir; bunun için Çıkış işlemcisi rolü vardır. Veriler kaydedildikten sonra uygun işleyiciye aktarılabilir (örneğin, tüketicinin istediği forma getirmek için) ve ardından gönderilmek üzere bağlayıcıya aktarılabilir. Burada da bir onarım kuyruğu kullanılır: nesneyi kimse kabul etmezse yönetici daha sonra tekrar deneyebilir.

Ölçeklendirme

Bağlayıcı, giriş işlemcisi ve çıkış işlemcisi rolleri durum bilgisizdir; bu, istenen rol türü etkinken yeni uygulama örnekleri ekleyerek sistemi yatay olarak ölçeklendirmemize olanak tanır. Depolama yatay ölçeklendirme için kullanılır yaklaşım sanal paketler kullanarak bir kümeyi organize etmek. Yeni bir sunucu eklendikten sonra eski sunuculardaki paketlerin bir kısmı arka planda yeni sunucuya taşınır; bu, kullanıcılara şeffaf bir şekilde gerçekleşir ve tüm sistemin çalışmasını etkilemez.

Veri Özellikleri

Nesneler çok büyük olabilir ve başka nesneler içerebilir. Bir nesneyi tüm bağımlılıklarıyla birlikte tek bir sanal grupta depolayarak veri ekleme ve güncelleme konusunda atomiklik sağlıyoruz. Bu, nesnenin birden fazla fiziksel sunucuya "yayılmasını" önler.

Sürüm oluşturma desteklenir: Bir nesnenin her güncellemesi yeni bir sürüm oluşturur ve her zaman bir zaman dilimini alıp dünyanın o zaman nasıl göründüğünü görebiliriz. Uzun bir geçmişe ihtiyaç duymayan veriler için sürüm sayısını sınırlayabilir ve hatta yalnızca birini (en son sürümü) saklayabiliriz, yani belirli bir tür için sürüm oluşturmayı esasen devre dışı bırakabiliriz. Geçmişi zamana göre de sınırlayabilirsiniz: örneğin, belirli bir türdeki 1 yıldan daha eski tüm nesneleri silin. Arşivleme de desteklenmektedir: Belirtilen süreden daha eski olan nesneleri kaldırarak kümede yer açabiliriz.

görevler

İlginç özellikler arasında, görevleri bir programa göre, kullanıcının isteği üzerine veya programlı olarak sanal alandan başlatma becerisine dikkat etmek önemlidir:

Tarantool Data Grid'in mimarisi ve yetenekleri

Burada başka bir rol görüyoruz - koşucu. Bu rol durum bilgisizdir ve gerektiğinde bu role sahip ek uygulama örnekleri kümeye eklenebilir. Koşucunun sorumluluğu görevleri tamamlamaktır. Belirtildiği gibi sanal alandan yeni görevler oluşturmak mümkündür; depolama alanında bir kuyruğa kaydedilirler ve ardından koşucuda yürütülürler. Bu tür göreve İş denir. Ayrıca Görev adı verilen bir görev türümüz de var; bunlar, bir zamanlamaya göre (cron sözdizimini kullanarak) veya isteğe bağlı olarak çalışan, kullanıcı tanımlı görevlerdir. Bu tür görevleri başlatmak ve takip etmek için kullanışlı bir görev yöneticimiz var. Bu işlevselliğin kullanılabilmesi için zamanlayıcı rolünü etkinleştirmeniz gerekir; bu rolün bir durumu vardır, dolayısıyla ölçeklenmez, ancak bu gerekli değildir; aynı zamanda diğer tüm roller gibi, ustanın aniden reddetmesi durumunda çalışmaya başlayan bir kopyaya da sahip olabilir.

Logger

Başka bir role logger denir. Kümenin tüm üyelerinden günlükleri toplar ve bunların web arayüzü aracılığıyla yüklenmesi ve görüntülenmesi için bir arayüz sağlar.

Hizmetler

Sistemin hizmet oluşturmayı kolaylaştırdığını belirtmekte fayda var. Yapılandırma dosyasında, sanal alanda çalışan, kullanıcı tarafından yazılan bir işleyiciye hangi isteklerin gönderileceğini belirtebilirsiniz. Bu işleyicide örneğin bir tür analitik sorgu çalıştırabilir ve sonucu döndürebilirsiniz.

Hizmet yapılandırma dosyasında açıklanmıştır:

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

GraphQL API otomatik olarak oluşturulur ve hizmet çağrılmaya hazır hale gelir:

query {
   sum(x: 1, y: 2) 
}

Bu işleyiciyi arayacak sumsonucu döndürecek olan:

3

Sorgu Profili Oluşturma ve Metrikler

Sistemin işleyişini ve profil oluşturma isteklerini anlamak için OpenTracing protokolü desteğini uyguladık. Sistem, isteğin nasıl yürütüldüğünü anlamanıza olanak tanıyan Zipkin gibi bu protokolü destekleyen araçlara talep üzerine bilgi gönderebilir:

Tarantool Data Grid'in mimarisi ve yetenekleri

Doğal olarak sistem, Prometheus kullanılarak toplanabilecek ve Grafana kullanılarak görselleştirilebilecek dahili ölçümler sağlıyor.

Dağıtmak

Tarantool Data Grid, dağıtımdan veya Ansible'dan bir yardımcı program kullanılarak RPM paketlerinden veya bir arşivden dağıtılabilir; ayrıca Kubernetes desteği de vardır (Tarantool Kubernetes Operatörü).

İş mantığını uygulayan uygulama (konfigürasyon, işleyiciler), konuşlandırılan Tarantool Data Grid kümesine, kullanıcı arayüzü aracılığıyla bir arşiv biçiminde veya tarafımızdan sağlanan API aracılığıyla bir komut dosyası kullanılarak yüklenir.

Felsefenin ilkleri

Tarantool Data Grid kullanılarak hangi uygulamalar oluşturulabilir? Aslında çoğu iş görevi bir şekilde veri akışının işlenmesi, saklanması ve erişilmesiyle ilgilidir. Bu nedenle, güvenli bir şekilde depolanması ve erişilmesi gereken büyük veri akışlarınız varsa, ürünümüz size geliştirme süresinden büyük ölçüde tasarruf sağlayabilir ve iş mantığınıza odaklanabilir.

Örneğin, gelecekte en iyi teklifler hakkında bilgi sahibi olabilmek için emlak piyasası hakkında bilgi toplamak istiyoruz. Bu durumda aşağıdaki görevleri vurgulayacağız:

  1. Açık kaynaklardan bilgi toplayan robotlar veri kaynaklarımız olacak. Bu sorunu hazır çözümler kullanarak veya herhangi bir dilde kod yazarak çözebilirsiniz.
  2. Daha sonra Tarantool Data Grid verileri kabul edecek ve kaydedecektir. Farklı kaynaklardan gelen veri formatı farklıysa Lua'da tek bir formata dönüşümü gerçekleştirecek kodu yazabilirsiniz. Ön işleme aşamasında, örneğin mükerrer teklifleri filtreleyebilecek veya ek olarak piyasada çalışan acenteler hakkındaki bilgileri veritabanında güncelleyebileceksiniz.
  3. Artık bir kümede verilerle doldurulabilen ve veri seçimleri yapılabilen ölçeklenebilir bir çözümünüz zaten var. Daha sonra yeni işlevler uygulayabilirsiniz, örneğin veri talebinde bulunacak ve günde en avantajlı teklifi verecek bir hizmet yazabilirsiniz - bunun için yapılandırma dosyasında birkaç satır ve küçük bir Lua kodu gerekir.

Sırada ne var?

Önceliğimiz, kullanarak geliştirme kolaylığını artırmaktır. Tarantool Veri Izgarası. Örneğin bu, korumalı alanda çalışan profil oluşturma ve hata ayıklama işleyicilerini destekleyen bir IDE'dir.

Ayrıca güvenlik konularına da büyük önem veriyoruz. Şu anda, yüksek güvenlik düzeyini doğrulamak ve kişisel veri bilgi sistemleri ve devlet bilgi sistemlerinde kullanılan yazılım ürünlerinin sertifikasyon gereksinimlerini karşılamak için Rusya'nın FSTEC'inden sertifikasyon sürecinden geçiyoruz.

Kaynak: habr.com

Yorum ekle