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