Масштабируемая система непосредственного хранения данных с демоном php и неблокирующим fopen - PullRequest
0 голосов
/ 05 ноября 2011

Я строю масштабируемую систему хранения данных.Количество серверов может иметь сотни одновременных запросов на вставку данных в базу данных MySQL.Я буду писать хранилище данных на каждом веб-сервере локально.Мне нужно иметь возможность записать локальное хранилище каждого веб-сервера в базу данных mysql при достижении порога (триггер).

У меня есть концепция, в которой есть библиотека PHP с использованием неблокирующего метода:добавление отправленных данных в текстовый файл.Демон запускается на каждом веб-сервере.В этом txt-файле накапливаются строки данных (в формате csv) до достижения порогового значения, а затем демон архивирует файл и отправляет его на сервер сбора, который разархивирует данные и вставит их в базу данных.

Мой методдля записи в текстовый файл это что-то вроде:

$fp = fopen($file, 'a+');
stream_set_blocking($fp, 0);

while($count < $loop) {
    if (flock($fp, LOCK_EX)) {
        fwrite($fp, $text);
    }
    flock($fp, LOCK_UN);
}

fclose($fp)

Допустим, я пишу демон на сервере, который каждые 2 минуты перемещает текстовый файл на сервер сбора.Я не уверен в точном процессе перемещения файла и начала записи в новый (чистый) файл с одновременными подключениями.

Я думал, что-то вроде демона блокирует файл и копирует его, а затем стирает вседанные из оригинала а потом его разблокирует ???Скопированный файл будет отправлен сборщику через демон.Я не уверен, как это будет вести себя одновременно, если запущена описанная выше запись потокового файла.

Существует ли более эффективное / быстрое / надежное решение, собирающее данные локально и затем перемещающее их в сборщик?

Заранее спасибо!

1 Ответ

0 голосов
/ 07 ноября 2011

То, что у вас есть, кажется мне вполне разумной моделью, поэтому мой ответ - оптимизация для нее. Похоже, вы могли бы решить проблему с использованием более одного файла спулинга. Я представляю что-то вроде:

Напишите файл в течение двух минут (или пока вы не достигнете своего порогового значения или других критериев). Как только вы перейдете к следующему файлу, скопируйте и удалите старый файл. Вы можете повторять этот процесс до бесконечности, включая временную метку в имени файла, чтобы убедиться, что у вас никогда не будет конфликтов.

...