Я прочитал эту статью о столах с палками: 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)