Hola Lista: Estoy realizado pruebas con BDR de PostgreSQL anunciado recientemente, comparto una hilo de conversación que sostuve con Jaime Casanova, entre otros, sobre el tema especifico del comportamiento de secuencias globales. La inquietud surge porque trabajo en un call center donde se realizan miles de transacciones por segundo de diferentes clientes a un único cluster de base de datos PostgreSQL (con replicacion asincronica obviamente), y por balanceo de carga, disponibilidad, seguridad entre otros, seria extraordinario contar con la replicacion multimaster.
------------------------------------------------------------------------------------------------------------------ Buenos días Actualmente me encuentro realizando una prueba con BDR, para esto he seguido las pautas descritas en https://wiki.postgresql.org/wiki/BDR_Quick_Start luego ejecute las siguientes sentencias: bdrdemo=# CREATE SEQUENCE seq_tabla2 USING bdr; CREATE SEQUENCE bdrdemo=# create table prueba2(id bigint primary key default nextval('seq_tabla2'), origen text); CREATE TABLE --servidor 1 bdrdemo=# insert into prueba2(origen) select 'AAAA' from generate_series(0,1) as a(id); INSERT 0 2 --servidor 2 bdrdemo=# insert into prueba2(origen) select 'BBBB' from generate_series(0,1) as a(id); INSERT 0 2 -- Acontinuación envío estas dos sentencias cada una en cada uno de los servidores: --servidor 1 bdrdemo=# insert into prueba2(origen) select 'AAAA' from generate_series(0,20000) as a(id); ERROR: could not find free sequence value for global sequence public.seq_tabla2 HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. --servidor 2 bdrdemo=# insert into prueba2(origen) select 'BBBB' from generate_series(0,20000) as a(id); ERROR: could not find free sequence value for global sequence public.seq_tabla2 HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. y genera el error que hay se presenta, toca esperar un buen tiempo para que vuelva a estar disponible -- servidor 1 bdrdemo=# select nextval('seq_tabla2'); ERROR: could not find free sequence value for global sequence public.seq_tabla2 HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. bdrdemo=# select nextval('seq_tabla2'); ERROR: could not find free sequence value for global sequence public.seq_tabla2 HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. bdrdemo=# select nextval('seq_tabla2a'); nextval --------- 10001 (1 row) -- servidor 2 bdrdemo=# select nextval('seq_tabla2'); ERROR: could not find free sequence value for global sequence public.seq_tabla2 HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. bdrdemo=# select nextval('seq_tabla2'); nextval ---------- 14314001 (1 row) -- pero trato nuevamente de enviar el insert masivo y vuelve a generar error: -- servidor 1 bdrdemo=# insert into prueba2(origen) select 'AAAA' from generate_series(0,20000) as a(id); ERROR: could not find free sequence value for global sequence public.seq_tabla2 HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. -- servidor 2 bdrdemo=# insert into prueba2(origen) select 'BBBB' from generate_series(0,20000) as a(id); ERROR: could not find free sequence value for global sequence public.seq_tabla2 HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. La pregunta es si este comportamiento es normal? o debo configurar algo adicional o estoy haciendo algo mal? LE agradezco de antemano su atención, colaboración y tiempo ---------------------------------------------------------------------------------------------------------------------- Jaime Casanova respondio: > ---------- Forwarded message ---------- > From: Hellmuth Vargas > To: > Cc: > Date: Mon, 26 Jan 2015 21:49:55 -0500 > Subject: consulta sobre BDR > [...] >> >> -- servidor 1 >> >> bdrdemo=# insert into prueba2(origen) select 'AAAA' from generate_series(0,20000) as a(id); >> ERROR: could not find free sequence value for global sequence public.seq_tabla2 >> HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. >> >> >> -- servidor 2 >> bdrdemo=# insert into prueba2(origen) select 'BBBB' from generate_series(0,20000) as a(id); >> ERROR: could not find free sequence value for global sequence public.seq_tabla2 >> HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists. >> >> >> La pregunta es si este comportamiento es normal? o debo configurar algo adicional o estoy haciendo algo mal? Le agradezco de antemano su atención, colaboración y tiempo. Mil Gracias >> Si. Completamente normal. Como se explica en https://wiki.postgresql.org/wiki/BDR_Global_Sequences las secuencias globales deben coordinarse entre todos los nodos y eso toma tiempo. Opciones que se sugieren: - Secuencias locales, con un offset. Algo como: DEFAULT (('2' || nextval(secuencia))::bigint) - UUID - Una llave natural coordinada externamente ------------------------------------------------------------------------------------------------------------- 2015-01-28 9:33 GMT-05:00 Hellmuth Vargas: > Buenos días Jaime > > Ups!! Osea que aún no es aconsejable para entornos de inserción > /actualización con mucha concurrencia... Voy a explorar las alternativas > que me indica.. Le agradezco mucho su tiempo y atención!!! > No creo que ese comportamiento vaya a cambiar, con secuencias globales (secuencias unicas en *todos* los nodos) tienes dos alternativas: 1.- Cada nodo escoge un id que se garantice uno único cada vez, lo que implica bloquear la secuencia temporalmente en los otros nodos mientras se sincroniza, y es casi seguro que habrá conflictos frecuentes (por ejemplo si dos nodos incrementan la secuencia al mismo tiempo) a menos que haya un coordinador que causa aun mas problemas. 2.- Se reserva un rango de id's para cada nodo y solo es necesario molestar a los otros nodos cuando se requiere solicitar un nuevo rango. En ese caso pasará un momento para que la secuencia este disponible otra vez. Me parece a mi que no tiene mucho sentido usar secuencias globales para cosas que incrementan de ese modo, pero no tendrás problemas con cosas como id de cliente y cosas así porque no ingresas 1 cliente cada segundo. En documentos igual no quieres usar secuencias globales por que no estará ordenado y habrá saltos. Si nos cuentas cual es el problema, de preferencia en la lista para que otros se beneficien, podrías encontrar una solución apropiada. -- Cordialmente, Ing. Hellmuth I. Vargas S. Esp. Telemática y Negocios por Internet Oracle Database 10g Administrator Certified Associate EnterpriseDB Certified PostgreSQL 9.3 Associate