Skip to content

Commit

Permalink
Make it compatible with rails
Browse files Browse the repository at this point in the history
  • Loading branch information
elcuervo committed Jan 10, 2023
1 parent 8735635 commit fac4660
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 31 deletions.
Binary file modified bin/start-pgpool
Binary file not shown.
6 changes: 4 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@ services:
depends_on:
- leader
environment:
- PGPOOL_ENABLE_LOAD_BALANCING=yes
- PGPOOL_ENABLE_STATEMENT_LOAD_BALANCING=yes
- PGPOOL_BACKEND_NODES=0:leader:5432:4:primary:ALWAYS_PRIMARY,1:follower:5432:6:replica
- PGPOOL_POSTGRES_USERNAME=postgres
- PGPOOL_POSTGRES_PASSWORD=s3cret
- PGPOOL_ADMIN_USERNAME=admin
- PGPOOL_ADMIN_PASSWORD=s3cret
- PGPOOL_ENABLE_LOAD_BALANCING=yes
- PGPOOL_ENABLE_STATEMENT_LOAD_BALANCING=yes
- PGPOOL_NUM_INIT_CHILDREN=10
- PGPOOL_MAX_POOL=1
- PGPOOL_SR_CHECK_USER=postgres
- PGPOOL_SR_CHECK_PASSWORD=s3cret
volumes:
Expand Down
5 changes: 5 additions & 0 deletions src/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module github.com/unsplash/heroku-buildpack-pgpool

go 1.18

require github.com/chonla/format v0.0.0-20220105105701-1119f4a3f36f
2 changes: 2 additions & 0 deletions src/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
github.com/chonla/format v0.0.0-20220105105701-1119f4a3f36f h1:VraJz0cds4znlSPjx7BrZB1Foh9nlJkElf3JVdgVxCA=
github.com/chonla/format v0.0.0-20220105105701-1119f4a3f36f/go.mod h1:MNh8MDemhaPsRiivwCWNTCsu0tYQzRY4OvfvREfMRQg=
Empty file added src/pgpool.conf
Empty file.
99 changes: 70 additions & 29 deletions src/start-pgpool.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"crypto/md5"
"fmt"
"github.com/chonla/format"
"log"
"net"
"net/url"
Expand Down Expand Up @@ -35,7 +36,8 @@ func main() {
signal.Ignore(syscall.SIGINT)
signal.Notify(sigterm, syscall.SIGTERM)

pgpool := run(true, "/app/.apt/usr/sbin/pgpool", "-n", "-f", "/app/vendor/pgpool/pgpool.conf")
pgpool := run(true, "/app/.apt/usr/sbin/pgpool", "-n", "-f", "/app/vendor/pgpool/pgpool.conf", "-a", "/app/vendor/pgpool/pool_hba.conf")

defer pgpool.Process.Kill()
wg.Add(1)

Expand Down Expand Up @@ -85,17 +87,7 @@ func configure() {
}

func configurePgpoolConf() {
configSource := os.Getenv("PGPOOL_CONFIG_SOURCE")

if configSource == "" {
configSource = "/app/.apt/usr/share/pgpool2/pgpool.conf"
}

pgpoolConf, err := os.ReadFile(configSource)

if err != nil {
log.Fatal(err)
}
var pgpoolConf []byte

pgpoolConf = append(pgpoolConf, `
socket_dir = '/tmp'
Expand All @@ -117,22 +109,47 @@ func configurePgpoolConf() {
statementLoadBalance = "off"
}

pgpoolConf = append(pgpoolConf, fmt.Sprintf(`
maxPool := os.Getenv("PGPOOL_MAX_POOL")

if maxPool == "" {
maxPool = "15"
}

var params = map[string]interface{}{
"user": user,
"database": database,
"load_balance": statementLoadBalance,
"max_pool": maxPool,
}

pgpoolConf = append(pgpoolConf, format.Sprintf(`
backend_clustering_mode = 'streaming_replication'
disable_load_balance_on_write = 'transaction'
load_balance_mode = 'on'
enable_pool_hba = 'on'
sr_check_period = 0
sr_check_user = '%[1]s'
sr_check_database = '%[2]s'
max_pool = %<max_pool>s
health_check_user = '%[1]s'
health_check_database = '%[2]s'
health_check_period = 0
sr_check_user = '%<user>s'
sr_check_database = '%<database>s'
sr_check_period = 30
statement_level_load_balance = '%[3]s'
`, user, database, statementLoadBalance)...)
health_check_user = '%<user>s'
health_check_period = 5
health_check_database = '%<database>s'
statement_level_load_balance = '%<load_balance>s'
allow_sql_comments = true
`, params)...)

if os.Getenv("PGPOOL_DEBUG") != "" {
pgpoolConf = append(pgpoolConf, `
log_destination = 'stderr'
log_statement = 'on'
log_per_node_statement = 'on'
`...)
}
}

weight := os.Getenv(fmt.Sprintf("PGPOOL_BACKEND_NODE_%d_WEIGHT", i))
Expand All @@ -147,22 +164,46 @@ func configurePgpoolConf() {
flag = "ALLOW_TO_FAILOVER"
}

pgpoolConf = append(pgpoolConf, fmt.Sprintf(`
backend_hostname%[1]d = '%[2]s'
backend_port%[1]d = %[3]s
backend_weight%[1]d = %[4]s
backend_flag%[1]d = '%[5]s'
backend_data_directory%[1]d = 'data%[1]d'
`, i, host, port, weight, flag)...)
var data = map[string]interface{}{
"index": i,
"host": host,
"port": port,
"weight": weight,
"flag": flag,
}

pgpoolConf = append(pgpoolConf, format.Sprintf(`
backend_hostname%<index>d = '%<host>s'
backend_port%<index>d = %<port>s
backend_weight%<index>d = %<weight>s
backend_flag%<index>d = '%<flag>s'
backend_data_directory%<index>d = 'data%<index>d'
`, data)...)
}

// This is helpful to debig the file
// This is helpful to debug the file
configTarget := os.Getenv("PGPOOL_CONFIG_TARGET")
hbaTarget := os.Getenv("PGPOOL_HBA_TARGET")

if configTarget == "" {
configTarget = "/app/vendor/pgpool/pgpool.conf"
}

if hbaTarget == "" {
hbaTarget = "/app/vendor/pgpool/pool_hba.conf"
}

hba := `
local all all trust
host all all 127.0.0.1/32 trust
`

err := os.WriteFile(hbaTarget, []byte(hba), 0600)

if err != nil {
log.Fatal(err)
}

err = os.WriteFile(configTarget, pgpoolConf, 0600)

if err != nil {
Expand Down

0 comments on commit fac4660

Please sign in to comment.