PGDay.IT 2017 – 13 Ottobre 2017 - Milano 1 di 30
Patroni: PostgreSQL HA nel cloud
Lucio Grenzi
l.grenzi@gmail.com
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 2 di 30
Who I am
Delphi developer since 1999
IT Consultant 
Front end web developer
Postgresql addicted
      Nonantolando.blogspot.com
      lucio.grenzi
      lucio grenzi
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 3 di 30
AgendaAgenda
 Enterprise needs: high availability
 Cloud Databases?
 Patroni
 Data Synchonization: scalability vs performances
 Conclusion and final thoughts
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 4 di 30
Mission critical databaseMission critical database
High available
Replication
No human interaction for failover
Rapid deployment
https://www.flickr.com/photos/my_public_domain_photos/15400918696/
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 5 di 30
As a serviceAs a service
As a service
SaaS
IaaS
PaaS
BaaS
DbaaS ?
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 6 di 30
Cloud databasesCloud databases
Rapid deployment
Scalability 
Provider’s infrastructure optimization
Failover?
Flexibility?
Security?
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 7 di 30
Master is downMaster is down
Manual failover
Pg_rewind
 Require superuser access privileges
Automatic failover
One supervisor node?
Distributed supervisor nodes?
$ pg_rewind ­­target­pgdata=/var/lib/pgsql/9.6/master 
    ­­source­server="port=5432 user=postgres dbname=postgres"
$ pg_rewind ­­target­pgdata=/var/lib/pgsql/9.6/master 
    ­­source­server="port=5432 user=postgres dbname=postgres"
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 8 di 30
Patroni: an introductionPatroni: an introduction
Patoroni is a template for you to create your own
customized, high-availability solution using
Python and - for maximum accessibility - a
distributed configuration store like ZooKeeper,
etcd or Consul.
-https://github.com/zalando/patroni-
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 9 di 30
How Patroni worksHow Patroni works
Server
Client
HA Proxy
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 10 di 30
Distributed Configuration SystemDistributed Configuration System
Distributed key/value store
Like a directory tree
The state machine is kept in sync using Raft
Uses a discovery url
json/rest api
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 11 di 30
Directory treeDirectory tree
$ etcdctl ls / ­­recursive
/service
/service/pgdayitcluster
/service/pgdayitcluster/initialize
/service/pgdayitcluster/config
/service/pgdayitcluster/leader
/service/pgdayitcluster/optime
/service/pgdayitcluster/optime/leader
/service/pgdayitcluster/members
/service/pgdayitcluster/members/dbnode2
/service/pgdayitcluster/members/dbnode3
/service/pgdayitcluster/members/dbnode1
$ etcdctl ls / ­­recursive
/service
/service/pgdayitcluster
/service/pgdayitcluster/initialize
/service/pgdayitcluster/config
/service/pgdayitcluster/leader
/service/pgdayitcluster/optime
/service/pgdayitcluster/optime/leader
/service/pgdayitcluster/members
/service/pgdayitcluster/members/dbnode2
/service/pgdayitcluster/members/dbnode3
/service/pgdayitcluster/members/dbnode1
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 12 di 30
Etcd members detailEtcd members detail
 $ etcdctl get /service/testcluster/leader
dbnode2
$ etcdctl get /service/testcluster/members/dbnode2 | jq
{
  "role": "master",
  "state": "running",
  "conn_url": "postgres://172.17.0.3:5432/postgres",
  "api_url": "http://172.17.0.3:8008/patroni",
  "xlog_location": 67110528
}
$ etcdctl get /service/testcluster/members/dbnode1 | jq
{
  "role": "replica",
  "state": "running",
  "conn_url": "postgres://172.17.0.5:5432/postgres",
  "api_url": "http://172.17.0.5:8008/patroni",
  "xlog_location": 67110528
}
 $ etcdctl get /service/testcluster/leader
dbnode2
$ etcdctl get /service/testcluster/members/dbnode2 | jq
{
  "role": "master",
  "state": "running",
  "conn_url": "postgres://172.17.0.3:5432/postgres",
  "api_url": "http://172.17.0.3:8008/patroni",
  "xlog_location": 67110528
}
$ etcdctl get /service/testcluster/members/dbnode1 | jq
{
  "role": "replica",
  "state": "running",
  "conn_url": "postgres://172.17.0.5:5432/postgres",
  "api_url": "http://172.17.0.5:8008/patroni",
  "xlog_location": 67110528
}
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 13 di 30
ReplicaReplica
https://www.flickr.com/photos/roycin/4423082408/
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 14 di 30
Replication modesReplication modes
Patroni uses PostgreSQL streaming replication
By  default  Patroni  configures  PostgreSQL  for  asynchronous 
replication.
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 15 di 30
Asynchronous modeAsynchronous mode
Cluster  is  allowed  to  lose  some  committed  transactions  to 
ensure availability. 
When master server fails or becomes unavailable Patroni will 
automatically promote a sufficiently healthy standby to master.
maximum_lag_on_failover 
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 16 di 30
Synchronous replicationSynchronous replication
It  ensures  consistency  across  a  cluster  by  confirming  that 
writes  are  written  to  a  secondary  before  returning  to  the 
connecting client with a success.
It  is  not  guaranteed  zero  lost  transactions  under  all 
circumstances.
Add  to  the  parameters  section  of  your  YAML  configuration 
files:
synchronous_commit: "on"
synchronous_standby_names: "*"
synchronous_commit: "on"
synchronous_standby_names: "*"
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 17 di 30
Synchronous modeSynchronous mode
For  use  cases  where  losing  committed  transactions  is  not 
permissible
Patroni will not promote a standby unless it is certain that the 
standby  contains  all  transactions  that  may  have  returned  a 
successful commit status to client
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 18 di 30
Synchronous mode implementationSynchronous mode implementation
A node must be marked as the latest leader whenever it can 
accept write transactions.
A  node  must  be  set  as  the  synchronous  standby  in 
PostgreSQL  as  long  as  it  is  published  as  the  synchronous 
standby.
A node that is not the leader or current synchronous standby is 
not allowed to promote itself automatically.
synchronous_standby_names
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 19 di 30
HAProxyHAProxy
Patroni provides an HAProxy configuration
Used by your application in order to have a single endpoint for 
connecting to the cluster's leader
$ haproxy ­f haproxy.cfg
$ haproxy ­f haproxy.cfg
$ psql ­­host 127.0.0.1 ­­port 5000 postgres
$ psql ­­host 127.0.0.1 ­­port 5000 postgres
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 20 di 30
HAProxy.confHAProxy.conf
global
    maxconn 100
defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s
listen stats
    mode http
    bind *:7000
    stats enable
stats uri /
listen pgdayit
    bind *:5000
    option httpchk
    http­check expect status 200
    default­server inter 3s fall 3 rise 2 on­marked­down shutdown­sessions
    server postgresql_127.0.0.1_5432 127.0.0.1:5432 maxconn 100 check port 8008
    server postgresql_127.0.0.1_5433 127.0.0.1:5433 maxconn 100 check port 8009
global
    maxconn 100
defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s
listen stats
    mode http
    bind *:7000
    stats enable
stats uri /
listen pgdayit
    bind *:5000
    option httpchk
    http­check expect status 200
    default­server inter 3s fall 3 rise 2 on­marked­down shutdown­sessions
    server postgresql_127.0.0.1_5432 127.0.0.1:5432 maxconn 100 check port 8008
    server postgresql_127.0.0.1_5433 127.0.0.1:5433 maxconn 100 check port 8009
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 21 di 30
InterfacesInterfaces
API rest
patronictl
https://www.flickr.com/photos/oldstretch/1051796285/
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 22 di 30
API restAPI rest
GET /config : Get current version of dynamic configuration
PATCH  /config  :  Change  parameters  of  an  existing 
configuration
$ curl ­s localhost:8008/config
$ curl ­s localhost:8008/config
url ­s ­XPATCH ­d 
       '{"retry_timeout":5,"postgresql":{"parameters":{""max_wal_senders": “5”}}}'
rl ­s ­XPATCH ­d 
      '{"retry_timeout":5,"postgresql":{"parameters":{""max_wal_senders": “5”}}}'
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 23 di 30
API restAPI rest
PUT /config : full rewrite of an existing dynamic configuration 
unconditionally
$ curl ­s ­XPUT ­d 
        '{"maximum_lag_on_failover":1048576,
           "retry_timeout":10,
           "postgresql":
             {
             "use_slots":true,
             "use_pg_rewind":true,
             "parameters":
               {
               "hot_standby":"on",
               "wal_log_hints":"on",
               "wal_keep_segments":8,
               "wal_level":"hot_standby",
               "unix_socket_directories":".",
               "max_wal_senders":5
               }
             },
             "loop_wait":3,"ttl":20
        }' http://localhost:8008/config | jq
$ curl ­s ­XPUT ­d 
        '{"maximum_lag_on_failover":1048576,
           "retry_timeout":10,
           "postgresql":
             {
             "use_slots":true,
             "use_pg_rewind":true,
             "parameters":
               {
               "hot_standby":"on",
               "wal_log_hints":"on",
               "wal_keep_segments":8,
               "wal_level":"hot_standby",
               "unix_socket_directories":".",
               "max_wal_senders":5
               }
             },
             "loop_wait":3,"ttl":20
        }' http://localhost:8008/config | jq
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 24 di 30
API restAPI rest
POST  /reload:  change  patroni.yml  and  reload  at  runtime 
wtihout stop any service
$ curl ­s localhost:8008/reload
$ curl ­s localhost:8008/reload
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 25 di 30
PatronictlPatronictl
Usage: patronictl.py [OPTIONS] COMMAND [ARGS]...
Options:
  ­c, ­­config­file TEXT  Configuration file
  ­d, ­­dcs TEXT          Use this DCS
  ­­help                  Show this message and exit.
Commands:
  configure    Create configuration file
  dsn          Generate a dsn for the provided member,...
  edit­config  Edit cluster configuration
  failover     Failover to a replica
  flush        Flush scheduled events
  list         List the Patroni members for a given Patroni
  pause        Disable auto failover
  query        Query a Patroni PostgreSQL member
  reinit       Reinitialize cluster member
  remove       Remove cluster from DCS
  restart      Restart cluster member
  resume       Resume auto failover
  scaffold     Create a structure for the cluster in DCS
  show­config  Show cluster configuration
Usage: patronictl.py [OPTIONS] COMMAND [ARGS]...
Options:
  ­c, ­­config­file TEXT  Configuration file
  ­d, ­­dcs TEXT          Use this DCS
  ­­help                  Show this message and exit.
Commands:
  configure    Create configuration file
  dsn          Generate a dsn for the provided member,...
  edit­config  Edit cluster configuration
  failover     Failover to a replica
  flush        Flush scheduled events
  list         List the Patroni members for a given Patroni
  pause        Disable auto failover
  query        Query a Patroni PostgreSQL member
  reinit       Reinitialize cluster member
  remove       Remove cluster from DCS
  restart      Restart cluster member
  resume       Resume auto failover
  scaffold     Create a structure for the cluster in DCS
  show­config  Show cluster configuration
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 26 di 30
Patronictl failoverPatronictl failover
Manual failover
Promote a new master
atronictl.py failover <clustername>
er [dbnode2]:
idate ['dbnode1', 'dbnode3'] []:
should the failover take place (e.g. 2015­10­01T14:30)  [now]:
ou sure you want to failover cluster testcluster, demoting current master dbnode2? [
tronictl.py failover <clustername>
r [dbnode2]:
date ['dbnode1', 'dbnode3'] []:
hould the failover take place (e.g. 2015­10­01T14:30)  [now]:
u sure you want to failover cluster testcluster, demoting current master dbnode2? [y
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 27 di 30
SpiloSpilo
a  Docker  image  that  provides  PostgreSQL  and  Patroni 
bundled together
Multiple  Spilos  can  create  a  resilient  High  Available 
PostgreSQL cluster
You'll need to setup Spilo to create a database and roles for 
your application
$ psql ­h mypgdaydb ­p 5432 ­U admin ­d postgres
$ psql ­h mypgdaydb ­p 5432 ­U admin ­d postgres
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 28 di 30
RisorseRisorse
Patroni: https://github.com/zalando/patroni
Spilo:    https://github.com/zalando/spilo
Etcd:     https://github.com/coreos/etcd 
Raft:      https://raft.github.io/raft.pdf
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 29 di 30
Questions?Questions?
PGDay.IT 2017 – 13 Ottobre 2017 - Milano 30 di 30

Patroni: PostgreSQL HA in the cloud

  • 1.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 1 di 30 Patroni: PostgreSQL HA nel cloud Lucio Grenzi l.grenzi@gmail.com
  • 2.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 2 di 30 Who I am Delphi developer since 1999 IT Consultant  Front end web developer Postgresql addicted       Nonantolando.blogspot.com       lucio.grenzi       lucio grenzi
  • 3.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 3 di 30 AgendaAgenda  Enterprise needs: high availability  Cloud Databases?  Patroni  Data Synchonization: scalability vs performances  Conclusion and final thoughts
  • 4.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 4 di 30 Mission critical databaseMission critical database High available Replication No human interaction for failover Rapid deployment https://www.flickr.com/photos/my_public_domain_photos/15400918696/
  • 5.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 5 di 30 As a serviceAs a service As a service SaaS IaaS PaaS BaaS DbaaS ?
  • 6.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 6 di 30 Cloud databasesCloud databases Rapid deployment Scalability  Provider’s infrastructure optimization Failover? Flexibility? Security?
  • 7.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 7 di 30 Master is downMaster is down Manual failover Pg_rewind  Require superuser access privileges Automatic failover One supervisor node? Distributed supervisor nodes? $ pg_rewind ­­target­pgdata=/var/lib/pgsql/9.6/master      ­­source­server="port=5432 user=postgres dbname=postgres" $ pg_rewind ­­target­pgdata=/var/lib/pgsql/9.6/master      ­­source­server="port=5432 user=postgres dbname=postgres"
  • 8.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 8 di 30 Patroni: an introductionPatroni: an introduction Patoroni is a template for you to create your own customized, high-availability solution using Python and - for maximum accessibility - a distributed configuration store like ZooKeeper, etcd or Consul. -https://github.com/zalando/patroni-
  • 9.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 9 di 30 How Patroni worksHow Patroni works Server Client HA Proxy
  • 10.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 10 di 30 Distributed Configuration SystemDistributed Configuration System Distributed key/value store Like a directory tree The state machine is kept in sync using Raft Uses a discovery url json/rest api
  • 11.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 11 di 30 Directory treeDirectory tree $ etcdctl ls / ­­recursive /service /service/pgdayitcluster /service/pgdayitcluster/initialize /service/pgdayitcluster/config /service/pgdayitcluster/leader /service/pgdayitcluster/optime /service/pgdayitcluster/optime/leader /service/pgdayitcluster/members /service/pgdayitcluster/members/dbnode2 /service/pgdayitcluster/members/dbnode3 /service/pgdayitcluster/members/dbnode1 $ etcdctl ls / ­­recursive /service /service/pgdayitcluster /service/pgdayitcluster/initialize /service/pgdayitcluster/config /service/pgdayitcluster/leader /service/pgdayitcluster/optime /service/pgdayitcluster/optime/leader /service/pgdayitcluster/members /service/pgdayitcluster/members/dbnode2 /service/pgdayitcluster/members/dbnode3 /service/pgdayitcluster/members/dbnode1
  • 12.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 12 di 30 Etcd members detailEtcd members detail  $ etcdctl get /service/testcluster/leader dbnode2 $ etcdctl get /service/testcluster/members/dbnode2 | jq {   "role": "master",   "state": "running",   "conn_url": "postgres://172.17.0.3:5432/postgres",   "api_url": "http://172.17.0.3:8008/patroni",   "xlog_location": 67110528 } $ etcdctl get /service/testcluster/members/dbnode1 | jq {   "role": "replica",   "state": "running",   "conn_url": "postgres://172.17.0.5:5432/postgres",   "api_url": "http://172.17.0.5:8008/patroni",   "xlog_location": 67110528 }  $ etcdctl get /service/testcluster/leader dbnode2 $ etcdctl get /service/testcluster/members/dbnode2 | jq {   "role": "master",   "state": "running",   "conn_url": "postgres://172.17.0.3:5432/postgres",   "api_url": "http://172.17.0.3:8008/patroni",   "xlog_location": 67110528 } $ etcdctl get /service/testcluster/members/dbnode1 | jq {   "role": "replica",   "state": "running",   "conn_url": "postgres://172.17.0.5:5432/postgres",   "api_url": "http://172.17.0.5:8008/patroni",   "xlog_location": 67110528 }
  • 13.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 13 di 30 ReplicaReplica https://www.flickr.com/photos/roycin/4423082408/
  • 14.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 14 di 30 Replication modesReplication modes Patroni uses PostgreSQL streaming replication By  default  Patroni  configures  PostgreSQL  for  asynchronous  replication.
  • 15.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 15 di 30 Asynchronous modeAsynchronous mode Cluster  is  allowed  to  lose  some  committed  transactions  to  ensure availability.  When master server fails or becomes unavailable Patroni will  automatically promote a sufficiently healthy standby to master. maximum_lag_on_failover 
  • 16.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 16 di 30 Synchronous replicationSynchronous replication It  ensures  consistency  across  a  cluster  by  confirming  that  writes  are  written  to  a  secondary  before  returning  to  the  connecting client with a success. It  is  not  guaranteed  zero  lost  transactions  under  all  circumstances. Add  to  the  parameters  section  of  your  YAML  configuration  files: synchronous_commit: "on" synchronous_standby_names: "*" synchronous_commit: "on" synchronous_standby_names: "*"
  • 17.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 17 di 30 Synchronous modeSynchronous mode For  use  cases  where  losing  committed  transactions  is  not  permissible Patroni will not promote a standby unless it is certain that the  standby  contains  all  transactions  that  may  have  returned  a  successful commit status to client
  • 18.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 18 di 30 Synchronous mode implementationSynchronous mode implementation A node must be marked as the latest leader whenever it can  accept write transactions. A  node  must  be  set  as  the  synchronous  standby  in  PostgreSQL  as  long  as  it  is  published  as  the  synchronous  standby. A node that is not the leader or current synchronous standby is  not allowed to promote itself automatically. synchronous_standby_names
  • 19.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 19 di 30 HAProxyHAProxy Patroni provides an HAProxy configuration Used by your application in order to have a single endpoint for  connecting to the cluster's leader $ haproxy ­f haproxy.cfg $ haproxy ­f haproxy.cfg $ psql ­­host 127.0.0.1 ­­port 5000 postgres $ psql ­­host 127.0.0.1 ­­port 5000 postgres
  • 20.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 20 di 30 HAProxy.confHAProxy.conf global     maxconn 100 defaults     log global     mode tcp     retries 2     timeout client 30m     timeout connect 4s     timeout server 30m     timeout check 5s listen stats     mode http     bind *:7000     stats enable stats uri / listen pgdayit     bind *:5000     option httpchk     http­check expect status 200     default­server inter 3s fall 3 rise 2 on­marked­down shutdown­sessions     server postgresql_127.0.0.1_5432 127.0.0.1:5432 maxconn 100 check port 8008     server postgresql_127.0.0.1_5433 127.0.0.1:5433 maxconn 100 check port 8009 global     maxconn 100 defaults     log global     mode tcp     retries 2     timeout client 30m     timeout connect 4s     timeout server 30m     timeout check 5s listen stats     mode http     bind *:7000     stats enable stats uri / listen pgdayit     bind *:5000     option httpchk     http­check expect status 200     default­server inter 3s fall 3 rise 2 on­marked­down shutdown­sessions     server postgresql_127.0.0.1_5432 127.0.0.1:5432 maxconn 100 check port 8008     server postgresql_127.0.0.1_5433 127.0.0.1:5433 maxconn 100 check port 8009
  • 21.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 21 di 30 InterfacesInterfaces API rest patronictl https://www.flickr.com/photos/oldstretch/1051796285/
  • 22.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 22 di 30 API restAPI rest GET /config : Get current version of dynamic configuration PATCH  /config  :  Change  parameters  of  an  existing  configuration $ curl ­s localhost:8008/config $ curl ­s localhost:8008/config url ­s ­XPATCH ­d         '{"retry_timeout":5,"postgresql":{"parameters":{""max_wal_senders": “5”}}}' rl ­s ­XPATCH ­d        '{"retry_timeout":5,"postgresql":{"parameters":{""max_wal_senders": “5”}}}'
  • 23.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 23 di 30 API restAPI rest PUT /config : full rewrite of an existing dynamic configuration  unconditionally $ curl ­s ­XPUT ­d          '{"maximum_lag_on_failover":1048576,            "retry_timeout":10,            "postgresql":              {              "use_slots":true,              "use_pg_rewind":true,              "parameters":                {                "hot_standby":"on",                "wal_log_hints":"on",                "wal_keep_segments":8,                "wal_level":"hot_standby",                "unix_socket_directories":".",                "max_wal_senders":5                }              },              "loop_wait":3,"ttl":20         }' http://localhost:8008/config | jq $ curl ­s ­XPUT ­d          '{"maximum_lag_on_failover":1048576,            "retry_timeout":10,            "postgresql":              {              "use_slots":true,              "use_pg_rewind":true,              "parameters":                {                "hot_standby":"on",                "wal_log_hints":"on",                "wal_keep_segments":8,                "wal_level":"hot_standby",                "unix_socket_directories":".",                "max_wal_senders":5                }              },              "loop_wait":3,"ttl":20         }' http://localhost:8008/config | jq
  • 24.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 24 di 30 API restAPI rest POST  /reload:  change  patroni.yml  and  reload  at  runtime  wtihout stop any service $ curl ­s localhost:8008/reload $ curl ­s localhost:8008/reload
  • 25.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 25 di 30 PatronictlPatronictl Usage: patronictl.py [OPTIONS] COMMAND [ARGS]... Options:   ­c, ­­config­file TEXT  Configuration file   ­d, ­­dcs TEXT          Use this DCS   ­­help                  Show this message and exit. Commands:   configure    Create configuration file   dsn          Generate a dsn for the provided member,...   edit­config  Edit cluster configuration   failover     Failover to a replica   flush        Flush scheduled events   list         List the Patroni members for a given Patroni   pause        Disable auto failover   query        Query a Patroni PostgreSQL member   reinit       Reinitialize cluster member   remove       Remove cluster from DCS   restart      Restart cluster member   resume       Resume auto failover   scaffold     Create a structure for the cluster in DCS   show­config  Show cluster configuration Usage: patronictl.py [OPTIONS] COMMAND [ARGS]... Options:   ­c, ­­config­file TEXT  Configuration file   ­d, ­­dcs TEXT          Use this DCS   ­­help                  Show this message and exit. Commands:   configure    Create configuration file   dsn          Generate a dsn for the provided member,...   edit­config  Edit cluster configuration   failover     Failover to a replica   flush        Flush scheduled events   list         List the Patroni members for a given Patroni   pause        Disable auto failover   query        Query a Patroni PostgreSQL member   reinit       Reinitialize cluster member   remove       Remove cluster from DCS   restart      Restart cluster member   resume       Resume auto failover   scaffold     Create a structure for the cluster in DCS   show­config  Show cluster configuration
  • 26.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 26 di 30 Patronictl failoverPatronictl failover Manual failover Promote a new master atronictl.py failover <clustername> er [dbnode2]: idate ['dbnode1', 'dbnode3'] []: should the failover take place (e.g. 2015­10­01T14:30)  [now]: ou sure you want to failover cluster testcluster, demoting current master dbnode2? [ tronictl.py failover <clustername> r [dbnode2]: date ['dbnode1', 'dbnode3'] []: hould the failover take place (e.g. 2015­10­01T14:30)  [now]: u sure you want to failover cluster testcluster, demoting current master dbnode2? [y
  • 27.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 27 di 30 SpiloSpilo a  Docker  image  that  provides  PostgreSQL  and  Patroni  bundled together Multiple  Spilos  can  create  a  resilient  High  Available  PostgreSQL cluster You'll need to setup Spilo to create a database and roles for  your application $ psql ­h mypgdaydb ­p 5432 ­U admin ­d postgres $ psql ­h mypgdaydb ­p 5432 ­U admin ­d postgres
  • 28.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 28 di 30 RisorseRisorse Patroni: https://github.com/zalando/patroni Spilo:    https://github.com/zalando/spilo Etcd:     https://github.com/coreos/etcd  Raft:      https://raft.github.io/raft.pdf
  • 29.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 29 di 30 Questions?Questions?
  • 30.
    PGDay.IT 2017 –13 Ottobre 2017 - Milano 30 di 30