Soru Kullanılamıyorsa yedekleri kullan (sadece aşağı değil)


Haproxy'yi kullanarak şunu istiyorum:

  • Bir 'ana' sunucu ve 'yedekleme' sunucusu havuzu olmakla birlikte, bunların ayrı havuzlarda olması gerekmez.
  • Her arka ucun 'maxconn' değeri düşük (bu durumda 1)
  • Müşteriler kuyrukta beklememelidir. 'Ana' havuzda hemen kullanılabilir sunucu yoksa, "yedekleme" havuzuna gecikmeden şantaj yapılmalıdır.

Şu anda bir arka uçum var, 'ana' sunucular saçma bir şekilde yüksek bir ağırlığa sahip ve 'çalışıyor'.

acl use_backend + connslots doğru çizgileri boyunca ama yama kendi cevabımda mükemmel değil.

Değiştirilmiş bir haproxy ikili gerektirmeyen bonus puanları.


6
2017-07-05 14:38


Menşei


Yamalı bir haproxy çalıştırmanın neden bu kadar kötü olduğunu anlamıyorum; özel davranışa ihtiyacınız varsa, özel bir program elde edersiniz. - womble♦
Sadece yapmak zorunda kalmamayı tercih ettiğim bir şey daha var. Ayrıca, yamamın 'makul' olup olmadığı hakkında hiçbir fikrim yok. Bildiğim kadarıyla, her iki haftada bir bana vuracak olan ciddi bir bellek sızıntısı getirdim. Ben bir C coder :-) değilim - PriceChild
Bu yüzden doğru yapmak için bir C kodlayıcısı olan birini bulun. Bu şekilde, çözümünüzün yarısını almak için olağanüstü karmaşık uzunluklara gitmenize gerek kalmadan tam olarak ihtiyacınız olanı elde edersiniz. - womble♦


Cevaplar:


Doğru yol, ön uçta sunucudaki bağlantı miktarını kontrol eden bir ACL eklemek ve daha sonra buna dayalı bir karar vermektir.

Aşağıdaki yapılandırma "monitor_conns" ön ucunu kontrol edecek ve 500 veya daha fazla bağlantı varsa, "yedeklemeler" arka ucuna gönderilecek, aksi takdirde "normal" arka uca gidecektir.

İşte bir denenmemiş örnek:

frontend monitor_conns
  bind *:80
  acl too_many_conns fe_conn 500
  use_backend backups if too_many_conns
  default_backend regular

backend backups
  ... your config
  server backupsrv 192.168.0.101:80 check port 80 maxconn 1000 inter 1s rise 1 fall 1

backend regular
  ... your config
  server regularsrv 192.168.0.100:80 check port 80 maxconn 500 inter 1s rise 1 fall 1

Bu sadece bir örnek, ama nasıl devam edeceğiniz konusunda size bir fikir vermeli.


7
2017-07-06 23:33



Asla daha önce kullanmayı düşünmemiştim. Bu durumda, bence fe_conn Ön uçtaki toplam bağlantı sayısını ölçer. Bu tam olarak istediğim şey değil. (Yeni sunucular eklerken "mevcut konileri toplayabilirim ama bu yaklaşım bir sunucu aşağıya inerse başarısız olur" dedi. connslots istediğimi yapacağımı düşünüyorum. Bazı testlerden sonra size döneceğim! - PriceChild
Hmm lütfen sorularımı düzenle konusuna bakın, yakın ama tam orada değil. - PriceChild


Eski soru, ama aynı problemle karşılaşıyorum ve işte benim çözümüm:

Ön uç bağlantısını acl ile kontrol edebilir ve bunun için fazladan sunucuya sahip arka uç kullanabilirsiniz. ekstra sunucu Yedekleme sunucunuzu kastediyorum

Yani yapılandırma böyle görünecek

frontend frontend1 127.0.0.1:9200
    mode tcp
    acl max_conn_reached fe_conn gt 15
    acl production_almost_dead nbsrv(prod1) lt 2

    default_backend prod1
    use_backend prod1_and_prod2 if max_conn_reached OR production_almost_dead

backend prod1
    mode tcp
    balance leastconn
    server se_prod1 127.0.0.1:8001 check maxconn 10
    server se_prod2 127.0.0.1:8002 check maxconn 10

backend prod1_and_prod2
    mode tcp
    balance leastconn

    server se_prod1 127.0.0.1:8001 check maxconn 10
    server se_prod2 127.0.0.1:8002 check maxconn 10

    server se_backup1 127.0.0.1:8003 check maxconn 10
    server se_backup2 127.0.0.1:8004 check maxconn 10

Ön uç bağlantı 15'ten büyükse ön uç yedekleme sunucusunu (üretim sunucusuyla birlikte) kullanacaktır. veya backend1'deki bir hizmet reddedildi


5
2017-07-27 17:11





Aşağıdaki benim için çalışacak gibi görünüyor, ancak haproxy-1.4.15 / src / backend.c yama gerekli:

# diff haproxy-1.4.15/src/backend.c backend.c
1298a1299,1333
> /* set test->i to the number of enabled servers on the proxy */
> static int
> acl_fetch_connfree(struct proxy *px, struct session *l4, void *l7, int dir,
>                     struct acl_expr *expr, struct acl_test *test)
> {
>         struct server *iterator;
>         test->flags = ACL_TEST_F_VOL_TEST;
>         if (expr->arg_len) {
>                 /* another proxy was designated, we must look for it */
>                 for (px = proxy; px; px = px->next)
>                         if ((px->cap & PR_CAP_BE) && !strcmp(px->id, expr->arg.str))
>                                 break;
>         }
>         if (!px)
>                 return 0;
>
>         test->i = 0;
>         iterator = px->srv;
>         while (iterator) {
>                 if ((iterator->state & SRV_RUNNING) == 0) {
>                         iterator = iterator->next;
>                         continue;
>                 }
>                 if (iterator->maxconn == 0) {
>                         test->i = -1;
>                         return 1;
>                 }
>
>                 test->i += (iterator->maxconn - (iterator->cur_sess + iterator->nbpend));
>                 iterator = iterator->next;
>         }
>
>         return 1;
> }
>
1461a1497
>       { "connfree", acl_parse_int,   acl_fetch_connfree, acl_match_int, ACL_USE_NOTHING },

Sonra kullanabilirim connfree acl'mda:

frontend frontend1
    bind *:12345
    acl main_full connfree(main) eq 0
    use_backend backup if main_full
    default_backend     main

backend main
    balance leastconn
    default-server maxconn 1 maxqueue 1
    server main2 10.0.0.1:12345 check
    server main1 10.0.0.2:12345 check

backend backup
    balance leastconn
    default-server maxconn 1 maxqueue 1
    server backup1 10.0.1.1:12345 check
    server backup2 10.0.1.2:12345 check

Umarım mukayese acl_fetch_connfree() için acl_fetch_connslots() Değişikliği açık hale getirecek:

eski = (maxconn - geçerli konşer) + (maks. beklemedeki konçeler)

new = maxconn - (şu anki konç + beklemede olanlar)


1
2017-07-08 11:00



Bu "cevabı" dile getirmek bilinmeyen bir nedenden dolayı çok aptal değildir. (Ben bir C coder değilim) Daha iyi bir cevap almadıkça bunu kabul ediyorum ve ödül için alexandermensa ödülünü vereceğim. - PriceChild
Çözümünüz ilgi çekici ama ne yapmaya çalıştığınızı tam olarak anladığımdan emin değilim, bu yüzden size uygun bir çözüm sunmakta zorluk çektim (yama olmadan HAProxy olmadan). Üzgünüm daha yardımcı olamam. Ayrıca 'sıra' ve 'be_conn' ACL seçeneklerine de bakmak isteyebilirsiniz: Ara 7.5.1. içinde HAProxy 1.4 Belgesi - a1wca
Evet be_conn her şey yolunda ve iyi ama şu anda mevcut sunucuların sayısıyla kıyaslayamıyorum? Sıraya gelince, 0'a ayarlayamıyorum? - PriceChild
Aslında mevcut sunucuların sayısı için, tamsayı eşleştirmesi yapmanıza izin veren 'nbsrv (backend_name)' ACL seçeneği var: acl main_full nbsrv (ana) lt 1 veya acl main_full nbsrv (ana) eq 1. Ayrıca, birden çok ACL'yi de oluşturabileceğinizi unutmayın: acl main_full nbsrv (ana) eq 1 ve başka bir satırda: acl main_queue sıra (ana) eq 1 ve sonra yap main_full main_queue ise use_backend yedeği Bu temelde kullanacaktır yedek ACL'ler varsa arka uç main_full ve main_queue Doğrudur. Umarım bu mantıklıdır. - a1wca
Nbsrv ile ilgili sorun, "kullanılabilir" olarak serbest kuyruk yuvalarına sahip bir sunucuyu sayar olmasıdır. Her bağlantının mevcut bir sunucuya, tercihen varsa ana sunucuya gittiğinden emin olmak istiyorum. queue Bir bağlantının (bir kuyruk) her zaman kesileceğini ve geri kalanın yedek gruba yönlendirildiğini kabul edersem 'işe yarayabilir'. - PriceChild


arka uç bölümünde "yedek" parametresini kullanın

frontend my-frontend *:9091 #arbitrary name for the frontend
         maxconn 500
         default_backend my-backend

backend my-backend
        mode http
        option httpchk
        server solr-1 10.30.3.100:9091 weight 1 maxconn 500 check
        server solr-2 10.30.3.101:9091 weight 1 maxconn 500 check backup

solr-1, httpchk'yi başarısız olursa, solr-2 devralınır.


-1
2017-07-06 21:10



Yedeklemeler sadece ana sunucular 'aşağı' ise kullanılır. Tam bir bağlantı havuzuna sahip olsalar bile, hala 'yukarı' oluyorlar ve yeni bağlantılar başarısız oluyor. - PriceChild