Мне нужно выбрать технику хранения и получения журналов аудита (когда что-то было добавлено, удалено, изменено и т.д.). Сценарий: журналы могут быть увеличены на 10 миллионов в день и будут получены некоторыми ключевыми словами. Поэтому мой вопрос:
ELK - это стандартная опция для этого. Он надежный, имеет большой и быстрый поиск по ключевым словам по миллионам записей и может масштабироваться довольно линейно.
MySQL был бы вторичным выбором OK, но в зависимости от временного горизонта, который вам нужно сохранить, вы в конечном итоге столкнетесь с проблемой масштабирования как с точки зрения пространства, так и с точки зрения поиска (в разумные сроки) без осколков. Sharding позаботится о многих из этих проблем, но, скорее всего, это будет более ручным и более болезненным, чем что-то вроде ELK, которое очень легко настроить для индексирования/осколки по дате.
Redis Не было бы очень хорошим выбором для этого. Все данные redis должны вписываться в память, что ограничивает количество данных журнала, которые вы можете сохранить резко. Ключ/значение также не подходит для данных с логарифмической структурой, особенно по его поисковому запросу, что в redis будет в основном отсутствовать.
Если бы вы перерастали ELK, следующий лучший вариант, вероятно, был бы похож на HDFS + Hadoop/Spark search (или S3 + EMR, если вы на AWS-земле), но в 10 миллионов в день ELK должен длиться хорошо ( в зависимости от временного горизонта). Как пример, в настоящее время я работаю с кластером ELK с 10 узлами, который обрабатывает около миллиарда лог файлов в день, и мы сохраняем историю за две недели.
РЕДАКТИРОВАТЬ:
Для ведения журнала аудита, в частности, как вы ищите, для дополнительной надежности может быть полезно иметь что-то вроде потока kafka для записи в качестве слоя между вашим приложением и ELK. Это обойдется вокруг потенциально странного/дерьмового поведения, на которое можно столкнуться, полагаясь на доставку файла журнала, и получит неограниченный, воспроизводимый поток всех изменений.