вторник, 12 марта 2019 г.

HAproxy. Заметки и фишки. Fluentd, certbot

На проекте принимаем порядка 450 тыс коннектов в секунду. Это короткие соединения но их много. Встала задача расчитать и реагировать на время ответа системы, если оно больше 180 мс. Параметр Ta который помог бы в этом, доступен только в логах Haproxy, только в http-mode. Метрики, что снимаю Prometheus через haproxy-exporter не дают мне такой детализации.
Логи... Логи haproxy генерит примерно 10-20 ГБ в минуту. У меня их 10 штук в кластере.
Я не нашел ничего лучшего как сделать связку на каждой машине с FluentD + Haproxy.
В haproxy.cfg:
global
   log          localhost:5140 local0 info

frontend
    log-format "%ci:%cp [%tr] %f %b/%s %Th/%Ti/%TR/%Tw/%Tc/%Tr/%Ta %ST %B %ac/%fc/%bc/%sc/%rc %sq/%bq %{+Q}r %ID"

Идея в том, что бы логи гнать в fluentd через localhost, парсить сразу, создавать гистограммные бакеты и ждать пока прометей придет забрать метрики Ta а далее уже использовать прометеевскую встроенную функцию вычислять перцентиль и через графану показывать а через alertmanager реагировать на значение выше порогового.

td-agent.conf такой:


  @type syslog
  tag haproxy
  port 5140
  bind 127.0.0.1
  format /(?[^ ]+) haproxy\[(?.+)\]: (?[\w\.]+):(?\d+) \[(?.+)\] (?[\w\-]+) (?[\w-]+)\/(?[^ ]+) (?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+) (?\d+) (?\d+) (?\d+)\/(?\d+)\/(?\d+)\/(?\d+)\/(?\d+) (?\d+)\/(?\d+) "(?[^ "]+) (?[^\?]+)(\?.*)? (?[^"]*)" (?[^"]*)/
  time_format %H:%M:%S


# Tag our log types.

  @type rewrite_tag_filter
 
    key     frontend
    pattern .
    tag haproxy.http
 



  @type prometheus
  bind 0.0.0.0
  port 9104
  metrics_path /metrics



  @type record_modifier
 
    ta_active_time_seconds ${record["ta_active_time"].to_f / 1000}
 


# Create the histogram.

  @type prometheus
 
    name http_request_duration_seconds
    type histogram
    desc A histogram of the request duration.
    key ta_active_time_seconds
    buckets "0.1 0.2 0.5 1 2 5"
   
      frontend ${frontend}
      backend ${backend}
      code ${code}
      url ${url}
   
 


После запуска связки дернуть метрики:

curl localhost:9104/metrics

# TYPE http_request_duration_seconds histogram
# HELP http_request_duration_seconds A histogram of the request duration.
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.01"} 2886576115.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.02"} 2906399338.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.05"} 2941083200.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.1"} 2962511593.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.2"} 2980901517.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.5"} 2989548197.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="1"} 2990110356.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="5"} 2990648684.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="+Inf"} 2993973686.0

таких блоков будет много, они делятся по кодам ответа (200, 204, 500, 503, 301, 505 и так далее), по URL, Backend и Frontend.
Нагрузки на CPU такая связка добавит примерно процентов 20!!! Хочу сделать в будущем просто передачу логов на хаб где и парсить уже все скопом.


Вторая задача - сертификаты letsencrypt для haproxy https-frontend.
В секцию frontend-http добавим
    acl letsencrypt-acl path_beg /.well-known/acme-challenge/
    use_backend letsencrypt-backend if letsencrypt-acl

добавим новый бэкенд:
backend letsencrypt-backend
    server letsencrypt 127.0.0.1:8889


и запускаем certbot:
certbot certonly --standalone \
 -d my-domain.com \
 --non-interactive --agree-tos --email email@com.com --http-01-port=8889

После отработки получим сертификат на домен на три месяца но бесплатно.
Мейджик...

Комментариев нет: