Hola, Jaime. Muy amable por su respuesta. Estoy totalmente de acuerdo que desactivar el autovacuum es dar un paso atrás tecnológicamente hablando.
La solución de activar hot_standby_feedback la había descartado por el impacto en la replicación, pero gracias a su explicación, creo ahora mismo que sería la mejor solución. Solamente me queda una duda: como comentabamos los parámetros max_standby_*_delay, tiene sentido que en la instancia sincrona tiendan a cero y en la asincrona sean un poco más laxos. El problema de "ERROR: cancelando la sentencia debido a un conflicto con la recuperación" ¿solo afecta cuando una sentencia lanzada en la standby ve modificado su MVCC por la modificación de la réplica procedente de la primaria, es decir insert, updates, y deletes, o solo se ve afectada cuando en la replicación se eliminan filas muertas producto del autovacuum en la primaria? Si activamos el parámetro hot_standby_feedback creo que funcionaría así: 1 - Se lanza consulta en la standby. 2 - se lanza autovacuum en la primaria. 3 - La standby le indica que hay una sentencia sobre una tabla especifica y sobre ella no hará limpieza. 4 - Se hace un insert, un update, y un delete sobre la misma tabla en la primaria. 5 - Se replican los cambios automáticamente. 6 - La standby esperará a que resuelva la sentencia el tiempo que indique el parámetro max_standby_*_delay. 7 - Si la sentencia dura más que el parámetro... ¿Aquí que sucede? a) No hay fallo alguno pues la replicación de estos datos en la tabla por la que corre la sentencia no afecta a las filas que va a leer la sentencia en curso de la standby. El update podrá afectar a una fila leída de esta sentencia, pero recogerá el valor que esté almacenado para el mismo MVCC. b) Provoca el mismo fallo que al principio, pues al realizar cualquier cambio sobre la tabla, se recalcula el hash de las filas, y se actualiza ese dato del MVCC en cada cabecera de la fila. c) Si es otro escenario que no planteo, por favor me ayudaría mucho que me lo plantease para poder entenderlo. Muchas gracias por tu contestación Un saludo. Saludos. Iván Poyatos Luque Área Bases de Datos -----Mensaje original----- De: Jaime Casanova <jcasa...@systemguards.com.ec> Enviado el: lunes, 5 de junio de 2023 23:27 Para: Iván Poyatos Luque <ipoyat...@hiberus.com> CC: pgsql-es-ayuda@lists.postgresql.org Asunto: Re: Consultas en nodos standby con HA On Wed, May 31, 2023 at 7:12 AM Iván Poyatos Luque <ipoyat...@hiberus.com> wrote: > > Tengo un sistema con un nodo primario, y dos hot_standby, uno con streaming > síncrono y otro asíncrono. La versión es 9.3. > Empezaré por mencionar que 9.3 está obsoleto hace varios años atras (Nov 8, 2018): https://www.postgresql.org/support/versioning/ > > En los nodos standby se lanzan consultas de solo lectura y aquellas que > superan el umbral establecido por el parámetro max_standby_archive_delay o > max_standby_streaming_delay provocan un conflicto de versión de snapshot que > termina reflejándose en la pg_stat_database_conflicts. > > Estos nodos de standby son la HA, por lo tanto, es también un requisito que > estén actualizados lo antes posible. > > > Hemos deshabilitado el autovacuum en la primaria para que no replique la > limpieza de las filas muertas en las standby, por lo tanto, utilizar el > parámetro hot_standby_feedback creemos que carece de sentido ya que no existe > tal limpieza. Hemos programado una tarea que realizará un vacuum a las 3 de > la madrugada. > Nunca es buena idea desactivar el autovacuum, conozco montones de personas que darán una explicación clara y creible de porque su caso es distinto y apagar el autovacuum para ellos es "la" solución. No lo es. Nunca. Apagues. El. Autovacuum. Ahora, te explico porque tu solución está tomando la ruta equivocada. Al apagar el autovacuum y ejecutar un VACUUM a las 3am estás causando que la limpieza de registros ocurra solo a esa hora *para todas las tablas*. Mientras que hot_standby_feedback en on, solo evitará que el primario limpie los registros en las tablas que se hayan modificado mientras la consulta más antigua en la réplica aún se esté ejecutando (es decir, esos registros modificados en esa ventana de tiempo no se podrán limpiar los más antiguos si). > > Los parámetros max_standby_archive_delay o max_standby_streaming_delay > podemos subirlos a valores altos como 10 minutos, pero siempre tendrás el > riesgo de que, si una sentencia dura más, tendrás un conflicto. Sin entrar a > valorar el rendimiento de una consulta de 10 minutos, es solo un ejemplo. > Si tienes un nodo standby sincrónico, supongo que tus scripts para failover lo consideran el primer candidato en caso de que falle el primario. puedes tener valores distintos para los parámetros max_standby_*_delay en cada servidor, considerando esa diferencia > > Vemos además un riesgo añadido, el nodo con replicación síncrona tiene el > parámetro synchronous_commit a on, es decir que la primaria antes de dar el > ok a la transacción esperará que el dato esté replicado en la standby > sincrona. Es decir que aumentar el parámetro max_standby_streaming_delay en > la standby síncrona creemos que puede afectar al rendimiento en la primaria, > pues si coincide con una consulta en la standby, no se aplicarán los cambios > de la replicación hasta que la consulta finalice, o expire el tiempo indicado > en este parámetro, y el cliente vería retrasado el commit de su transacción. > no. synchronous_commit, al menos en 9.3, solo asegura, cuando hay servidores sincrónicos, que la transacción se haya replicado hasta la memoria del standby (remote_write) o hasta el disco (en el WAL pertinente; on); pero no espera a que se apliquen los cambios (que se hagan visibles). Esto significa que los parámetros max_standby_*_delay y synchronous_commit no se afectan entre ellos, el rendimiento que tienes ahora será el mismo. A partir de 9.6 se agregú un valor remote_apply, que ese si puede afectar el rendimiento en el primario. -- Jaime Casanova SYSTEMGUARDS S.A. Director de servicios profesionales