Nedir (php) 2 tür değişkenlere dayalı ağırlıklı rastgele seçim uygulamak için en iyi yolu?

4 Cevap php

Temelde benim ikilem bu. Ben x sunucuları barındıran dosyaların bir listesi var. Sitenin mysql db ve uygulamayı barındıran başka bir sunucu var. Bir dosya (önyüz sunucu) yüklenir, uygulama üzerinde en özgür alanı olan sunucu görmek için denetler ve orada dosyası taşır. Eğer boş alan aynı miktarda 2 + boş sunucular ile başladı gayet iyi çalışır. Eğer mevcut sunucular daha fazla boş alana sahip olacak bir sonraki noktada karışımı içine başka bir sunucu .... tanıtmak ise tüm yeni dosyaları yeni sunucuya elusively yüklenecektir, çünkü bu yöntem aşırı hangi, o kadar etkili değildir ücretsiz alan bakımından kutuları geri kalanı ile yetişmeden kadar bu yeni trafik çoğu işleme olacağından.

Yani dosyaların dağıtımını normale yardımcı olacak, hem de bir ağırlıklandırma sistemi tanıtmak düşündüm. 3 sunucuları% 33 her set ve 1 sunucu anlamlı olarak daha fazla boş alan vardır Yani, yine (aynı ağırlığa sahip olsa bile) diğer sunuculara daha fazla yüklenenler alacağı, ama yükü tüm yayılmış olacaktır sunucular.

Herkes bu iyi bir php-sadece uygulanmasını önerebilirsiniz?

4 Cevap

Bir yaklaşım (yani mevcut alan ancak dosyayı tutmak için yeterli değildir ile bir sunucu açıkça hariç olacaktır) dosyayı tutmak için alana sahip sunucuları üzerinde tüm kullanılabilir alanı toplamak olacaktır. Sonra her sunucu (yani, yeni bir sunucu nispeten daha büyük bir yüzdesini oluşturmaktadır olurdu) için hesapları alan yüzdesini belirler. Rastgele bir sayı kullanmak ve almak için hangi sunucu belirlemek için yüzdeleri ile aynı hizaya getirin.

Örneğin, aşağıdaki boş alan seviyeleri ile beş sunucuları bulundurun:

Server 1:   2048MB
Server 2:  51400MB
Server 3:   1134MB
Server 4: 140555MB

Bir 1500MB dosya saklamak gerekir. Bu 194003MB toplam boş alan bize bırakarak, çalışan dışarı Sunucu 3 bayıltır.

Server 1:  1.0%
Server 2: 26.5%
Server 4: 72.5%

40: Daha sonra 0 ile 100 arasında rastgele bir sayı seçin

Numbers between 0 and 1 (inclusive) would go to Server 1
Numbers > 1 and <= 26.5 would go to Server 2
Numbers > 26.5 and <= 100 would go to Server 4

Yani bu durumda, 40 o Sunucu 4 saklanan alır demektir.

Trafik dengeleme genellikle çok önemlidir. Sadece bir olarak, (senin dediğin gibi, yeni sunucu hala diğerlerinden daha aşırı olacaktır, rağmen) onu dengelemek ya da bir sunucu arka arkaya iki kez çarpınca asla diğer bazı alternatif yöntemi ağırlıklandırma sistemi çeşit ekleyebilirsiniz örnek.

Ama muhtemelen yapay onlar birinden diğerine içerik taşıyarak birbirine neredeyse eşit konum böylece sunucular veri dengelemek, ve sonra orijinal veya ağırlıklı / alternatif algoritma normal işini yapsın düşünüyorum.

Bu bir php-sadece uygulama değil, ama sadece bazı fikirler dikkate.

Bunu uygulamak için bir yolu şudur:

  1. , Tüm boş alanı bir dizi oluşturmak bir fraksiyonu olarak, senin durumunda {0.5, 0.5, 1.0}
  2. Ilk dizide temsil edildiği gibi, alan toplam miktarına bölünmesiyle sunucusu alan miktarını - - ağırlıkları bir ikinci dizi oluşturma {0.25, 0.25, 0.5}
  3. 1.0 * mt_rand arayarak (0.0,1.0) normalize rastgele bir sayı, Get () / mt_getmaxrand ()
  4. Aşağıdaki döngü çalıştırın:

    $total_weight = 0.0;
    for ( $i = 10; $i <= sizeof($weights); $i++) {
      $total_weight += #weights[$i];
      if($rand <= $total_weight) {
    return $i;
      }
    }
    

Döndürülen değer sunucunun endeksi

Muhtemelen beklenenden daha büyük bir sorun alanı - Sen distributed filesystems dünyasına girdik.

Iş / Bir çok araştırma, bu alanda yapılmıştır. Sen MogileFS gibi mevcut bir çözümü kullanarak, ya da, en azından, (henüz yanı sıra karşılaşmadım sorunları) onlar karşılaştığınız problemleri nasıl çözdüklerini biraz araştırma yapıyor düşünmelisiniz

Eğer bir sunucu kaybederseniz, tüm dosyaları üzerinde kayıp değil ki aslında, her dosyanın en az 2 kopya saklamak olmamalı: Ben "henüz karşılaşmadım sorunları" ile ne demek bir örnek için o? Bunu yapmaya başladığınızda Tabii ki, sen bir performans kazancı için, aynı anda birden çok sunucu tek bir dosya parçalarını okumak mümkün olmamalı? Ve tabii ki, artık dosyaları dağıtılır nasıl anlamaya var, yeni bir sunucu vs vs, çevrimiçi geldiğinde nasıl bir sunucu başarısız olduğunda re distrubuted olsun ..

Bu doğru yapıyor karmaşıktır. Bunu önlemek için eğer tekerleği yeniden icat etmeyin. Ve tekerleği yeniden icat etmek varsa, en az diğer insanların onların nasıl inşa bakarak biraz zaman harcamak.