Я планирую использовать pgpool (v4.1.2) для его возможностей высокой доступности (пока не будет обновлен лог c нашего приложения). Таким образом, я отключил все возможности балансировки нагрузки:
load_balance_mode = 'off'
statement_level_load_balance = 'off'
Все запросы фактически отправляются на основной узел postgresql (v12) (что нормально).
$ show pool_nodes;
node_id |hostname|port|status|lb_weight| role |select_cnt|load_balance_node|replication_delay|replication_state|replication_sync_state|last_status_change
--------+--------+----+------+---------+-------+----------+-----------------+-----------------+-----------------+----------------------+--------------------+
0 | pg01 |5432| up |0.000000 |primary| 63425 | true | 0 | | | 2020-07-13 10:42:25
1 | pg02 |5432| up |1.000000 |standby| 0 | false | 0 | | | 2020-07-13 10:42:25
Но, Я заметил, что соединения создаются даже против вторичного (резервного узла), а num_init_children фактически равномерно распределяется между обоими внутренними узлами. Это приводит к тому, что в конечном итоге я получаю сообщение об ошибке «Извините, слишком много клиентов уже».
Есть ли способ «принудительно» инициализировать соединение только с основным узлом?
Или это означает , Я должен учитывать каждый серверный узел в кластере при вычислении num_init_children + max_pool?
Допустим, у меня есть требования к подключению к БД 300 (большинство из них объединены приложением, поэтому они будут оставаться подключенными и простаивать) , и два узла Postgres setup (первичная и потоковая реплика).
Должен ли я тогда настраивать 600 num_init_children + max_pool в моем случае? И если да, то что происходит с соединениями, когда один из узлов выходит из строя - будут ли все 600 из них созданы на последнем онлайн-сервере postgresql (дальнейшее увеличение требований к параметру max_connection в базе данных postgresql)?