Manastır → basit OTP küme yönetimi

Hemen hemen her başarılı iş uygulaması er ya da geç yatay ölçeklendirmenin gerekli olduğu bir aşamaya girer. Çoğu durumda yeni bir örnek başlatabilir ve yük ortalamasını azaltabilirsiniz. Ancak farklı düğümlerin birbirini tanımasını ve iş yükünü dikkatli bir şekilde dağıtmasını sağlamamız gereken daha az önemsiz durumlar da vardır.

Manastır → basit OTP küme yönetimi

O kadar şanslı çıktı ki ErlangHoş sözdizimi ve etrafındaki heyecan nedeniyle seçtiğimiz birinci sınıf bir içeriğe sahip dağıtılmış sistemler için destek. Teorik olarak bu tamamen önemsiz geliyor:

Farklı düğümlerdeki işlemler arasında ve ayrıca bağlantılar ve monitörler arasında ileti aktarımı şeffaftır […]

Pratikte her şey biraz daha karmaşıktır. Dağıtılmış Erlang "konteyner" nakliye için büyük bir demir kutu anlamına geldiğinde ve "liman işçisi" sadece liman işçisi ile eşanlamlı olduğunda geliştirildi. İÇİNDE IP4 çok sayıda boş adres vardı, ağ kesintileri genellikle kabloyu kemiren farelerden kaynaklanıyordu ve üretim sisteminin ortalama çalışma süresi onyıllarla ölçülüyordu.

Artık hepimiz inanılmaz derecede kendi kendine yeterliyiz, paketlenmişiz ve dağıtılmış halde çalışıyoruz Erlang Dinamik IP adreslerinin büyük rastgelelik ilkesine göre dağıtıldığı ve düğümlerin zamanlayıcının sol topuğunun isteğine göre görünüp kaybolabileceği bir ortamda. Dağıtılmış bir proje çalıştıran her projede standart kod yığınlarından kaçınmak için ErlangDüşman ortamıyla mücadele etmek için yardıma ihtiyaç vardır.

Dikkat: Var olduğunun farkındayım libcluster. Gerçekten harika, binden fazla yıldızı var, yazarı toplulukta ünlü ve hepsi bu. Bu paketin küme oluşturma ve sürdürme konusunda sunduğu yöntemler sizin için yeterliyse ne mutlu size. Maalesef çok daha fazlasına ihtiyacım var. Kurulumu ayrıntılı olarak kontrol etmek ve kümelenmenin yeniden düzenlenmesi sahnesinde dışarıdan bir seyirci olmak istemiyorum.

Gereksinimler

Kişisel olarak kümenin yönetimini üstlenecek ve aşağıdaki özelliklere sahip bir kütüphaneye ihtiyacım vardı:

  • Hem sabit kodlanmış bir düğüm listesiyle hem de hizmetler aracılığıyla dinamik keşifle şeffaf çalışma Erlang;
  • her topoloji değişikliği için tamamen işlevsel geri arama (oradaki düğüm, buradaki düğüm, ağ kararsızlığı, bölünmeler);
  • uzun ve kısa adlara sahip bir kümeyi başlatmak için şeffaf arayüz :nonode@nohost;
  • Altyapı kodu yazmaya gerek kalmadan kutudan çıktığı gibi Docker desteği.

İkincisi, uygulamayı yerel olarak test ettikten sonra :nonode@nohostveya yapay olarak dağıtılmış bir ortamda test_cluster_task, sadece koşmak istiyorum docker-compose up --scale my_app=3 ve herhangi bir kod değişikliği olmadan docker'da üç örneği nasıl çalıştırdığını görün. Ayrıca aşağıdaki gibi bağımlı uygulamalar da istiyorum mnesia - topoloji değiştiğinde, uygulamadan herhangi bir ek müdahaleye gerek kalmadan sahne arkasında kümeyi canlı olarak yeniden oluştururlar.

Manastır bir kümeyi desteklemekten kahve yapmaya kadar her şeyi yapabilen bir kütüphane olarak tasarlanmamıştı. Bu, olası tüm durumları kapsamayı amaçlayan sihirli bir değnek ya da teorisyenlerin söylediği anlamda akademik açıdan eksiksiz bir çözüm değildir. CS bu terime koyun. Bu kütüphane çok net bir amaca hizmet etmek üzere tasarlandı, ancak çok büyük olmayan işini de mükemmel bir şekilde yapıyor. Bu amaç, yerel kalkınma ortamı ile düşman konteynerlerle dolu dağıtılmış elastik ortam arasında tam şeffaflık sağlamak olacaktır.

Seçilen yaklaşım

Manastır bir uygulama olarak çalıştırılmak üzere tasarlanmıştır, ancak ileri düzey kullanıcılar kümenin montajı ve bakımı ile doğrudan çalıştırarak manuel olarak çalışabilirler. Cloister.Manager hedef uygulamanın denetleyici ağacında.

Bir uygulama olarak çalıştırıldığında kütüphane aşağıdakilere güvenir: config, buradan aşağıdaki temel değerleri okur:

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

Yukarıdaki parametreler kelimenin tam anlamıyla şu anlama gelir: Manastır OTP uygulaması için kullanılır :my_app, kullanır erlang hizmet keşfi düğümleri bağlamak için en az üç ve MyApp.Listener modül (uygulama @behaviour Cloister.Listener) topoloji değişiklikleriyle ilgili bildirimleri alacak şekilde yapılandırılmıştır. Tam konfigürasyonun ayrıntılı bir açıklamasını şu adreste bulabilirsiniz: belgeleme.

Bu yapılandırmayla uygulama Manastır irade aşamalı olarak başlatmak, ana uygulamanın başlatılması sürecini fikir birliğine varılana kadar geciktirir (yukarıdaki örnekte olduğu gibi üç düğüm birbirine bağlanır ve bağlanır). Bu, ana uygulamaya, başladığında kümenin zaten kullanılabilir olduğunu varsayma fırsatı verir. Topoloji değiştiğinde (düğümler tamamen eşzamanlı olarak başlamadığından çok sayıda olacaktır), işleyici çağrılacaktır. MyApp.Listener.on_state_change/2. Çoğu zaman bir durum mesajı aldığımızda bir eylem gerçekleştiririz %Cloister.Monitor{status: :up}, bunun anlamı: "Merhaba, küme toplandı."

Çoğu durumda kurulum consensus: 3 optimaldir çünkü daha fazla düğümün bağlanmasını beklesek bile geri arama gerçekleşecektir status: :rehashingstatus: :up yeni eklenen veya kaldırılan herhangi bir düğümde.

Geliştirme moduna başladığınızda, yalnızca ayarlamanız gerekir. consensus: 1 и Manastır gördüğünde küme toplanması için beklemeyi memnuniyetle atlayacak :nonode@nohost, veya :node@host, veya :[email protected] - düğümün nasıl yapılandırıldığına bağlı olarak (:none | :shortnames | :longnames).

Dağıtılmış Uygulama Yönetimi

Boşlukta olmayan dağıtılmış uygulamalar genellikle aşağıdakiler gibi dağıtılmış bağımlılıkları içerir: mnesia. Yeniden yapılandırmalarını aynı geri aramadan halletmemiz bizim için kolaydır on_state_change/2. Burada, örneğin, yeniden yapılandırmanın nasıl yapılacağına ilişkin ayrıntılı bir açıklama yer almaktadır. mnesia anında belgeleme Manastır.

Kullanmanın temel avantajı Manastır topoloji değişikliğinden sonra kümeyi yeniden oluşturmak için gerekli tüm işlemleri gerçekleştirmesidir kaputun altında. Uygulama, IP adreslerini ve dolayısıyla düğüm adlarını önceden bilmemize veya bunların dinamik olarak atanmasına/değiştirilmesine bakılmaksızın, tüm düğümlerin bağlı olduğu, önceden hazırlanmış bir dağıtılmış ortamda çalışır. Bu, kesinlikle hiçbir özel docker yapılandırma ayarı gerektirmez ve uygulama geliştiricisinin bakış açısından, dağıtılmış bir ortamda çalıştırmak veya yerel bir ortamda çalıştırmak arasında hiçbir fark yoktur. :nonode@nohost. Bununla ilgili daha fazlasını şurada okuyabilirsiniz belgeleme.

Her ne kadar topoloji değişikliklerinin karmaşık bir şekilde ele alınması özel bir uygulama yoluyla mümkün olsa da MyApp.Listener, bu kitaplık sınırlamalarının ve yapılandırma önyargılarının uygulamanın temel taşları olduğu ortaya çıkan uç durumlar her zaman olabilir. Tamam, sadece yukarıdakini al libcluster, bu daha genel amaçlıdır, hatta düşük seviyeli kümeyi kendiniz halledebilirsiniz. Bu kod kütüphanesinin amacı olası her senaryoyu kapsamak değil, gereksiz sıkıntı ve hantal kopyala-yapıştır olmadan en yaygın senaryoyu kullanmaktır.

Not: Orijinal metnin bu noktasında “Mutlu kümeleme!” ifadesi vardı ve çeviri yaptığım Yandex (sözlüklere kendim bakmama gerek yok) bana “Mutlu kümeleme!” seçeneğini sundu. Özellikle mevcut jeopolitik durum göz önüne alındığında, daha iyi bir çeviri hayal etmek belki de imkansızdır.

Kaynak: habr.com

Yorum ekle