2009-06-15 11 views
18

quello che è un buon metodo per frammento orizzontale postgresql

1. pgpool 2 
2. gridsql 

che è un modo migliore per utilizzare shardingciò che è un buon metodo per frammento orizzontale postgresql

è anche possibile partizione da senza cambiare codice client

sarebbe bello se qualcuno può condividere un semplice tutorial o libro di cucina esempio di come impostare e utilizzare sharding

risposta

5

pl/proxy (con Skype) è una buona sol ution per questo. Richiede il tuo accesso per essere attraverso una funzione API, ma una volta che lo hai può renderlo abbastanza trasparente.

19

PostgreSQL consente il partizionamento in due modi diversi. Uno è dalla gamma e l'altro è dalla lista. Entrambi usano l'ereditarietà della tabella per fare la partizione.
Il partizionamento per intervallo, solitamente un intervallo di date, è il più comune, ma il partizionamento per elenco può essere utile se le variabili che costituiscono la partizione sono statiche e non distorte.

Il partizionamento viene eseguito con l'ereditarietà della tabella, quindi la prima cosa da fare è impostare nuove tabelle figlio.

CREATE TABLE measurement (
    x  int not null, 
    y  date not null, 
    z  int 
); 

CREATE TABLE measurement_y2006 ( 
    CHECK (logdate >= DATE '2006-01-01' AND logdate < DATE '2007-01-01') 
) INHERITS (measurement); 

CREATE TABLE measurement_y2007 (
    CHECK (logdate >= DATE '2007-01-01' AND logdate < DATE '2008-01-01') 
) INHERITS (measurement); 

Quindi è necessario utilizzare regole o trigger per rilasciare i dati nelle tabelle corrette. Le regole sono più veloci sugli aggiornamenti di massa, i trigger su singoli aggiornamenti e sono più facili da mantenere. Ecco un trigger di esempio.

CREATE TRIGGER insert_measurement_trigger 
    BEFORE INSERT ON measurement 
    FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger(); 

e la funzione trigger per fare l'inserto

CREATE OR REPLACE FUNCTION measurement_insert_trigger() 
RETURNS TRIGGER AS $$ 
BEGIN 
    IF (NEW.logdate >= DATE '2006-01-01' 
     AND NEW.logdate < DATE '2007-01-01') THEN 
     INSERT INTO measurement_y2006 VALUES (NEW.*); 
    ELSIF (NEW.logdate >= DATE '2007-01-01' 
      AND NEW.logdate < DATE '2008-01-01') THEN 
     INSERT INTO measurement_y2006m03 VALUES (NEW.*); 
    ELSE 
     RAISE EXCEPTION 'Date out of range.'; 
    END IF; 
    RETURN NULL; 
END; 
$$ 
LANGUAGE plpgsql; 

Questi esempi sono versioni semplificate della documentazione di PostgreSQL per facilitarne la lettura.

Non ho familiarità con pgpool2, ma gridsql è un prodotto commerciale progettato per EnterpriseDB, un database commerciale che è stato costruito su postgresql. I loro prodotti sono molto buoni, ma non penso che funzionerà su Postgresl standard.

+0

Molto accurato. +1. –

+2

GridSQL è GPL e funziona su postgres standard. – David

16

Bene, se la domanda riguarda lo sharding, le funzioni di partizionamento di pgpool e postgresql non sono risposte valide.

Il partizionamento presuppone che le partizioni si trovino sullo stesso server. Il sharding è più generale e viene in genere utilizzato quando il database è suddiviso su più server. Sharding viene utilizzato quando il partizionamento non è più possibile, ad esempio per database di grandi dimensioni che non possono essere contenuti su un singolo disco.

Per il vero sharding, il pl/proxy di Skype è probabilmente il migliore.

0

Le migliori pratiche per ottenere cluster di PostgreSQL sta usando:

  1. PostgreSQL partizione (intervallo o un elenco).
  2. Combina la partizione PostgreSQL e il tablespace in diversi SSD.
  3. Estensione FDW di PostgreSQL.

alternativi: Postgres-XL

Per Sharding (Bilanciamento del carico) è possibile utilizzare:

  1. Postgres-BDR
  2. Postgres-X2

Nota:

Lo scopo del cluster è il dataset grande e principalmente per il data warehouse.

Lo scopo di sharding è per loadbalance e principalmente utilizzato per il database ad alta transazione.

** ATTENZIONE **

evitare di pgpool perché troppi in testa che porterà problema in futuro.

Spero che questa risposta ti possa aiutare nello sviluppo futuro.