Hola lista

No llego el anterior correo,  lo reenvío..
---------- Mensaje reenviado ----------
De: "Hellmuth Vargas" <hiv...@gmail.com>
Fecha: ene 29, 2015 2:49 AM
Asunto: consulta sobre sequencias globales de BDR
Para: "Lista Postgres ES" <pgsql-es-ayuda@postgresql.org>
Cc:

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

Responder a