Domanda

sto testando la tolleranza ai guasti di un sistema di ActiveMQ configurato come JDBC Master / Slave. In questa configurazione c'è un database Postgres e due mediatori - uno è il broker maestro, l'altro è un broker di schiavo. Il modo in cui questo meccanismo funziona è il maestro tira fuori un blocco esclusivo su un tavolo nel db. Lo schiavo cerca di fare anche questo e aspetta fino a quando il blocco diventa disponibile. Se il maestro muore, il blocco dovrebbe essere rilasciato e lo schiavo si farà carico. Tuttavia, se il padrone perde la connettività di rete con il database, il blocco è mai uscito con un conseguente scenario di stallo. Ciò che sembra essere richiesto qui è un modo per dire Postgres per rilasciare automaticamente il blocco, se non rinnovati entro un determinato periodo di tempo. Il POSA 3 libro di modelli di progettazione chiama questo il modello di Leasing. E 'possibile ottenere Postgres per fare questo? In caso contrario, non gli altri fornitori di database supportano?

È stato utile?

Soluzione

Questo problema di connessione non è una situazione di stallo, questa è perduto.

Un deadlock si verifica quando due transazioni tentano di bloccare le risorse precedentemente bloccati da un l'altro. PostgreSQL rileva queste situazioni.

Nel tuo caso, master blocca una risorsa, attende slave per master, e attende master per l'input dell'utente, che non ha mai ricevuto, perché si perde la connessione.

Ogni volta PostgreSQL rileva una connessione persa, è rollback automaticamente la sua operazione.

Per controllare il rilevamento della perdita di connessione, è possibile utilizzare il seguente PostgreSQL collegamento :

  

tcp_keepalives_idle (integer)

     

Su sistemi che supportano l'opzione socket TCP_KEEPIDLE, specifica il numero di secondi tra l'invio keepalive su una connessione inattivo. Un valore di zero utilizza il default del sistema. Se TCP_KEEPIDLE non è supportato, questo parametro deve essere pari a zero. Questo parametro viene ignorato per le connessioni effettuate tramite un socket di dominio Unix.

     

tcp_keepalives_interval (integer)

     

Su sistemi che supportano l'opzione socket TCP_KEEPINTVL, specifica per quanto tempo, in secondi, di attesa per una risposta a un keepalive prima di ritrasmettere. Un valore di zero utilizza il default del sistema. Se TCP_KEEPINTVL non è supportato, questo parametro deve essere pari a zero. Questo parametro viene ignorato per le connessioni effettuate tramite un socket di dominio Unix.

     

tcp_keepalives_count (integer)

     

Su sistemi che supportano l'opzione socket TCP_KEEPCNT, specifica quanti keepalives può essere perso prima che la connessione viene considerato morto. Un valore di zero utilizza il default del sistema. Se TCP_KEEPCNT non è supportato, questo parametro deve essere pari a zero. Questo parametro viene ignorato per le connessioni effettuate tramite un socket di dominio Unix.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top