Мне нужно реализовать максимально быстрый способ хранения пары ключ / значение в распределенной системе в Linux. Записи базы данных крошечные, в среднем 256 байт.
Я думаю использовать системные вызовы open (), write () и read () и записывать пары ключ-значение непосредственно с некоторым смещением в файле. Я могу опустить системный вызов fdatasync (), так как я буду использовать SSD-диск с батареей, поэтому мне не нужно беспокоиться о соответствии ACID, если произойдет неожиданное отключение системы.
Linux уже обеспечивает реализацию дискового кэша, поэтому чтение / запись не будет происходить в секторах, которые уже были загружены в память. Это (я думаю) было бы самым быстрым способом хранения данных, намного быстрее, чем любой другой механизм базы данных с поддержкой кэширования, такой как, например, GT.M или Intersystem Globals.
Однако данные не реплицируются, и для достижения репликации я могу смонтировать файловую систему другого сервера Linux с NFS и скопировать туда данные, например, если у меня есть 2 сервера данных (1 локальный и 1 удаленный), Я бы выполнил 2 вызова open (), 2 write () и 2 close (). Если транзакция завершается неудачно на удаленном сервере, я отмечаю ее как «несинхронизированную» и просто копирую хороший файл снова, когда удаленный сервер возвращается.
Что вы думаете об этом подходе? Это будет быстро? Я могу использовать NFS поверх UDP, чтобы избежать накладных расходов на стек TCP.
Список преимуществ пока выглядит так:
- Повторное использование дискового кэша Linux
- Несколько строк кода
- Высокая производительность
Я буду кодировать это на C. Чтобы найти запись в файле, я буду хранить btree в памяти с указателем на физическое местоположение.