2013-06-05 2 views
1

У меня есть приложение, которое контролирует различные системы в реальном времени. Я получаю разные отчеты с разными полями в зависимости от контролируемого приложения. Мы собираем данные через 3-минутные интервалы. И эти 3-минутные интервалы могут быть 120 МБ, как сырые json и 2-3mb, как zipped или gzipped json. Мы зацикливаемся, затем кэшируем на диск, чтобы избежать запросов к базе данных, запрашивая эти кэши с диска, распаковывая их и загружая json-данные в приложение. Мы храним эти кеши в течение 3 дней до 30 дней в зависимости от типа отчета.Кэширование больших данных

В течение многих лет мы использовали кэширование дисков. Завершение трехминутных данных, а затем сохранение на диск. Это заставило меня использовать много замков и мьютексов.

Я знаю, что я не единственный с такой проблемой. Мой кеш большой. Мой вопрос: Есть ли лучший способ сохранить эти данные и получить их? Кэширование памяти не является решением для меня, потому что 30 дней данных не могут быть в памяти, и я не могу добавить память на сервер для этого приложения. Мне нужно что-то еще. Что-то лучше, чем диск и без использования блокировок.

P.S. : Приложение также многопоточное.

+1

Просьба пояснить следующее: (1) «Мы застегиваем их, чтобы избежать запросов к базе данных» (2) Связь между отчетом и кешем (3) Почему «кэширование памяти не является для меня решением». – Ankush

+0

Редактирование моего вопроса. – Xelom

+0

Итак, у вас есть 480 интервалов в день на 120 мб каждый (около 56 ГБ несжатых данных в день)? Это много IO, если вы нажмете циклы db, file или cpu на zip. Я работал над VoIP-приложением, и мы сжимали аудио в mp3, использовали локальную файловую систему, пока не достигли определенного порога, а затем выгрузили сетевой ресурс или FTP. Итак, у меня нет лучшего ответа, чем то, что вы уже делаете. –

ответ

0

Я бы рассмотрел механизм хранения NoSQL. В частности, я думаю о Редисе. Redis - это запоминающее устройство с быстрым хранением ключей с сохранением, которое должно хорошо подходить для такого сценария. Затем вы можете отложить большую часть проблем с блокировкой/согласованностью.

Проблема с Redis заключается в том, что вы действительно связаны с Windows env. Существует «неофициальный» порт redis; порт сделан самой Microsoft .. но я признаю, что я не был бы чрезвычайно уверен в использовании его в производстве. Что касается клиента/библиотеки C#, то есть Booksleeve. Этот сайт (SO) использует его :), поэтому я уверен, что он довольно стабилен!

Конечно, вам нужно будет адаптировать Redis к вашим потребностям. Redis предлагает настойчивость, и настойчивость настраивается (см. http://redis.io/topics/persistence). Кроме того, он предлагает срок действия объектов (http://redis.io/commands/expire), очень удобный для кеш-подобного механизма и возможность создавать более сложные атомные команды, начиная с более простых.

Я бы использовал Redis для обработки кэша в памяти, сохраняя все (первичные) ключи в памяти с данными как на диске, так и в памяти. Данные в памяти, связанные с изменчивым ключом. Первичный ключ указывает на ключ в памяти и на имя файла; если указанный ключ недействителен, вы можете повторно загрузить данные и получить к ним доступ.

Это сложное решение, но оно имеет два преимущества:

  • она должна быть варьироваться быстро
  • это разгружает некоторые из замков/и т.д. нагрузки на Redis
  • должно быть легко мигрировать из ваше решение этой одной

в качестве альтернативы, Redis также предлагает решение VM http://oldblog.antirez.com/post/redis-virtual-memory-story.html, но я не знаю, насколько стабильна она, ни я никогда не три- редактировать.

Другой альтернативой является изучение других решений NoSQL; поскольку вы упомянули данные JSON, я посмотрю на MongoDB.

Наконец, сумасшедшая идея ... вы на 64-битной машине? Считаете ли вы, что «разрешить ОС справляться с этим», с действительно большими файлами с файлами страниц и файлами с файловой поддержкой с файлами с файлами (или стандартным файлом)? Имейте в виду, это может быть очень ПЛОХАЯ идея ...!Но это то, что, возможно, вы могли бы попробовать/исследовать?

+0

Спасибо за ваше замечательное объяснение. Если я собираюсь использовать Редис. Как я буду хранить в нем свои zip-файлы? Как Zip-файлы в двоичные или только строки json внутри? – Xelom

+0

Ключи и значения являются бинарно-безопасными строками (http://redis.io/topics/data-types-intro), поэтому вы можете даже хранить gzipped-байты внутри значения. –

Смежные вопросы