PostgreSQL в базе данных в памяти

Я хочу запустить свой сервер базы данных PostgreSQL из памяти. Причина в том, что на моем новом сервере у меня 24 ГБ памяти, и почти не используется.

Я знаю, что могу запустить эту команду, чтобы создать виртуальный диск:

mdmfs -s 1024m md2 /mnt

И теоретически я мог бы заставить PostgreSQL хранить там свои данные. Но проблема в том, что если сервер выйдет из строя или перезагрузится, данные пропадут.

По сути, я хочу, чтобы база данных загружалась в память все время, чтобы ей не приходилось переходить на жесткий диск для чтения каждой записи, поскольку у меня ТОННЫ памяти и поскольку память быстрее, чем жесткие диски.

Есть ли способ сделать это, а также записать PostgreSQL на диск, чтобы я не потерял данные в случае выхода из строя сервера? Или есть способ кэшировать все данные в памяти?


person David Barnes    schedule 01.12.2009    source источник
comment
Вы замерили, что почти ничего из этих 24 гигабайт не используется postgresql?   -  person tuinstoel    schedule 02.12.2009
comment
Поскольку память быстрее, чем диск, скорее всего, это будет некоторое ускорение, но, поскольку PostgreSQL не предназначен для работы в памяти, ускорение может быть не таким большим, как ожидалось. Например, PostgreSQL попытается сбросить свою память в постоянное хранилище (в данном случае это обычно диск, память), см. Системы баз данных с основной памятью: обзор, авторы Грасия-Молина и Кеннет Салем, вот мои примечания к этой статье.   -  person user454322    schedule 25.04.2017


Ответы (4)


Сейчас я использую потоковую репликацию, которая является асинхронной. Это означает, что мой MASTER может работать полностью в памяти, а отдельный экземпляр SLAVE использует традиционный диск.

Перезапуск машины будет включать остановку SLAVE, копирование данных postgresql обратно в ramdisk, а затем перезапуск MASTER, а затем SLAVE. Это была бы интересная возможность, которая хорошо сравнима с чем-то вроде REDIS, но с преимуществом избыточности / горячего резерва / резервного копирования / sql / богатого набора инструментов и т. д.

person TonyC    schedule 30.06.2011
comment
Это, вероятно, даже более осуществимо сейчас с синхронной репликацией. Делать то, что хочет ОП. - person plundra; 16.11.2011
comment
Если используется синхронная репликация, она должна выполняться в другую файловую систему в памяти, иначе прироста производительности не будет. При запросе синхронной репликации каждая фиксация транзакции записи будет ожидать получения подтверждения о том, что фиксация была записана в журнал транзакций на диск основного и резервного серверов. postgresql.org/docs/9.4/static/ - person user454322; 13.07.2016
comment
Я думал о той же идее. - person Abhijit Gujar; 21.04.2018

Вы видели главу руководства по Server Configuration? проверьте это, затем погуглите postgresql memory tuning.

person just somebody    schedule 02.12.2009
comment
ОП не спрашивает о настройке использования памяти; он спрашивает о том, чтобы Postgres использовал системную память, как если бы это было традиционное хранилище на основе вторичного диска. - person code_dredd; 21.02.2020

Я должен верить, что Postgres написан таким образом, чтобы в полной мере использовать доступную оперативную память на сервере. Как вы, возможно, уже догадались, нет надежного способа сделать это вне Postgres.

В Postgres транзакции гарантируют, что все операции являются атомарными, поэтому, если питание отключится во время записи в базу данных Postgres, вы потеряете только эту конкретную операцию, а не всю базу данных.

person Robert Harvey    schedule 01.12.2009
comment
Я думаю, что вопрос, который задают, связан с постоянным исчезновением виртуального диска после выключения, а не с атомарным характером транзакции в Postgres. - person Kuberchaun; 25.02.2013
comment
@JustBob: этому вопросу уже более трех лет, и ответ, получивший наибольшее количество голосов, говорит, что это Google. Опубликуйте ответ, если считаете, что можете добиться большего успеха (это не должно быть слишком сложно). - person Robert Harvey; 25.02.2013
comment
Спасибо за конструктивный вклад. Я только что нашел этот вопрос и подумал, что добавление небольшой детали к данному ответу никому не повредит. - person Kuberchaun; 25.02.2013

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

person Grant Johnson    schedule 02.12.2009