Данные хранятся в файловой системе в папках нескольких уровней. Целый
id
транслируется в "адрес" папки, например,
/data/AF/BF/C4/06/
, где лежит несколько бинарных файлов с наборами данных для этого
id
.
Хостится у недорогого провайдера, где выгоднее взять ещё одну коробку, чем нарастить диск в существующей. По мере роста пришлось подключить несколько новых серверов и перенести на них часть деревьев. Верхний уровень папок теперь разбит как-то так:
00–3F – основной сервер
40–7F – 1-й дополнительный
80–FF – 2-й дополнительный
Делалось всё в спешке, поэтому просто подключил папки с доп. серверов по NFS и вместо части папок в
/data/
теперь лежат симлинки на NFS маунты. Всё работает ок.
Теперь хочется задействовать и вычислительные способности доп. серверов, запуская worker'ов или бэкапы на них.
В принципе, можно симметрично замаунтить на них папки с «удалённых» серверов и так же, симлинками собрать полный набор папок
00–FF
в рабочей папке данных.
«Правильно» ли будет такое масштабирование проекта? На каждом из N серверов будет N–1 маунтов с остальных.
Один раз попробовал так сделать – почти всё отработало, но
появились «артефакты», с которыми так и не разобрался: при создании новой под-под-папки на одном из серверов возникали циклические симлинки, если имя создаваемой папки совпадало с именем родительской.
Например, требовалось создать
/data/AF/C7/C7/56/
(из php,
mkdir()
с
$recursive = true
).
/data/AF/C7
уже существовала, но вместо вложенной в неё новой папки
C7
создавался симлинк на родительский
C7
, и скрипт вылетал с критической ошибкой о невозможности создания директории. Так и не понял, почему это возникает.
Может быть, стоит посмотреть на другие решения для хранения файловых данных и горизонтального шардинга? Hadoop'овский HDFS кажется overkill'ом для моей маленькой задачи.