memcached на файлах
От: webtech  
Дата: 30.11.09 00:44
Оценка:
Приветствую !

Обращаюсь с просьбой помочь. Я устраиваюсь на новую работу. А там тестовое задание.

Сразу разделяю Ваше негодование. Тестовое — значит сам должен сделать. Но я ни в коем случае не прошу его за меня решать или что-либо подобное.

Просто не могу просечь "фишку" задания. То есть что же хочет проверить работодатель. Может хотят увидеть развитую систему классов ? А может грамотную алгоритмизацию ? А может еще что ? Надеюсь кто-то из более опытных людей сможет что-либо подсказать.

Вот, собственно, и само задание:

Напишитe клаcc (клaccы) нa php, рeaлизующий мeхaнизм хрaнeния дaнных в cтилe memcached, пригoдный для иcпoльзoвaния нa выcoкoнaгружeнных прoeктaх. Ключ, для прocтoты, цeлoчислeнный. Кoличecтвo хрaнимых зaписeй, миллиoны штук. Рeaлизуйтe хрaнeниe дaнных в фaйлoвoй систeмe. Рeaлизуйтe хрaнeниe дaнных в sql бaзe. Рeaлизуйтe мeхaнизм oчистки кeшa от уcтaрeвших зaпиceй. Тoчнocть уcтaрeвaния 1 чаc.


Самая большая сложноcть: как это сделать в файловой системе. memcached — это по сути дела большая распределенная хэш-табличка. Где есть 2 основных метода: get(key) и set(key, value). В случае файлов, у меня всё утыкается в изменение/удаление данных. Допустим мы создали три записи:

set('key1', '1000');
set('key2', '1000');
set('key3', '1000');

Это все хранится в файле. Допустим теперь нам надо изменить значение для ключа 'key2' и новое значение будет длиннее старого. Например сделать:

set('key2', '99999999');

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

По сути дела тут единственный выход — взять из файла всё, что находится до 'key2', скопировать в tmp-файл, дописать в него новое значение 'key2', затем дописать остаток из исходного файла и заменить исходный файл. Ну и стереть tmp-файл.

Только с учетом объемов ("миллионы штук"), у нас могут появиться довольно-таки здоровенные файлы в несколько сотен метров, с которыми будут проблемы. Не думаю, что разумно двигать сотни мегабайт, ради того, чтобы вставить лишние сто килобайт в середину файла. Это не хорошо с точки зрения производительности. Или я ошибаюсь ?

Кроме того, если у нас под кеш выделен допустим 1 гиг. Мы его забили на 1000 метров. Теперь нам надо в эти 1000 метров запихать 100КБ куда-нибудь в середину. Как мы создадим tmp-файл на 1000 метров ? 1000+1000 = 2000, а это уже явно больше выделенного 1 гигабайта.

С удалением та же беда. Нельзя же просто выкинуть кусок из файла. Опять таки придется пересохранять.

Вариант "создавать по 1 файлу на каждое значение кеша" — тоже не вариант. Несколько миллионов файлов ради кеша — явно не дело.

Если считать, что я тут нигде не ошибся и все верно. Тогда по заданию вообще придется писать что-то вроде своего file-based DB-engine (типа sqlite). С грамотным разделением записей по файлам и всевозможными оптимизациями. Но это ж как-то слишком мастабно. Может я слишком сильно заморачиваюсь ?

Спасибо за то, что дочитали до конца и за любую помощь.
file-based memcahed кэш на файлах
Re: memcached на файлах
От: Holms США  
Дата: 30.11.09 01:46
Оценка:
Здравствуйте, webtech, Вы писали:


W>Вот, собственно, и само задание:


W>

W>Напишитe клаcc (клaccы) нa php, рeaлизующий мeхaнизм хрaнeния дaнных в cтилe memcached, пригoдный для иcпoльзoвaния нa выcoкoнaгружeнных прoeктaх. Ключ, для прocтoты, цeлoчислeнный. Кoличecтвo хрaнимых зaписeй, миллиoны штук. Рeaлизуйтe хрaнeниe дaнных в фaйлoвoй систeмe. Рeaлизуйтe хрaнeниe дaнных в sql бaзe. Рeaлизуйтe мeхaнизм oчистки кeшa от уcтaрeвших зaпиceй. Тoчнocть уcтaрeвaния 1 чаc.


Вам же ясно сказали, "Рeaлизуйтe хрaнeниe дaнных в sql бaзe", для чего вам нужны файлы???

Видно работодателя интересует знаете ли вы что такое индексы для БД, как правильно подключатся к БД и вытаскивать результаты.

Удачи.
... << RSDN@Home 1.2.0 alpha 4 rev. 1253>>
The life is relative and reversible.
Re[2]: memcached на файлах
От: webtech  
Дата: 30.11.09 06:33
Оценка:
Здравствуйте, Holms, Вы писали:

H>Вам же ясно сказали, "Рeaлизуйтe хрaнeниe дaнных в sql бaзe", для чего вам нужны файлы???


H>Видно работодателя интересует знаете ли вы что такое индексы для БД, как правильно подключатся к БД и вытаскивать результаты.


H>Удачи.


Как сделать на основе БД — это еще понятно. Просто необходимо реализовать и на файлах, и на БД:

W>

Напишитe клаcc (клaccы) нa php, рeaлизующий мeхaнизм хрaнeния дaнных в cтилe memcached, пригoдный для иcпoльзoвaния нa выcoкoнaгружeнных прoeктaх. Ключ, для прocтoты, цeлoчислeнный. Кoличecтвo хрaнимых зaписeй, миллиoны штук. Рeaлизуйтe хрaнeниe дaнных в фaйлoвoй систeмe. Рeaлизуйтe хрaнeниe дaнных в sql бaзe. Рeaлизуйтe мeхaнизм oчистки кeшa от уcтaрeвших зaпиceй. Тoчнocть уcтaрeвaния 1 чаc.


Поэтому вот и пытаюсь сделать на файлах.
Re: memcached на файлах
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 30.11.09 08:17
Оценка:
Здравствуйте, webtech, Вы писали:

W>Может я слишком сильно заморачиваюсь ?


Вероятнее всего да.

Я бы предложил по файлу на запись, в качестве имени файла — ключ.
Re: memcached на файлах
От: Mikhail Polykovsky Россия  
Дата: 30.11.09 08:59
Оценка: +1
W>Вариант "создавать по 1 файлу на каждое значение кеша" — тоже не вариант. Несколько миллионов файлов ради кеша — явно не дело.

Почему нет? Если их раскладывать по вложенным каталогам, может не все так фатально будет. Проведите эксперимент.
Re[2]: memcached на файлах
От: webtech  
Дата: 30.11.09 09:44
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Вероятнее всего да.


G>Я бы предложил по файлу на запись, в качестве имени файла — ключ.


Хм, уже 3 голоса (с разных форумов) за такую систему. =) Сейчас буду ставить эксперимент. Спасибо
Re[2]: memcached на файлах
От: webtech  
Дата: 30.11.09 09:44
Оценка:
Здравствуйте, Mikhail Polykovsky, Вы писали:

W>>Вариант "создавать по 1 файлу на каждое значение кеша" — тоже не вариант. Несколько миллионов файлов ради кеша — явно не дело.


MP>Почему нет? Если их раскладывать по вложенным каталогам, может не все так фатально будет. Проведите эксперимент.


Хм, уже 3 голоса (с разных форумов) за такую систему. =) Сейчас буду ставить эксперимент. Спасибо
Re[3]: memcached на файлах
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 30.11.09 09:48
Оценка:
Здравствуйте, webtech, Вы писали:

W>Здравствуйте, gandjustas, Вы писали:


G>>Вероятнее всего да.


G>>Я бы предложил по файлу на запись, в качестве имени файла — ключ.


W>Хм, уже 3 голоса (с разных форумов) за такую систему. =) Сейчас буду ставить эксперимент. Спасибо


Если время поиска файла по имени в каталоге довольно длительное, то можно понаделать подкаталоги с именами от хеша ключа, например остаток от деления на степень двойки для числового ключа.
Re[4]: memcached на файлах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.11.09 09:54
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, webtech, Вы писали:


W>>Здравствуйте, gandjustas, Вы писали:


G>>>Вероятнее всего да.


G>>>Я бы предложил по файлу на запись, в качестве имени файла — ключ.


W>>Хм, уже 3 голоса (с разных форумов) за такую систему. =) Сейчас буду ставить эксперимент. Спасибо


G>Если время поиска файла по имени в каталоге довольно длительное, то можно понаделать подкаталоги с именами от хеша ключа, например остаток от деления на степень двойки для числового ключа.


Здесь лучше сделать несколько вложенных каталогов, чтобы не получить слишком большое кол-во каталогов в одном месте, что тоже вредно.

Но все равно, миллион мелких файлов = в лучшем случае 4 гига при Allocation unit size в 4кб.
Re[3]: memcached на файлах
От: Аноним  
Дата: 30.11.09 14:24
Оценка:
Здравствуйте, webtech, Вы писали:

W>Хм, уже 3 голоса (с разных форумов) за такую систему. =) Сейчас буду ставить эксперимент. Спасибо


Прибавлю свой, четвёртый
Пусть путь к записи c id = 4395623781 выглядит так: 4/3/9/5/6/2/3/7/8/1.bin или так: 43/95/62/37/81.bin.
Re[4]: memcached на файлах
От: webtech  
Дата: 30.11.09 14:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, webtech, Вы писали:


W>>Хм, уже 3 голоса (с разных форумов) за такую систему. =) Сейчас буду ставить эксперимент. Спасибо


А>Прибавлю свой, четвёртый

А>Пусть путь к записи c id = 4395623781 выглядит так: 4/3/9/5/6/2/3/7/8/1.bin или так: 43/95/62/37/81.bin.

Оказывается самый оптимальный путь может быть другим: http://forum.sources.ru/index.php?showtopic=174102
Re: memcached на файлах
От: Anton Batenev Россия https://github.com/abbat
Дата: 30.11.09 14:55
Оценка:
Здравствуйте, webtech, Вы писали:

w> Спасибо за то, что дочитали до конца и за любую помощь.


Про вложенные директории уже сказали. Хочется добавить, что увлекаться тоже не стоит — двух уровней вложенности будет более чем достаточно. Например, первый уровень 0..F, второй 00..FF — при 1 млн ключей и их равномерном распределении получаем ~245 файлов в директории — с этим файловая система справится левой пяткой. Равномерности распределения можно попробовать достичь вычисляя директорию в "обратную" сторону для ключа. Например, ключ 1000 = 0x000003E8 = /8/E3/00000.tmp. Так же, эти параметры можно сделать задаваемыми в конфигурации.
avalon 1.0rc2 rev 304, zlib 1.2.3
Re[5]: memcached на файлах
От: Аноним  
Дата: 30.11.09 16:04
Оценка:
Здравствуйте, webtech, Вы писали:

W>Оказывается самый оптимальный путь может быть другим: http://forum.sources.ru/index.php?showtopic=174102


Совсем оптимальный путь зависит от файловой системы.
Re[6]: memcached на файлах
От: webtech  
Дата: 30.11.09 16:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, webtech, Вы писали:


W>>Оказывается самый оптимальный путь может быть другим: http://forum.sources.ru/index.php?showtopic=174102


А>Совсем оптимальный путь зависит от файловой системы.


В идеале: прогнать бы серию тестов на самое оптимальное распределение файлов/папок и выяснить самое подходящее для каждой FS. Но это как-то слишком
Re[2]: memcached на файлах
От: webtech  
Дата: 30.11.09 16:26
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>Здравствуйте, webtech, Вы писали:


w>> Спасибо за то, что дочитали до конца и за любую помощь.


AB>Про вложенные директории уже сказали. Хочется добавить, что увлекаться тоже не стоит — двух уровней вложенности будет более чем достаточно. Например, первый уровень 0..F, второй 00..FF — при 1 млн ключей и их равномерном распределении получаем ~245 файлов в директории — с этим файловая система справится левой пяткой. Равномерности распределения можно попробовать достичь вычисляя директорию в "обратную" сторону для ключа. Например, ключ 1000 = 0x000003E8 = /8/E3/00000.tmp. Так же, эти параметры можно сделать задаваемыми в конфигурации.


Постараюсь по разному попробовать и потом запостить здесь результаты. Хотя это и малообъективно.
Re[7]: memcached на файлах
От: Аноним  
Дата: 30.11.09 17:09
Оценка:
Здравствуйте, webtech, Вы писали:

W>В идеале: прогнать бы серию тестов на самое оптимальное распределение файлов/папок и выяснить самое подходящее для каждой FS. Но это как-то слишком


Для задачки на собеседовании — да
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.