{"id":17393,"date":"2026-02-26T18:03:44","date_gmt":"2026-02-26T12:33:44","guid":{"rendered":"https:\/\/www.skynats.com\/blog\/?p=17393"},"modified":"2026-02-26T18:03:47","modified_gmt":"2026-02-26T12:33:47","slug":"how-to-set-up-pgpool-ii-for-postgresql-on-ubuntu","status":"publish","type":"post","link":"https:\/\/www.skynats.com\/blog\/how-to-set-up-pgpool-ii-for-postgresql-on-ubuntu\/","title":{"rendered":"How to Set Up Pgpool-II for PostgreSQL on Ubuntu"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Pgpool-II is a powerful middleware that sits between PostgreSQL clients and database servers. It provides connection pooling, load balancing, health checks, and automatic failover, making it a popular choice for PostgreSQL high-availability architectures. In this blog we&#8217;ll learn how to set up Pgpool-II for PostgreSQL on Ubuntu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\" id=\"h-step-1-install-pgpool-ii\"><strong>Step 1: Install Pgpool-II<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>apt install pgpool2<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\" id=\"h-step-2-configure-postgresql-client-authentication\"><strong>Step 2: Configure PostgreSQL Client Authentication<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pgpool-II must be allowed to connect to PostgreSQL servers. Edit the PostgreSQL pg_hba.conf file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/etc\/postgresql\/16\/main\/pg_hba.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following entry:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>host all all IP_ADDRESS\/16 trust<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\"><strong>Why this is required<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Allows Pgpool-II to connect to PostgreSQL nodes<\/li>\n\n\n\n<li>CIDR block covers both master and replica<\/li>\n\n\n\n<li>Uses trust internally (authentication will be enforced at Pgpool-II level)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In production, consider using md5 or scram-sha-256 instead of trust.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\"><strong>Step 3: Configure Pgpool-II (pgpool.conf)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open the main Pgpool-II configuration file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/etc\/pgpool2\/pgpool.conf<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-3-1-listen-on-all-interfaces\"><strong>3.1 Listen on All Interfaces<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>listen_addresses = '*'\nport = 9999<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pgpool-II will now accept connections from any interface on port 9999.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-3-2-register-backend-nodes\"><strong>3.2 Register Backend Nodes<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading has-small-font-size\" id=\"h-master-node-backend-0\">Master Node (backend 0)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>backend_hostname0 = 'IP_ADDRESS'\nbackend_port0 = 5432\nbackend_weight0 = 0\nbackend_data_directory0 = '\/var\/lib\/postgresql\/16\/main'\nbackend_flag0 = 'ALLOW_TO_FAILOVER'\nbackend_application_name0 = 'server0'<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading has-small-font-size\" id=\"h-key-parameters-explained\"><strong>Key Parameters Explained<\/strong><\/h4>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Parameter<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Description<\/strong><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">backend_hostname<\/td><td class=\"has-text-align-left\" data-align=\"left\">IP\/hostname of PostgreSQL server<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">backend_port<\/td><td class=\"has-text-align-left\" data-align=\"left\">PostgreSQL listening port<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">backend_weight<\/td><td class=\"has-text-align-left\" data-align=\"left\">Traffic distribution ratio<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">backend_data_directory<\/td><td class=\"has-text-align-left\" data-align=\"left\">PostgreSQL data directory<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">backend_flag<\/td><td class=\"has-text-align-left\" data-align=\"left\">Enables failover<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">backend_application_name<\/td><td class=\"has-text-align-left\" data-align=\"left\">Logical node identifier<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can add more nodes by continuing the numbering (backend_hostname1, backend_hostname2 etc.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\"><strong>Step 4: Enable Pgpool-II Authentication<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Since PostgreSQL itself is using trust, we enforce password authentication at Pgpool-II.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\"><strong>4.1 Enable Pool HBA and Password File<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>enable_pool_hba = on\npool_passwd = 'pool_passwd'<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\" id=\"h-step-5-configure-health-checks\"><strong>Step 5: Configure Health Checks<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>health_check_period = 10\nhealth_check_timeout = 20\nhealth_check_user = 'postgres'\nhealth_check_password = ''\nhealth_check_database = 'postgres'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\"><strong>Why health checks matter<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Periodically verifies node availability<\/li>\n\n\n\n<li>Automatically removes unhealthy nodes<\/li>\n\n\n\n<li>Restores nodes when they recover<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\"><strong>Step 6: Create Pgpool-II Passwords (pool_passwd)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Generate a password entry for PostgreSQL users:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pg_md5 --md5auth -f \/etc\/pgpool2\/pgpool.conf -u postgres -p<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You\u2019ll be prompted for a password.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This command:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Encrypts the password using MD5<\/li>\n\n\n\n<li>Stores it in \/etc\/pgpool2\/pool_passwd<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/pgpool2\/pool_passwd<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\"><strong>Step 7: Configure pool_hba.conf<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/etc\/pgpool2\/pool_hba.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>host all all 0.0.0.0\/0 md5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This allows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Connections from any client<\/li>\n\n\n\n<li>Password authentication via MD5<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\"><strong>Step 8: Restart Pgpool-II<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apply all changes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl restart pgpool2.service<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\"><strong>Step 9: Connect Through Pgpool-II<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use psql just like <a href=\"https:\/\/www.postgresql.org\/\" target=\"_blank\" rel=\"noopener\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">PostgreSQL<\/mark><\/a>, but with port 9999:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>psql -p 9999 -U postgres -W<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once connected, verify backend status:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SHOW POOL_NODES;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This command displays:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Node roles<\/li>\n\n\n\n<li>Load balancing status<\/li>\n\n\n\n<li>Health check results<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\"><strong>Final Thoughts<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pgpool-II provides a flexible and production-ready solution for PostgreSQL load balancing and high availability. With proper authentication, logging, and health checks, it becomes a powerful control layer between your applications and databases.<br>Setting up and configuring high-availability database environments can be complex, especially when performance, failover handling, and production stability are critical. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you need expert assistance to Set up Pgpool-II for PostgreSQL on Ubuntu, our experienced engineers are here to help. With comprehensive <a href=\"https:\/\/www.skynats.com\/devops-support\">DevOps Support Services<\/a>, we ensures seamless deployment, optimized configuration, load balancing, replication management, and ongoing monitoring tailored to your infrastructure.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pgpool-II is a powerful middleware that sits between PostgreSQL clients and database servers. It provides connection pooling, load balancing, health checks, and automatic failover, making it a popular choice for PostgreSQL high-availability architectures. In this blog we&#8217;ll learn how to set up Pgpool-II for PostgreSQL on Ubuntu. Step 1: Install Pgpool-II Step 2: Configure PostgreSQL [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[1064,1245,1246,302],"class_list":["post-17393","post","type-post","status-publish","format-standard","hentry","category-blog","tag-devops-support-services","tag-pgpool-ii","tag-postgresql-on-ubuntu","tag-server-management-services"],"_links":{"self":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts\/17393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/comments?post=17393"}],"version-history":[{"count":1,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts\/17393\/revisions"}],"predecessor-version":[{"id":17394,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts\/17393\/revisions\/17394"}],"wp:attachment":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/media?parent=17393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/categories?post=17393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/tags?post=17393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}