2009-12-01 17 views
19

Voglio eseguire il mio server di database PostgreSQL dalla memoria. Il motivo è che sul mio nuovo server, ho 24 GB di memoria, e quasi nessuno di essi viene utilizzato.PostgreSQL nel database di memoria

So che posso correre questo comando per fare un ramdisk:

mdmfs -s 1024m md2 /mnt 

E potrei teoricamente PostgreSQL memorizzare i dati lì. Ma il problema con questo è che se il server si blocca o si riavvia, i dati saranno andati.

Fondamentalmente, voglio che il database sia caricato in memoria in ogni momento in modo che non debba andare sul disco fisso per leggere ogni record, dato che ho tonnellate di memoria e dato che la memoria è più veloce del disco rigido unità.

C'è un modo per farlo mentre anche PostgreSQL scrive sul disco in modo da non perdere alcun dato nel caso in cui il server si spegne? O c'è un modo per memorizzare tutti i dati nella memoria?

+0

Hai misurato che quasi nulla di quei 24 gigabyte sono usati da postgresql? – tuinstoel

+0

Poiché la memoria è più veloce del disco molto probabilmente sarebbe un po 'più veloce ma, dal momento che PostgreSQL non è progettato per essere eseguito in memoria, la velocità potrebbe non essere così grande come previsto. Ad esempio PostgreSQL proverà a svuotare la memoria nell'archiviazione persistente (normalmente disco, memoria in questo caso), vedi _Main Memory Databases Systems: An overview_ di Gracia-Molina e Kenneth Salem, [ecco i miei appunti] (https: // docs.google.com/document/d/1k9N8UNvCVM484P8xKSAF8Su8UnNKAt3D8oWM-aFYsK8/edit) di questo documento. – user454322

risposta

3

Devo credere che Postgres sia scritto in modo da sfruttare appieno la RAM disponibile nel server. Come avrete già intuito, non esiste un modo affidabile per farlo al di fuori di Postgres.

All'interno di Postgres, le transazioni assicurano che tutte le operazioni siano atomiche, quindi se si interrompe l'alimentazione mentre si scrive su un database Postgres, si perderà solo quell'operazione particolare e non l'intero database.

+0

http://www.postgresql.org/docs/8.4/static/spi-memory.html –

+2

Penso che la domanda che si pone sia correlata alla persistenza del ramdisk andato dopo lo spegnimento, non della natura atomica di una transazione in Postgres. – Kuberchaun

+0

@JustBob: questa domanda ha più di tre anni e la risposta più votata dice "Google it." Pubblica una risposta se pensi di poter fare meglio (non dovrebbe essere troppo difficile). –

6

hai visto il capitolo manuale Server Configuration? verificarlo, quindi google postgresql memory tuning.

+1

+1: shared_buffers è il tuo amico (bene, l'OP) – araqnid

1

La risposta è il caching. Cerca di aggiungere memoria al server, quindi aggiorna PostgreSQL per massimizzare l'utilizzo della memoria. Inoltre, la cache del file system aiuterà con questo, facendo un po 'di automaticamente. Sarai in grado di velocizzare le prestazioni, quasi come se fosse in memoria tranne che per il primo hit, senza doverlo gestire da solo, e potendo avere un database più grande della memoria fisica.

8

Ora sto utilizzando la replica di streaming che è asincrona. Ciò significa che il mio MASTER potrebbe essere in esecuzione tutto in memoria, con l'istanza SLAVE separata che utilizza il disco tradizionale.

Un riavvio della macchina comporterebbe l'arresto dello SLAVE, la copia dei dati postgresql in ramdisk e il riavvio del MASTER seguito dallo SLAVE. Questa sarebbe una possibilità interessante che si confronta bene con qualcosa come REDIS, ma con il vantaggio della ridondanza/hotstandby/backup/sql/ricco toolset ecc.

+2

Questo è probabilmente ancora più fattibile ora con la replica sincrona. Fare ciò che l'OP vuole. – plundra

+0

Se si utilizza la replica sincrona, dovrebbe essere su un altro file system di memoria, altrimenti non ci sarebbero miglioramenti delle prestazioni. _Quando si richiede la replica sincrona, ogni commit di una transazione di scrittura attenderà fino a quando non viene ricevuta conferma che il commit è stato scritto nel log delle transazioni sul disco sia del server primario che di quello standby._ https://www.postgresql.org/ docs/9,4/static/warm-standby.html # SINCRONO-REPLICA – user454322

Problemi correlati