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

HaProxy 1.8 - Прикрепление таблиц и передача вычисленных haproxy ставок в качестве заголовков запросов на бэкенд

Я прочитал эту статью о столах с палками: https://www.haproxy.com/blog/introduction-to-haproxy-stick-tables/

Я хотел бы добавить ограничение скорости в мою конфигурацию haproxy. Но прежде чем я захочу добавить жесткое ограничение, я хочу знать, сколько запросов делает каждый из моих клиентов, чтобы увидеть, каким будет хороший порог ограничения, и иметь возможность связаться с клиентами, превышающими этот лимит, прежде чем он будет добавлен как жесткий предел.

Мои серверы готовы хранить и регистрировать такую ​​информацию на индивидуальном уровне. Все, что мне нужно сделать на шаге 1, - это позволить haproxy передать следующие значения:

Я сделал следующую конфигурацию, которая выполняет свою работу:

(global, listen, default and frontend sections not relevant)

// # round robin balancing between the various backends
backend app
  # Bind the 3 stick-tables counting to 3 slots named track-sc0, -sc1 and -sc2
  http-request track-sc0 src table sticktable_st_src_http_req_rate
  http-request track-sc1 src table sticktable_st_src_conn_cur
  http-request track-sc2 src table sticktable_st_src_conn_rate

  # Save current values in variables to be able to parse them on to backends
  http-request set-var(req.http_req_rate) sc_http_req_rate(0)
  http-request set-var(req.conn_cur) sc_conn_cur(1)
  http-request set-var(req.conn_rate) sc_conn_rate(2)

  # Finally copy the variables into request headers for the real backends to read the values
  http-request set-header X-HaProxy-http_req_rate %[var(req.http_req_rate)]
  http-request set-header X-HaProxy-conn_cur      %[var(req.conn_cur)]
  http-request set-header X-HaProxy-conn_rate     %[var(req.conn_rate)]

  ...
  server localtest 192.168.1.130:80 check

backend sticktable_st_src_http_req_rate
  stick-table type ip size 1m expire 10s store http_req_rate(10s)

backend sticktable_st_src_conn_cur
  stick-table type ip size 1m expire 10s store conn_cur

backend sticktable_st_src_conn_rate
  stick-table type ip size 1m expire 10s store conn_rate(10s)

Несмотря на то, что это на самом деле делает свою работу, это становится немного беспорядочным, когда есть 3-5 бэкэнд-секций, которым все это нужно.

Другое дело, что это выглядит не очень умно, чтобы

1) определить три бэкэнда 2) использовать эти три бэкэнда в трех командах трека 3) скопировать их во временные переменные (потому что я не знаю, как анализировать их непосредственно в заголовки запроса 4) ссылаться на временные переменные при установке заголовков запроса.

Можно ли как-то сжать или упростить этот конфиг, чтобы он выглядел более сухим?

HaProxy версии 1.8

Спасибо

Если вы просто хотите взглянуть на значения таблицы стикеров, вы можете использовать Runtime API (гнездо stat): https://www.haproxy.com/blog/dynamic-configuration-haproxy-runtime-api/ и используйте команду "show table <table-name>".

Что касается вашей конфигурации:
1. Вам не нужно иметь отдельный столик для каждой фишки. Вы можете хранить все счетчики в одной таблице.
2. Вам не нужно использовать промежуточные переменные.

backend app
  # Enable counters tracking
  http-request track-sc0 src table sticktable_st_src_rates
  # Put counters in HTTP headers
  http-request set-header X-HaProxy-http_req_rate %[sc_http_req_rate(0)]
  http-request set-header X-HaProxy-conn_cur      %[sc_conn_cur(0)]
  http-request set-header X-HaProxy-conn_rate     %[sc_conn_rate(0)]

  ...
  server localtest 192.168.1.130:80 check

backend sticktable_st_src_rates
  stick-table type ip size 1m expire 10s store http_req_rate(10s),conn_cur,conn_rate(10s)