BDR (Bi-Directional Replication)¶
Overview¶
BDR is a PostgreSQL extension providing multi-master replication and data distribution with advanced conflict management, data-loss protection, and throughput up to 5X faster than native logical replication, and enables distributed PostgreSQL clusters with high availability up to five 9s.
Detailed overview about how BDR works is described in the Architectural Overview chapter.
Supported PostgreSQL database servers¶
BDR is compatible with PostgresSQL, EDB Postgres Extended and EDB Postgres Advanced flavors of PostgresSQL database servers and can be deployed as a standard PG extension. See Comptibility Matrix for details of supported version combinations.
It is important to note that some key BDR features depend on certain core capabilities being available within the targeted PostgresSQL database server. Therefore, it is essential for the BDR customers to also adopt the PostgresSQL database server flavor that is best suited to their business needs. For example, if having the BDR feature “Commit At Most Once (CAMO)” is mission critical to a BDR customer’s use case, they should not adopt the community PostgreSQL flavor for it does not have the core capability required to handle CAMO. The full feature matrix compatibility can be found in Choosing a Postgres distribution .
BDR offers close to native PostgreSQL compatibility. However, some access patterns don’t necessarily work as well in multi-node setup as they do on single instance. There are also some limitations in what can be safely replicated in multi-node setting. The chapter Application Usage goes into detail on how BDR behaves from application development perspective.
- Release Notes
- Architectural Overview
- Application use
- Application behavior
- Nonreplicated statements
- DML and DDL replication
- Replicating between different release levels
- Replicating between nodes with differences
- Comparison between nodes with differences
- General rules for applications
- Timing considerations and synchronous replication
- Application testing
- Performance testing and tuning
- Assessing suitability
- PostgreSQL configuration for BDR
- PostgreSQL settings for BDR
- BDR-specific settings
- Conflict handling
- Global sequence parameters
- DDL handling
- Global locking
- Node management
- Generic replication
bdr.standby_slot_namesbdr.standby_slots_min_confirmedbdr.writer_input_queue_sizebdr.writer_output_queue_sizebdr.min_worker_backoff_delay- CRDTs
- Max prepared transactions
- Eager Replication
- Commit At Most Once
- Transaction streaming
- Lag control
- Timestamp-based snapshots
- Monitoring and logging
- Internals
- Node Management
- Creating and Joining a BDR Group
- Witness Nodes
- Logical Standby Nodes
- Physical Standby Nodes
- Sub-Groups
- Decoding Worker
- Node Restart and Down Node Recovery
- Removing a Node From a BDR Group
- Listing BDR Topology
- Node Management Interfaces
- bdr.create_node
- Synopsis
- Parameters
- Notes
- bdr.drop_node
- Synopsis
- Parameters
- Notes
- bdr.create_node_group
- Synopsis
- Parameters
- Notes
- bdr.alter_node_group_config
- Synopsis
- Parameters
- Notes
- bdr.join_node_group
- Synopsis
- Parameters
- Notes
- bdr.promote_node
- Synopsis
- Notes
- bdr.wait_for_join_completion
- Synopsis
- Parameters
- Notes
- bdr.part_node
- Synopsis
- Parameters
- Notes
- bdr.alter_node_interface
- Synopsis
- Parameters
- Notes
- bdr.alter_subscription_enable
- Synopsis
- Parameters
- Notes
- bdr.alter_subscription_disable
- Synopsis
- Parameters
- Notes
- Node Management Commands
- DDL Replication
- DDL Replication Options
- Executing DDL on BDR Systems
- DDL Locking Details
- Minimizing the Impact of DDL
- Handling DDL With Down Nodes
- Statement Specific DDL Replication Concerns
- BDR DDL Command Handling Matrix
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TABLE Disallowed Commands
- ALTER TABLE Locking
- ALTER TABLE Examples
- ALTER TYPE
- COMMENT ON
- CREATE SEQUENCE
- CREATE TABLE
- CREATE TABLE AS and SELECT INTO
- EXPLAIN
- EXPLAIN ANALYZE Replication
- EXPLAIN ANALYZE Locking
- GRANT and REVOKE
- LOCK TABLE
- SECURITY LABEL
- TRUNCATE Replication
- TRUNCATE Locking
- Role manipulation statements
- Restricted DDL Workarounds
- Adding a CONSTRAINT
- Adding a Column
- Changing a Column’s Type
- Changing Other Types
- BDR Functions that behave like DDL
- Security and Roles
- Conflicts
- How conflicts happen
- Types of conflict
- PRIMARY KEY or UNIQUE conflicts
- INSERT/INSERT conflicts
- INSERT operations that violate multiple UNIQUE constraints
- UPDATE/UPDATE conflicts
- UPDATE conflicts on the PRIMARY KEY
- UPDATE operations that violate multiple UNIQUE constraints
- UPDATE/DELETE conflicts
- INSERT/UPDATE conflicts
- INSERT/DELETE conflicts
- DELETE/DELETE conflicts
- Conflicts with three or more nodes
- Foreign key constraint conflicts
- TRUNCATE conflicts
- Exclusion constraint conflicts
- Data conflicts for roles and tablespace differences
- Lock conflicts and deadlock aborts
- Divergent conflicts
- TOAST support details
- Avoiding or tolerating conflicts
- Conflict detection
- Conflict resolution
- Conflict logging
- Data verification with LiveCompare
- Sequences
- BDR Global Sequences
- UUIDs, KSUUIDs and Other Approaches
- Global Sequence Management Interfaces
- bdr.alter_sequence_set_kind
- Synopsis
sql bdr.alter_sequence_set_kind(seqoid regclass, seqkind text) - Parameters
- Notes
- bdr.extract_timestamp_from_snowflakeid
- Synopsis
sql bdr.extract_timestamp_from_snowflakeid(snowflakeid bigint) - Parameters -
snowflakeid- value of a snowflakeid sequence - Notes
- bdr.extract_nodeid_from_snowflakeid
- Synopsis
sql bdr.extract_nodeid_from_snowflakeid(snowflakeid bigint) - Parameters -
snowflakeid- value of a snowflakeid sequence - Notes
- bdr.extract_localseqid_from_snowflakeid
- Synopsis
sql bdr.extract_localseqid_from_snowflakeid(snowflakeid bigint) - Parameters -
snowflakeid- value of a snowflakeid sequence - Notes
- bdr.timestamp_to_snowflakeid
- Synopsis
sql bdr.timestamp_to_snowflakeid(ts timestamptz) - Parameters -
ts- timestamp to be used for the snowflakeid sequence generation - Notes
- bdr.extract_timestamp_from_timeshard
- Synopsis
- Parameters
- Notes
- bdr.extract_nodeid_from_timeshard
- Synopsis
- Parameters
- Notes
- bdr.extract_localseqid_from_timeshard
- Synopsis
- Parameters
- Notes
- bdr.timestamp_to_timeshard
- Synopsis
- Parameters
- Notes
- KSUUID v2 Functions
- KSUUID v1 Functions
- Column-level conflict detection
- Conflict-free Replicated Data Types
- Transaction streaming
- Durability & Performance Options
- Group Commit
- Eager Replication
- Commit At Most Once
- Requirements
- Configuration
- Failure scenarios
- Application use
- Overview and requirements
- Adding a CAMO pair
- Synopsis
- Changing the configuration of a CAMO pair
- Synopsis
- Removing a CAMO pair
- Synopsis
- CAMO partner connection status
- Synopsis
- Return value
- CAMO partner readiness
- Synopsis
- Return value
- Fetch the CAMO partner
- Wait for consumption of the apply queue from the CAMO partner
- Synopsis
- Transaction status between CAMO nodes
- Transaction status query function
- Synopsis
- Parameters
- Return value
- Interaction with DDL and global locks
- CAMO limitations
- Performance implications
- Client application testing
- CAMO versus group commit
- Lag Control
- AutoPartition
- Auto Creation of Partitions
- Configure AutoPartition
- Synopsis
- Parameters
- Examples
- Create One AutoPartition
- Synopsis
- Parameters
- Stopping Auto-Creation of Partitions
- Parameters
- Drop one AutoPartition
- Synopsis
- Parameters
- Notes
- Wait for Partition Creation
- Synopsis
- Parameters
- Synopsis
- Parameters
- Find Partition
- Synopsis
- Parameters
- Enable/Disable AutoPartitioning
- Synopsis
- Parameters
- Synopsis
- Parameters
- Synopsis
- Check AutoPartition Workers
- Synopsis
- Parameters
- Notes
- Auto Creation of Partitions
- Timestamp-Based Snapshots
- Replication Sets
- Stream Triggers
- Explicit Two-Phase Commit (2PC)
- Catalogs and views
- User-visible catalogs and views
bdr.conflict_historybdr.conflict_historycolumnsbdr.conflict_history_summarybdr.conflict_history_summarycolumnsbdr.consensus_kv_databdr.consensus_kv_dataColumnsbdr.camo_decision_journalbdr.camo_decision_journalcolumnsbdr.crdt_handlersbdr.crdt_handlersColumnsbdr.ddl_replicationbdr.ddl_replicationcolumnsbdr.dependbdr.global_consensus_journalbdr.global_consensus_journalcolumnsbdr.global_consensus_journal_detailsbdr.global_consensus_journal_detailscolumnsbdr.global_consensus_response_journalbdr.global_consensus_response_journalcolumnsbdr.global_lockbdr.global_lockcolumnsbdr.global_locksbdr.global_lockscolumnsbdr.local_consensus_snapshotbdr.local_consensus_snapshotcolumnsbdr.local_consensus_statebdr.local_consensus_statecolumnsbdr.local_nodebdr.local_nodecolumnsbdr.local_node_summarybdr.local_sync_statusbdr.local_sync_statuscolumnsbdr.network_path_infobdr.network_path_infocolumnsbdr.nodebdr.nodecolumnsbdr.node_catchup_infobdr.node_catchup_infocolumnsbdr.node_conflict_resolversbdr.node_conflict_resolverscolumnsbdr.node_groupbdr.node_groupcolumnsbdr.node_group_replication_setsbdr.node_group_replication_setscolumnsbdr.node_local_infobdr.node_local_infocolumnsbdr.node_locationbdr.node_locationColumnsbdr.node_log_configbdr.node_log_configcolumnsbdr.node_peer_progressbdr.node_peer_progresscolumnsbdr.node_pre_commitbdr.node_pre_commitcolumnsbdr.node_replication_ratesbdr.node_replication_ratescolumnsbdr.node_slotsbdr.node_slotscolumnsbdr.node_summarybdr.node_summarycolumnsbdr.queuebdr.queuecolumnsbdr.replication_setbdr.replication_setcolumnsbdr.replication_set_tablebdr.replication_set_tablecolumnsbdr.replication_set_ddlbdr.replication_set_ddlColumnsbdr.replication_setsbdr.replication_setscolumnsbdr.schema_changesbdr.schema_changescolumnsbdr.sequence_allocbdr.sequence_alloccolumnsbdr.schema_changesbdr.schema_changescolumnsbdr.sequence_allocbdr.sequence_alloccolumnsbdr.sequencesbdr.sequencescolumnsbdr.stat_activitybdr.stat_relationbdr.stat_relationcolumnsbdr.stat_subscriptionbdr.stat_subscriptioncolumnsbdr.subscriptionbdr.subscriptioncolumnsbdr.subscription_summarybdr.subscription_summarycolumnsbdr.replication_statusbdr.replication_statuscolumnsbdr.tablesbdr.tablescolumnsbdr.triggerbdr.triggercolumnsbdr.triggersbdr.workersbdr.workersColumnsbdr.worker_errorsbdr.worker_errorsColumnsbdr.writersbdr.writerscolumnsbdr.worker_tasksbdr.worker_taskscolumnsbdr.autopartition_work_queuebdr.autopartition_work_queuecolumnsbdr.autopartition_workitem_statusbdr.autopartition_workitem_statuscolumnsbdr.autopartition_local_work_queuebdr.autopartition_local_work_queuecolumnsbdr.autopartition_local_workitem_statusbdr.autopartition_local_workitem_statuscolumnsbdr.group_camo_detailsbdr.group_camo_detailscolumnsbdr.camo_pairsbdr.camo_pairscolumnsbdr.commit_scopesbdr.commit_scopescolumnsbdr.group_raft_detailsbdr.group_raft_detailscolumnsbdr.group_replslots_detailsbdr.group_replslots_detailscolumnsbdr.group_subscription_summarybdr.group_subscription_summarycolumnsbdr.group_versions_detailsbdr.group_versions_detailscolumns
- Internal catalogs and views
- User-visible catalogs and views
- BDR System Functions
- Version Information Functions
- System Information Functions
- System and Progress Information Parameters
- Consensus Function
- Utility Functions
- bdr.wait_slot_confirm_lsn
- Synopsis
- Parameters
- bdr.wait_for_apply_queue
- Synopsis
- Parameters
- bdr.get_node_sub_receive_lsn
- Synopsis
- Parameters
- bdr.get_node_sub_apply_lsn
- Synopsis
- Parameters
- bdr.run_on_all_nodes
- Synopsis
- Parameters
- Notes
- Example
- bdr.run_on_nodes
- Synopsis
- Parameters
- Notes
- bdr.run_on_group
- Synopsis
- Parameters
- Notes
- bdr.global_lock_table
- Synopsis
- Parameters
- Notes
- bdr.wait_for_xid_progress
- Synopsis
- Parameters
- Notes
- bdr.local_group_slot_name
- Example
- bdr.node_group_type
- Example
- Global Advisory Locks
- Monitoring Functions
- Internal Functions
- BDR Message Payload Functions
- bdr.get_global_locks
- bdr.get_slot_flush_timestamp
- BDR Internal Function Replication Functions
- bdr.internal_submit_join_request
- bdr.isolation_test_session_is_blocked
- bdr.local_node_info
- bdr.msgb_connect
- bdr.msgb_deliver_message
- bdr.peer_state_name
- bdr.request_replay_progress_update
- bdr.seq_nextval
- Notes
- bdr.show_subscription_status
- bdr.conflict_resolution_to_string
- bdr.conflict_type_to_string
- bdr.get_node_conflict_resolvers
- bdr.reset_subscription_stats
- bdr.reset_relation_stats
- bdr.pg_xact_origin
- Synopsis
- Parameters
- bdr.difference_fix_origin_create
- Synopsis
- bdr.difference_fix_session_setup
- Synopsis
- bdr.difference_fix_session_reset
- Synopsis
- bdr.difference_fix_xact_set_avoid_conflict
- Synopsis
- bdr.resynchronize_table_from_node(node_name name, relation regclass)
- Synopsis
- Parameters
- Notes
- bdr.consensus_kv_store
- Synopsis
- Parameters
- Notes
- bdr.consensus_kv_fetch
- Synopsis
- Parameters
- Notes
- bdr.alter_subscription_skip_changes_upto
- Synopsis
- Example