Scaling PostgreSQL with Hot Standby

advertisement
PostgreSQL West 2010
Scaling PostgreSQL with Hot
Standby
Greg Smith - © 2ndQuadrant Limited 2010
Hot Standby
New in PostgreSQL 9.0

Allows connections to server while archive
recovery is in progress

Connections will not be terminated if/when we
move from recovery to normal running at
switchover/failover time

hot_standby = on (not the default)

Works with either streaming or
file-based replication

Greg Smith - © 2ndQuadrant Limited 2010
User's Overview
Connections work normally – no special options

Transactions will be read only

−
−
−
−
Cannot write new data to the database
Cannot write new WAL data
Cannot allocate a TransactionId
Cannot hold any table lock higher than AccessShare
No row level locking

No temporary tables

No two-phase commit (prepared transactions)

No access to sequences (i.e. no nextval())

Greg Smith - © 2ndQuadrant Limited 2010
What works?!?

SELECTs, Cursors including sort files
−
−
−
MVCC works normally
Recovery changes made by a single “writer”
Don't normally block “readers”
LOAD – so many plugins work normally

SET, RESET

Serializable transactions, savepoints etc

Greg Smith - © 2ndQuadrant Limited 2010
Use Cases
•
High availability with active monitoring
•
•
Offload long running reports
Materialize views
•
Load balance small read-only queries
Greg Smith - © 2ndQuadrant Limited 2010
Prioritizations
•
Keep the standby current for failover (good)
•
Long running reports on the standby (fast)
•
Avoid adding overhead to the master (cheap)
•
Good, fast, cheap: pick two
Greg Smith - © 2ndQuadrant Limited 2010
Query Conflicts

Primary: Drop Database X

Standby: Query on database X

Cannot do both

Action on primary has already happened, so
whatever occurs, WAL recovery must always win
Greg Smith - © 2ndQuadrant Limited 2010
Causes of Query Conflicts

Cleanup records (“Snapshot too old” error)

Access Exclusive Locks (LOCK, DDL)

Drop Database

Drop Tablespace

Very, very long queries (wraparound issue)

Buffer cleanup (VACUUM, HOT)
–
Others can normally be avoided; this cannot.
Greg Smith - © 2ndQuadrant Limited 2010
Standard query visibility
•
MVCC keeps multiple row versions
•
Active query transactions are noted
•
Row cleanup avoids touching active data
Greg Smith - © 2ndQuadrant Limited 2010
Hot Standby Query Visibility
•
Queries executing on standby are independent
•
Master does not know what is running
•
DROP TABLE will not respect open locks
•
VACUUM cleanup will prune active rows
Greg Smith - © 2ndQuadrant Limited 2010
vacuum_defer_cleanup_age
•
Set in master postgresql.conf
•
Units are transactions
•
Monitor txid_current() to estimate times
•
Also delays HOT cleanup
•
Will cause cleanup bloat on the master
Greg Smith - © 2ndQuadrant Limited 2010
max_standby_*_delay
•
•
Set in standby postgresql.conf
max_standby_archive_delay
•
max_standby_streaming_delay
•
•
•
•
Defaults are both 30 seconds
Similar to statement_timeout
Changes eventually must be applied
Maximum amount of time to wait for them
–
Changes from a shipped archive file
–
Changes from Streaming Replication
Greg Smith - © 2ndQuadrant Limited 2010
max_standby_*_delay
•
0 always cancels queries immediately
•
Small values prioritize quick failover
•
-1 means wait forever for queries to finish
•
Large values or -1 for reporting server
•
Keep master and standby clocks synchronized
Greg Smith - © 2ndQuadrant Limited 2010
Query Conflict Avoidance

Connect to primary via dblink

Hold open a snapshot while query executes

SELECT sleep(60);

Similar to how a running query impacts MVCC
Greg Smith - © 2ndQuadrant Limited 2010
Optimizing for long queries
•
Avoid cleanup - vacuum_defer_cleanup_age
•
Set a large value for max_standby_*_delay
•
Hold an open snapshot
–
–
–
Will bloat the master
Will cause standby to fall behind
Bloats the master only when running
Greg Smith - © 2ndQuadrant Limited 2010
Optimizing for fast failover
•
Low value for max_standby_*_delay
Greg Smith - © 2ndQuadrant Limited 2010
Optimizing for load balancing
•
Low max_standby_*_delay for fresh results
•
Application should expect cancellation
Greg Smith - © 2ndQuadrant Limited 2010
Routing reads and writes
•
•
•
•
Writes must go to master
Reads execute against master or any standby
Application may know
Application servers may support this concept
•
Database proxy servers can do this routing
•
Hard to solve in all cases
–
–
JDBC
Django
–
pgpool-II 3.0 “tastes” queries
–
Where do functions (stored procedures) go?
Greg Smith - © 2ndQuadrant Limited 2010
Architecture: Read Scaling
Many read copies with slight lag

Each is also a potential failover node

Not suitable for long reports

pgpool-II
router
Reads
“Hot”
Read-Only
Node
Writes
Primary
Node
Greg Smith - © 2ndQuadrant Limited 2010
“Hot”
Read-Only
Node
Architecture: Reporting Server
Rolling Reporting Server(s)

Live servers runs queries

Other servers provide failover
capability for Primary

“Hot”
Read-Only
Reporting
Node
Primary
Node
Greg Smith - © 2ndQuadrant Limited 2010
Archive
Failover
Node
Architecture: Relay Server
Archive data streamed to a standby

Ship the result to a second layer standby

pg_streamrecv
– https://github.com/mhagander

Hot Standby
Primary
Node
Greg Smith - © 2ndQuadrant Limited 2010
Hot Standby
Work in progress
•
Automatic snapshot export to master
•
Easier provisioning/failover
•
Improved monitoring
•
Synchronous replication
–
–
–
–
pg-blender: projects.2ndQuadrant.com
repmgr: projects.2ndQuadrant.com
Expected for PostgreSQL 9.1
Master and standby no longer decoupled
Greg Smith - © 2ndQuadrant Limited 2010
For more information
www.2ndQuadrant.com/books
Greg Smith - © 2ndQuadrant Limited 2010
Download