Soru PHP'de Dağıtılmış Bir Sistemin Anatomisi


İdeal bir çözüm bulmak için bana biraz zaman ayırmakta zorlandığım bir problemim var ve daha iyi açıklamak gerekirse, senaryonumu burada ifşa edeceğim.

Emir alacak bir sunucum var   birkaç müşteriden. Her müşteri olacak   bir dizi yinelenen görev göndermek   bazı belirtilmelidir   aralıklar, ör .: müşteri A görev teslim eder   Her biri idam edilmeli AA   2009-12-31 arası ve   2010-12-31; öyleyse matematiğim doğruysa   Bu yaklaşık 525 600 işlem bir   yıl, daha fazla müşteri ve görev verildi    sunucunun tüm bu görevleri işlemesine izin vermek mümkün olmaz yani ben   işçi fikri ile geldi   makineleri. Sunucu geliştirilecek   PHP'de.

İşçi makineleri sadece normal ucuz    Windows tabanlı ben yapacağım bilgisayarlar   evimde veya işyerlerimde ev sahibi,   her işçi adanmış olacak   İnternet bağlantısı (dinamik IP'lerle)   ve elektrik kesintilerinden kaçınmak için bir UPS. Her   işçi ayrıca sunucuyu her sorgulayacak   Web servis çağrıları ile 30 saniye   Bir sonraki bekleyen işi getir ve işle.   İş bittikten sonra işçi   çıktıyı sunucuya gönderin ve isteyin   yeni bir iş ve böylece sonsuza dek. Eğer   sistemi ölçeklendirmeye ihtiyaç var   sadece yeni bir işçi kurmalı ve   her şey sorunsuz bir şekilde çalışmalı.   Çalışan müşteri geliştirilecek   PHP veya Python'da.

Herhangi bir zamanda müşterilerim olmalıdır   sunucuya giriş yapabilir ve kontrol edebilir   sipariş ettikleri görevlerin durumu.

İşte buradaki zor kısım şu şekilde başladı:

  • Yeniden inşa edebilmeliyim Bazıları için zaten işlenmiş görevler Sunucunun çökmesine sebep olur.
  • İşçiler müşteriye özgü değiller. bir işçi belirli sayıda müşteri.

İle ilgili bazı şüphelerim var genel veritabanı tasarımı ve hangi teknolojileri kullanacaksınız.

Aslında birkaç tane kullanmayı düşündüm SQLite veritabanları ve hepsini sunucuya katmakla kalıyorum, ancak iş raporlarını oluşturmak için istemciler tarafından nasıl gruplandırılacağımı anlayamıyorum.

Asla aşağıdaki teknolojilerden hiçbiriyle çalışmadım: memcached, CouchDB, Hadoop ve tüm bunlar gibi, ama bunlardan herhangi birinin benim sorunum için uygun olup olmadığını bilmek istiyorum ve eğer yeni bir kullanıcı için tavsiye ederseniz, benim gibi “dağıtılmış bilgi” (veya bu paralel mi?). Çalışanların dinamik IP'leri olduğunu unutmayın.

Daha önce de söylediğim gibi, genel veritabanı tasarımı konusunda da sorun yaşıyorum, çünkü hala belirli bir R (D) DBMS'yi seçmedim, fakat benim ve benim seçtiğim DBMS için agnostik olduğunu düşündüğüm bir sorun göre kuyruk sistemi... Yapmalımıyım Tüm mutlak zaman damgalarını belirli bir işe önceden hesaplar ve büyük bir zaman damgası kümesi vardır., onları aşağı yukarı sırayla tamamlayın ve işaretleyin ya da daha akıllı bir sisteme sahip olmalıyım.zaman damgası modülü 60 == 0 -> yürütüldüğünde"Bu" akıllı "sistemle ilgili sorun şu ki bazı işler sırayla idam edilmeyecek Çünkü bazı işçiler, başkaları aşırı yüklenirken hiçbir şey yapmadan bekleyebilirlerdi. Sen ne önerirsin?

Not: Bu sorunun başlığı ve etiketleri sorunumu ve ne yapmaya çalıştığımı doğru şekilde yansıtıp yansıtmadığından emin değilim; değilse, lütfen buna göre düzenleyin.

Girdiniz için teşekkürler!

@timdev:

  1. Giriş çok küçük bir JSON kodlanmış dizgedir, çıktı ayrıca bir JSON sınanmış dize, ancak biraz daha büyük (1-5 KB sırasına göre) olacaktır.
  2. Çıktı, Web'deki mevcut çeşitli kaynaklar kullanılarak hesaplanacak, böylece ana darboğaz muhtemelen bant genişliği olacaktır. Veritabanı yazarları da bir olabilir - R (D) DBMS'ye bağlı olarak.

26
2017-10-04 17:44


Menşei


İyi, oldukça detaylı bir soru, ama daha fazla ayrıntı yardımcı olacaktır. Özellikle: 1) Her bir görevin girdileri ve çıktıları nasıl görünür? Örneğin, her bir atomik görev, büyük bir veri kümesine, sadece birkaç parametreye veya arada bir şeylere erişmeye mi ihtiyaç duyacaktır? 2) Darboğazların nerede olacağını düşünüyorsunuz? Bellek, işlemci, veritabanı okuyor veya yazıyor vb. - timdev
@timdev: Teşekkürler, düzenlememi kontrol et. - Alix Axel
iyi soru! Veritabanı sorunuzla ilgili değil: yapılandırılan aralıktan daha uzun süren uzun işlere dikkat edin. Bu durumda bir kilit mekanizmasının olması şarttır. - Brian Clozel
@Brian C: Teşekkürler, bu benim soruda açıklanan "akıllı" kuyruk sistemi ile çatlamak için zor bir sorundur, eğer birisi başka bir alternatif varsa lütfen bana bildirin. - Alix Axel


Cevaplar:


Yeniden yaratmanın eşiğinde gibisin Gearman. İşte Gearman için giriş:

Gearman genel bir uygulama sağlar   çalışma dışarı diğer çiftlik   daha iyi makineler veya süreçler   işi yapmak için uygun. Size izin veriyor   paralel çalışmak, yüklemek   dengesini işleme ve aramak   diller arasında işlevler. Olabilir   çeşitli uygulamalarda kullanılır,   yüksek kullanılabilirlikli web sitelerinden   veritabanı çoğaltmanın taşınması   olaylar. Başka bir deyişle,   dağıtılan için sinir sistemi   işleme iletişim kurar.

Hem istemci hem de arka uç işçi kodunu PHP'de yazabilirsiniz.


Windows için derlenmiş bir Gearman Server ile ilgili sorunuzu yanıtlayın: Windows için önceden oluşturulmuş temiz bir paket içinde mevcut olduğunu sanmıyorum. Gearman hala oldukça genç bir projedir ve Windows için hazır dağıtım üretme noktasında olgunlaşmamış olabilir.

Sun / MySQL çalışanları Eric Day ve Brian Aker bir öğretici Temmuz 2009'da OSCON'da Gearman için, ancak onların slaytları sadece Linux paketlerinden bahsediyor.

İşte Perl CPAN Testleri projesinin bir bağlantısıdır, bu da Gearman-Server'ın Microsoft C derleyicisini kullanarak Win32 üzerinde oluşturulabileceğini gösterir.cl.exe) ve testleri geçiyor: http://www.nntp.perl.org/group/perl.cpan.testers/2009/10/msg5521569.html  Ama sanırım kaynak kodunu indirip kendin yapmalısın.


15
2017-10-05 00:20



Gearman güzel görünüyor, ancak işçilerim dinamik IP'lere sahipler ve Gearman'la birlikte nasıl çalışacağından emin değilim. - Alix Axel
Dahilise, yerel bir DNS sunucusu kullanın. Hariciyse, dyndns.com'u kullanın. - Bill Karwin
Teşekkürler, Windows için derlenmiş bir Gearman sunucusunun var mı? - Alix Axel
Ben sadece sorunu okudum ve dişli çarkı önermek üzereydim. + 1 sizin için. - Corey Ballou
Ayrıca, dinamik IP'ler konusunda, Bill'in önerisini takip edin ve her çalışanın dyndns.com'u kullanmasını sağlayın, böylece web adreslerini dinamik IP adresleriyle eşleştirebilirsiniz. Bu çözümü her zaman SSH ve SVN için evde kullanıyorum, böylece her zaman uzaktan bağlanabiliyorum. - Corey Ballou


Gearman Bu senaryo için mükemmel bir aday gibi görünüyor, hatta ne kadar bilgi işlem gücüne gereksinim duyduğunuza bağlı olarak, windows makinelerini makine başına birden çok çalışan düğümüne sanallaştırmak isteyebilirsiniz.

Ayrıca kalıcı kuyruk sistemi Gearman'da, bir çalışan veya dişli kutusu sunucusu çöktüğünde işlerin kaybolması önlenir. Bir hizmetin yeniden başlatılmasından sonra kuyruk sadece çökme / yeniden başlatmadan önce kaldığı yerden devam eder, uygulamanızda tüm bunlara dikkat etmeniz gerekmez ve bu büyük bir avantajdır ve zaman / koddan tasarruf sağlar.

Özel bir çözüm üretmek işe yarayabilir, ancak özellikle sürekli sıradaki vitesin avantajları bana şu an için en iyi çözüm olabilir. Gearman için bir windows ikili hakkında bilmiyorum ama mümkün olabileceğini düşünüyorum.


4
2017-10-13 23:58



+1, Girişiniz için teşekkürler, her işçinin benzersiz bir IP adresine sahip olması gerekir, böylece sanallaştırma makineleri burada mümkün değildir. - Alix Axel
Belki de kalıcı sıra burada bir hayat kurtarıcıdır. Aslında Bill'in aslında dişli çarkı gibi bir şey yarattığını söylediği için, onu neden kullanmıyorsunuz, işi istediğiniz gibi sığmıyor olabilir, ancak bazı küçük ince ayarlarla ve doğru bir sunucu / ağ kurulumuyla ciddi bir şekilde dağıtılmış bilgi işlem için kapatılmalı. - ChrisR


Daha basit bir çözüm, birden çok php-düğümüne bağlı tek bir veritabanına sahip olmaktır. Uygun bir RDBMS kullanırsanız (MSql + InnoDB yapar), bir tablonun sıra olarak davranmasını sağlayabilirsiniz. Her bir işçi, daha sonra üzerinde çalışacak ve işlemleri tamamlayarak, senkronize etmek için kilitleme yaparak kilitleme yaparak veritabanına geri yazacaktır. Bu giriş / çıkış verilerinin büyüklüğüne bağlıdır. Büyükse, bu en iyi program olmayabilir.


3
2017-10-05 07:00



Giriş / çıkış verileri oldukça küçük olacaktır, ancak sunucu aşağı inerse, tek bir hata noktası (ana MySQL) veritabanı olduğundan, zaten işlenmiş verileri yeniden yapılandıramıyorum. - Alix Axel
Verileri kaybedebileceğiniz her zaman bir yer vardır. Kısmen işlenmiş verileri neden yeniden yapılandırmak istiyorsunuz? İşlerin herhangi bir yan etkisi var mı? - troelskn
Hayır, sunucularla kötü bir şansım vardı ve aynı hatayı tekrar yapmak istemiyorum. Ayrıca, veritabanı için yalnızca bir sunucu kullanmak, işçilerin sayısı yüksekse, çalışmayı sıcak yapabilir. - Alix Axel
Bana erken optimizasyon gibi geliyor. - troelskn


Küçük uygulamalar için çok harika bir veritabanı olmasına rağmen, bu tür bir görev için sqlite'i engellerdim, eşzamanlılığı çok iyi idare etmez, tüm veritabanını kilitlemek ve bir sinlge işlemine kadar kilitli tutmak için tek bir kilitleme stratejisine sahiptir. tamamlandı.

Endüstriyel mukavemet eşzamanlılığı ve kilit yönetimine sahip Postgres'i düşünün ve birden fazla simultane işlemi çok güzel bir şekilde ele alabilir.

Ayrıca bu, kuyruk için bir iş gibi geliyor! Java dünyasında olsaydınız, çözümünüz için JMS tabanlı bir mimari önerisi öneririm. PHP'de benzer bir şey yapmak için bir 'dropr' projesi var ama hepsi oldukça yeni, bu yüzden projeniz için uygun olmayabilir.

Kullandığınız teknoloji ne olursa olsun, çalışan işçilerin, merkezi bir sürecin işçileri seçmek için görevler tahsis ettiği bir “komuta ekonomisi” değil, mümkün olduğu kadar hızlı bir şekilde “işlerini” mümkün olduğu kadar “serbest piyasa” çözümüne yönlendirmelisiniz.


3
2017-10-15 01:56



Girişinizden dolayı teşekkür ederim, daha önce de söylediğim gibi tek bir DB sunucusuna sahip olmak istemiyorum ama dropr projesi harika görünüyor. Tekrar teşekkürler! - Alix Axel


Bir ana sunucu ve birkaç çalışanın kurulumu sizin durumunuza doğru görünüyor.

Ana sunucuda MySQL'i kurarım (Percona InnoDB sürümü) istikrarlı ve hızlı) master-master çoğaltmada, tek bir hata noktanız olmayacak. Ana sunucu, işçilerin her N saniyede çekeceği bir API'ye ev sahipliği yapacak. Master, bir işin mevcut olup olmadığını kontrol edecektir, eğer varsa, işçinin X işçisine atandığını işaret etmeli ve uygun girdiyi işçiye iade et (tüm bunları HTTP üzerinden). Ayrıca, işçilerin tüm senaryo dosyalarını burada saklayabilirsiniz.

İşçiler üzerindeLinux dağıtımını yüklemenizi şiddetle öneririm. Linux'ta programlanmış görevleri ayarlamak daha kolaydır ve genel olarak iş için daha uygun olduğunu düşünüyorum. Linux ile mükemmel yapılandırılmış bir çalışanla canlı bir cd veya iso görüntüsü oluşturabilir ve istediğiniz tüm makinelere hızlı ve kolay bir şekilde yükleyebilirsiniz. Ardından, komut dosyalarını güncelleştirmek / değiştirmek için ana sunucuyla RSync oluşturacak bir cron işi kurun. Bu sayede dosyaları tek bir yerde (ana sunucu) değiştirecek ve tüm çalışanlar güncellemeleri alacak.

Bu konfigürasyonda, çalışanların ustaya bağlanması nedeniyle IP'leri veya işçi sayısını umursamazsınız, tersi değil.

İşçi işi oldukça kolaydır: bir iş için API isteyin, yapın, sonuçları API yoluyla geri gönderin. Durulayın ve tekrar :-)


3
2017-10-17 04:20





Kuyruk tekerleğini SQL üzerinden yeniden icat etmek yerine, mesajlaşma sistemini kullanabilirsiniz. RabbitMQ veya ActiveMQ Sisteminizin çekirdeği olarak. Bu sistemlerin her biri AMQP protokolünü sağlar ve sabit disk destekli kuyruklara sahiptir. Sunucunuzda, programınıza göre yeni işleri bir "çalışan" kuyruğuna iten ve bir "sonuç" kuyruğundaki sonuçları veritabanına yazan (veya başka bir şekilde hareket eden) bir başka uygulamanız vardır.

Tüm çalışanlar RabbitMQ veya ActiveMQ'ya bağlanır. İşi iş kuyruğundan çıkarırlar, işi yaparlar ve cevabı başka bir kuyruğa sokarlar. Bunu yaptıktan sonra, orijinal iş isteğini "işini bitirdi" demek için ACK'lar. Bir çalışan bağlantıyı bırakırsa, iş başka bir çalışanın bunu yapabilmesi için sıraya geri yüklenir.

Kuyruktan başka her şey (iş tanımları, müşteri detayları, tamamlanmış çalışma) veritabanında saklanabilir. Ama gerçek zamanlı bir şey başka bir yere konulmalıdır. Kendi çalışmamda, canlı güç kullanım verilerini aktarıyorum ve veri tabanına isabet eden pek çok insanın bunu sorgulamak kötü bir fikir. Ya sahibim sistemimde canlı veriler hakkında yazdım.


2
2017-10-19 03:06



Evet, bu kesinlikle bir kuyruk problemi. (Görmek: Rekabetçi Tüketiciler). Sistemimde aynı sorun vardı ve bu seçilen çözüm. - Fabio Marreco


Bence bir ana iş dağıtıcısı ve işçileriyle doğru yöne gidiyorsunuz. Onları HTTP üzerinden iletişim kurardım.

Komut dosyalarını çalıştırmak için yetenekleri olduğu için C, C ++ veya Java'yı istemciler olarak seçerim (C'deki execvp, System.Desktop.something Java). İşler sadece bu komut dosyasının bir betiğinin ve argümanlarının adı olabilir. Müşterilerin işlerde bir durum döndürmesini sağlayabilirsiniz. İşler başarısız olursa bunları tekrar deneyebilirsiniz. Müşterilerin her dakika iş için anket yapmasını sağlayabilirsiniz (ya da her x saniyede bir sunucuyu işlerin sıralamasını yap).

PHP sunucu için çalışacaktı.

MySQL veritabanı için iyi çalışırdı. İki zaman damgası yapardım: başla ve bitir. Sunucuda, WHEN SECONDS == 0'ı arardım


1
2017-10-04 18:43



Teşekkürler, lütfen düzenlenmiş sorularımı kontrol edin. - Alix Axel