Allora dopo tante ricerche e dopo averci sbattuto abbastanza il capo, sono riuscito a creare un sistema di replicazione con PgPool2 e PostgreSQL. Devo dire che il sistema funziona molto bene e avendo dato il load balance dei SELECT i carichi lavori risultano essere correttamente distribuiti. L’unica pecca di PgPool2 è che nella modalità replicazione non accetta da parte dei client le password in md5 ma solamente in cleartext.

Per prima cosa installiamo il PostgreSQL nei due server e creiamo un superutente pgpool con un sua password

Installiamo pgpool2 ed andiamo a configurare il file pgpool.conf ( nano /etc/pgpool.conf )

Andiamo a modificare le direttive:

listen_addresses = ‘127.0.0.1’ #indirizzo_ip_dove_ascoltare

port = 5433 #la porta dove ascoltare preferibilmente differente dalla porta di PostgreSQL 5432

replicate_select = true

replication_mode = true

fatto questo nel file inseriamo le direttive per la replicazione

# system DB info
system_db_hostname = ‘127.0.0.1’
system_db_port = 5432
system_db_dbname = ‘pgpool’
system_db_schema = ‘pgpool_catalog’
system_db_user = ‘pgpool’
system_db_password = ‘767d39dfd8d5f68fc30ffadb06749ae1’  #password in md5 del super utente creato prima
backend_hostname0 = ‘192.168.10.1’
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = ‘192.168.10.2’
backend_port1 = 5432
backend_weight1 = 1

 

far partire pgpool2 e se tutto è stato configurato correttamente la replicazione dovrebbe partire.

Se avete dubbi e/o richieste lasciatemi un commento.

Alcune volte capita di dimenticare la password del super utente postgres in un database PostgreSQL … per resettare la password procediamo nel seguente modo:

  1. loggarsi nel sistema e prendere i privilegi del super utente root
  2. eseguire il comando: su – postgres
  3. eseguire il comando: psql -d template1
  4. eseguire il comando: ALTER USER postgres WITH ENCRYPTED PASSWORD 'nuova_password';
  5. uscire da psql con il comando: \q
  6. riavviare il server:/etc/init.d/postgresql-8.4 restart (esempio fatto su una distribuzione su base debian con PostgreSQL 8.4 installato)

e il gioco è fatto

Allora oggi mi è capitato di risolvere un problema su un sistema di replicazione e spero che questo post sia utile a qualsiasi developer. Il sistema funzionava e le replicazioni erano corrette, ma si aveva un problema durante la creazione delle tabelle con OID. Il fatto è che il contatore non so come mai nei due server non era lo stesso, perciò al CREATE TABLE nel serverA si aveva OID xxx e nel server B si aveva yyyy e nel momento che si andava ad operare sulla tabella appena creata si aveva l’errore: backend mismatch

Per prima cosa occorre trovare nel server l’OIDS massimo … se l’errore lo avete come me nella creazione dei database, ecco la query:

SELECT oid,* from pg_database ;

Trovato il numero massimo per allineare l’OID dei due server (la guida è stata fatta per una debian/ubuntu e per postgreSQL 8.4, se avete una versione differente al 4 mettete la vostra versione).

  1. Arrestare PgPool
  2. collegarsi ai server della replicazione e stoppare postgreSQL /etc/init.d/postgresql-8.4 stop
  3. andare nella cartella bin di PostgreSQL cd /usr/lib/postgresql/8.4/bin/
  4. prendere i privilegi di postgres su postgres
  5. eseguire il seguente comando ./pg_resetxlog -o nuovo_OID /directory/dove/si/trova/la/datadir/di/postgresql
  6. Riavviate i server della replicazione
  7. Avviare PgPool

 

Lascio il collegamento al sito ufficiale di PostgreSQL per il comando pg_resetxlog ( http://www.postgresql.org/docs/8.2/static/app-pgresetxlog.html )