Для сбора статистики очень логично использовать append only databases, производительность которых на запись часто играет решающую роль в выборе. Скорее всего вы, как и многие другие, не будете выдавать отчеты на лету, а будете генерировать их по запросу некоторое время, и на опережение генерировать несколько самых основных/популярных и для вас время выборки будет не самым важным критерием.
Дисковое пространство сегодня стоит относительно не много, и overhead даже в 20% для проекта с такими нагрузками является допустимым. Тут все зависит от формата сообщений, которые вы хотите принимать и от того, как вы решите их хранить.
В качестве БД можно смотреть на
Riak (с
LevelDB в качестве бекенда) или еще один интересный append only key-value storage по типу тарантула:
sophia.
Но на самом деле, решающим фактором тут является не столько сама БД, сколько то, как в нее попадает информация и на каких нодах она должна быть доступна. Как по мне, даже вариант с обычными файлами ОС и fsync() тоже отбрасывать не стоит.
По поводу веб.сервера: без балансировки, скорее всего, не удасться обработать такое кол-во запросов, хотя это очень сильно зависит от сущности самих запросов. Интересно что Вы тестировали, что nginx показал вам такие цифры на одной ноде, скорее всего отдачу одной (пары) страниц, каждая из которых попала в файловый cache ОС из-за частого обращения и, соответственно, отдавалась с памяти. Вот вам и намек: чтение и запись в память происходят с приблизительно одинаковой скоростью, а nginx позволяет обрабатывать запросы c помощью Lua. А тут уже много вариантов: redis pub/sub, pipes, shared memory и т.д., может вы даже захотите написать модуль для nginx на С.
Скорее всего вы будете принимать json самых разных вариаций, и тут возможны 2 варианта: или писать сообщения сразу на диск и потом пост-обработка, или парсить данные и потом писать результаты. Тут посоветовать не могу, вам должно быть виднее что на данном этапе логичнее. Но имейте ввиду, что каждая операция на этапе обработки запроса от клиента уменьшает ваш rps.
Еще важный момент здесь учитывать, что 12krps с одного хоста != 12krps с 12k хостов. Каждый из коннектов nginx будет должен мультриплексировать на что тоже будет расходоваться время.