mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Support multiple synchronous standby servers.
Previously synchronous replication offered only the ability to confirm that all changes made by a transaction had been transferred to at most one synchronous standby server. This commit extends synchronous replication so that it supports multiple synchronous standby servers. It enables users to consider one or more standby servers as synchronous, and increase the level of transaction durability by ensuring that transaction commits wait for replies from all of those synchronous standbys. Multiple synchronous standby servers are configured in synchronous_standby_names which is extended to support new syntax of 'num_sync ( standby_name [ , ... ] )', where num_sync specifies the number of synchronous standbys that transaction commits need to wait for replies from and standby_name is the name of a standby server. The syntax of 'standby_name [ , ... ]' which was used in 9.5 or before is also still supported. It's the same as new syntax with num_sync=1. This commit doesn't include "quorum commit" feature which was discussed in pgsql-hackers. Synchronous standbys are chosen based on their priorities. synchronous_standby_names determines the priority of each standby for being chosen as a synchronous standby. The standbys whose names appear earlier in the list are given higher priority and will be considered as synchronous. Other standby servers appearing later in this list represent potential synchronous standbys. The regression test for multiple synchronous standbys is not included in this commit. It should come later. Authors: Sawada Masahiko, Beena Emerson, Michael Paquier, Fujii Masao Reviewed-By: Kyotaro Horiguchi, Amit Kapila, Robert Haas, Simon Riggs, Amit Langote, Thomas Munro, Sameer Thakur, Suraj Kharage, Abhijit Menon-Sen, Rajeev Rastogi Many thanks to the various individuals who were involved in discussing and developing this feature.
This commit is contained in:
@@ -32,6 +32,18 @@
|
||||
#define SYNC_REP_WAITING 1
|
||||
#define SYNC_REP_WAIT_COMPLETE 2
|
||||
|
||||
/*
|
||||
* Struct for the configuration of synchronous replication.
|
||||
*/
|
||||
typedef struct SyncRepConfigData
|
||||
{
|
||||
int num_sync; /* number of sync standbys that we need to wait for */
|
||||
List *members; /* list of names of potential sync standbys */
|
||||
} SyncRepConfigData;
|
||||
|
||||
extern SyncRepConfigData *syncrep_parse_result;
|
||||
extern SyncRepConfigData *SyncRepConfig;
|
||||
|
||||
/* user-settable parameters for synchronous replication */
|
||||
extern char *SyncRepStandbyNames;
|
||||
|
||||
@@ -45,14 +57,25 @@ extern void SyncRepCleanupAtProcExit(void);
|
||||
extern void SyncRepInitConfig(void);
|
||||
extern void SyncRepReleaseWaiters(void);
|
||||
|
||||
/* called by wal sender and user backend */
|
||||
extern List *SyncRepGetSyncStandbys(bool *am_sync);
|
||||
extern void SyncRepUpdateConfig(void);
|
||||
extern void SyncRepFreeConfig(SyncRepConfigData *config);
|
||||
|
||||
/* called by checkpointer */
|
||||
extern void SyncRepUpdateSyncStandbysDefined(void);
|
||||
|
||||
/* forward declaration to avoid pulling in walsender_private.h */
|
||||
struct WalSnd;
|
||||
extern struct WalSnd *SyncRepGetSynchronousStandby(void);
|
||||
|
||||
extern bool check_synchronous_standby_names(char **newval, void **extra, GucSource source);
|
||||
extern void assign_synchronous_commit(int newval, void *extra);
|
||||
|
||||
/*
|
||||
* Internal functions for parsing synchronous_standby_names grammar,
|
||||
* in syncrep_gram.y and syncrep_scanner.l
|
||||
*/
|
||||
extern int syncrep_yyparse(void);
|
||||
extern int syncrep_yylex(void);
|
||||
extern void syncrep_yyerror(const char *str);
|
||||
extern void syncrep_scanner_init(const char *query_string);
|
||||
extern void syncrep_scanner_finish(void);
|
||||
|
||||
#endif /* _SYNCREP_H */
|
||||
|
Reference in New Issue
Block a user