Назад | Перейти на главную страницу

Как рассчитать вес раундробина HAProxy

Предположим, у меня есть две базы данных Redis, и я хочу распределять 70% запросов в DB1, а остальные 30% - в DB2. Как я могу рассчитать параметр веса?

global
  maxconn     20000
  log         127.0.0.1 local0
  user        haproxy
  chroot      /usr/share/haproxy
  pidfile     /run/haproxy.pid
  daemon

defaults REDIS
  mode tcp
  timeout connect  4s
  timeout server  30s
  timeout client  30s

listen stats 
  bind :9000 # Listen on localhost:9000
  mode http
  stats enable  # Enable stats page
  stats hide-version  # Hide HAProxy version
  stats realm Haproxy\ Statistics  # Title text for popup window
  stats uri /haproxy_stats  # Stats URI
  stats auth admin:123  # Authentication credentials

frontend ft_redis
  bind 127.0.0.1:5000 name redis
  default_backend bk_redis
backend bk_redis
  balance roundrobin
  option tcp-check
  tcp-check connect
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  tcp-check send info\ replication\r\n
  tcp-check expect string role:master
  tcp-check send QUIT\r\n
  tcp-check expect string +OK
  server redis_6379 localhost:7000 check inter 1s weight 179
  server redis_6380 localhost:7001 check inter 1s weight 77

weight имеет допустимый диапазон от 1 до 256 для каждого сервера, но вам не обязательно использовать 256 в качестве основы для расчета.

Вес каждого сервера - это отношение заявленного веса этого сервера к сумме всех заявленных весов, поэтому с двумя серверами вы можете просто использовать значения 30 и 70, и распределение будет таким, как вы ожидаете: 30 ÷ (30 + 70 ) = 0,3 и 70 ÷ (30 + 70) = 0,7. Сервер, который «весит больше», получает пропорционально больше запросов. Вы также можете использовать 3 и 7, 33 и 77 или комбинацию из диапазона 1–256.

Используемые вами значения, 77 и 179, должны дать аналогичные результаты, поскольку 77 ÷ (77 + 179) ≈ 0,3 и 179 ÷ (77 + 179) ≈ 0,7 ... просто сложнее произвести мысленный расчет. Сохранение вашей конфигурации таким образом, чтобы все веса складывались в общую сумму 100, - это более удобное для человека решение.