#php #mysql #scalability #daemon
#php #mysql #масштабируемость #демон
Вопрос:
Я создаю масштабируемую систему хранения данных. n количество серверов может иметь 100 одновременных запросов на ввод данных в базу данных mysql. Я буду писать хранилище данных на каждом веб-сервере локально. Мне нужно иметь возможность записывать локальное хранилище каждого веб-сервера в базу данных mysql при достижении порогового значения (триггер).
У меня есть концепция, в которой есть библиотека PHP, использующая неблокирующий метод добавления отправленных данных в текстовый файл. Демон запускается на каждом веб-сервере. Этот текстовый файл накапливает строки данных (формат 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:
То, что у вас есть, кажется мне совершенно разумной моделью, поэтому мой ответ — оптимизация для нее. Похоже, вы могли бы решить проблему с использованием более одного буферного файла. Я представляю что-то вроде:
Пишите файл в течение двух минут (или пока не достигнете своего порога или любых ваших критериев). Как только вы перейдете к следующему файлу, скопируйте и удалите старый файл. Вы можете повторять этот процесс бесконечно, включая временную метку в имени файла, чтобы убедиться, что у вас никогда не возникнет коллизий.