Ver parte 1.

Ahora vamos a probar como el pgbouncer puede dirigirnos nuestras sesiones al nodo r/w (primary) o a los r/o (secondary).

En nuestro caso el primary es el nodo postgres2 y los secondary son el postgres1 y postgres3.

Se pueden tener configuradas diferentes entradas en el fichero /etc/pgbouncer/pgbouncer.database.ini para apuntar a la base de datos en modo r/w y r/o.

Sería algo así:

[root@postgres4 ~]# cat /etc/pgbouncer/pgbouncer.database.ini
[databases]
appdb-rw= host=postgres2 dbname=appdb
appdb-ro= host=postgres1 dbname=appdb

 

Para la prueba de r/w configuramos el fichero /etc/pgbouncer/pgbouncer.database.ini a la primary:

[root@postgres4 ~]# cat /etc/pgbouncer/pgbouncer.database.ini
[databases]
appdb= host=postgres2 dbname=appdb

 

Y reiniciamos el pgbouncer:

[root@postgres4 ~]# systemctl restart pgbouncer

 

Hacemos la prueba de crear una tabla:

[postgres@postgres4 ~]$ psql 'host=192.168.0.104 user=appdb port=6432'
psql (13.1)
Type "help" for help.

192.168.0.104:6432; appdb@appdb # create table prueba2 (columna char(20));
CREATE TABLE

192.168.0.104:6432; appdb@appdb # \d prueba2

Table "public.prueba2"
+---------+---------------+-----------+----------+---------+
| Column | Type | Collation | Nullable | Default |
+---------+---------------+-----------+----------+---------+
| columna | character(20) | | | |
+---------+---------------+-----------+----------+---------+

 

Para la prueba de r/o modificamos el fichero /etc/pgbouncer/pgbouncer.database.ini:

[root@postgres4 ~]# cat /etc/pgbouncer/pgbouncer.database.ini
[databases]
appdb= host=postgres1 dbname=appdb

 

Reiniciamos el pgbouncer:

[root@postgres4 ~]# systemctl restart pgbouncer

 

Y hacemos la prueba de crear una tabla lo que nos da error al ser r/o y nos deja consultar la creada anteriormente:

[postgres@postgres4 ~]$ psql 'host=192.168.0.104 user=appdb port=6432'

psql (13.1)
Type "help" for help.

192.168.0.104:6432; appdb@appdb # create table prueba3 (columna char(20));
ERROR: cannot execute CREATE TABLE in a read-only transaction

192.168.0.104:6432; appdb@appdb # \d prueba2

Table "public.prueba2"
+---------+---------------+-----------+----------+---------+
| Column | Type | Collation | Nullable | Default |
+---------+---------------+-----------+----------+---------+
| columna | character(20) | | | |
+---------+---------------+-----------+----------+---------+

 

Ver parte 3