Перехват трафика в memcached для статистики / анализа

Я хочу настроить платформу мониторинга статистики для просмотра определенной службы, но не знаю, как это сделать. Меня не беспокоит обработка перехваченных данных, а только то, как это сделать. Одна из идей заключалась в том, чтобы настроить прокси между клиентским приложением и службой, чтобы весь трафик TCP шел сначала на мой прокси, затем прокси делегировал перехваченные сообщения ожидающему потоку / вилке, чтобы передать сообщение и получить результаты. Другой - попытаться перехватить трафик между клиентом и сервисом.

Моя основная цель - избежать серьезных потерь в скорости передачи данных между клиентом и приложением, но получить 100% полную связь между клиентом и службой.

Среда: UBuntu 8.04

Язык: c / C++

В фоновом режиме я думал об использовании базы данных sqlite, полностью работающей в памяти, или кэш-памяти памяти размером 20-25 МБ, подчиненного моему процессу.

Обновлять: В частности, я пытаюсь отслеживать использование ключей для демона memcache, сохраняя количество наборов / успехов / сбоев на ключе. Идея состоит в том, что у большинства ключей есть какой-то разделительный символ [`| _- #] для создания своего рода пространства имен. Идея состоит в том, чтобы встать между демоном и клиентом, разделить ключи настроенным разделителем и записать статистику по ним.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 301
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Что именно вы пытаетесь отследить? Если вам нужен простой подсчет пакетов или байтов или основная информация заголовка, iptables запишет это для вас:

iptables -I INPUT -p tcp -d $HOST_IP --dport $HOST_PORT -j LOG $LOG_OPTIONS

Если вам нужна более подробная информация, посмотрите на цель iptables ULOG, которая отправляет каждый пакет в пользовательское пространство для анализа.

Подробную документацию по очень см. В http://www.netfilter.org.

Ответ принят как подходящий

Вы не упомянули один подход: вы можете изменить memcached или своего клиента для записи необходимой вам статистики. Это, наверное, самый простой и чистый подход.

Между прокси-сервером и подходом libpcap есть несколько компромиссов:

- If you do the packet capture approach, you have to reassemble the TCP
  streams into something usable yourself. OTOH, if your monitor program
  gets bogged down, it'll just lose some packets, it won't break the cache.
  Same if it crashes. You also don't have to reconfigure anything; packet
  capture is transparent. 

- If you do the proxy approach, the kernel handles all the TCP work for
  you. You'll never lose requests. But if your monitor bogs down, it'll bog
  down the app. And if your monitor crashes, it'll break caching. You
  probably will have to reconfigure your app and/or memcached servers so
  that the connections go through the proxy.

Короче говоря, прокси-сервер, вероятно, будет легче кодировать, но его реализация может быть королевской головной болью, и лучше бы он был идеальным, иначе кеширование уменьшилось бы. Смена приложения или memcached кажется мне самым разумным подходом.

BTW: Вы смотрели на встроенную статистику memcached? Я не думаю, что он достаточно подробный для того, что вы хотите, но если вы его не видели, взгляните, прежде чем приступить к реальной работе :-D

Проблема, которую я пытаюсь решить, заключается в том, чтобы знать, что wtf memcache и приложение делают: «Срок действия ключей скоро истечет, и есть ли еще наборы, которые затем получают»

David 08.11.2008 22:11

Наборы против получения - это то, на что может ответить встроенная статистика.

derobert 21.11.2008 07:28

iptables предоставляет libipq, библиотеку очередей пакетов пользовательского пространства. На странице руководства:

Netfilter provides a mechanism for passing packets out of the stack for queueing to userspace, then receiving these packets back into the kernel with a verdict specifying what to do with the packets (such as ACCEPT or DROP). These packets may also be modified in userspace prior to reinjection back into the kernel.

Настроив индивидуальные правила iptables, которые пересылают пакеты в libipq, помимо определения вердикта для них, можно выполнять проверку пакетов для анализа статистики.

Другой жизнеспособный вариант - вручную прослушивать пакеты с помощью сокета libpcap или PF_PACKET с поддержкой фильтра сокетов.

Если вы хотите использовать сниффер, возможно, будет проще использовать tcpflow вместо tcpdump или libpcap. tcpflow будет выводить только полезную нагрузку TCP, поэтому вам не нужно заботиться о повторной сборке потока данных самостоятельно. Если вы предпочитаете использовать библиотеку вместо того, чтобы склеивать кучу программ, вас могут заинтересовать libnids.

libnids и tcpflow также доступны в других версиях Unix и не ограничивают вас только Linux (в отличие от iptables).

http://www.circlemud.org/~jelson/software/tcpflow/http://libnids.sourceforge.net/

Другие вопросы по теме