Join method v1
When scaling up a PGD group by adding more data nodes or creating cross-region groups, it's crucial for new nodes to join the existing group properly. There are two methods for joining:
Logical join
This method uses the bdr.join_node_group function to integrate the new node into the PGD group. It's important that the joining node doesn't contain any schemas or data present in the PGD group. We recommend that the new database contain only the BDR extension, as data synchronization occurs during the join.
Physical join
This method uses the bdr_init_physical command to speed up the joining process. You can prepare data in advance before executing
bdr_init_physical
.
For more information about join methods, see Creating and joining PGD groups.
The initial group
The PGD4K operator allows you to configure the join methods for nodes joining PGD groups as well as for groups joining other groups.
When creating a single PGD group, you must configure it to create the parent
group (spec.pgd.parentGroup.create
=true). If you intend to create multiple PGD groups that
will cross join, at least one of these groups must be designated to form the parent group.
This group is referred to as the initial PGD group.
The first node in the initial
PGD group can either be restored from a backup
(as described in the recovery documentation) or created from scratch. This node will always
use a logical join to connect to the parent group it created. Conversely, the first node in
the non-initial PGD group is used for cross joining with other PGD groups.
You can configure the join method for the first node (group join) and the subsequent nodes (node join) separately.
Note
In the scenario where a group joins another group, the first node of the joining group actually creates the group first before joining a different group (either physically or logically).
Configure the join method for node join
You can configure the join method for a node joining a group when scaling up the PGD group and adding new nodes to the local group. In this context, the joining group is the same as the node group.
The spec.cnp.joinMethod
parameter configures how a node joins a local group. By default,
a logical join is used. To enable a physical join for a new node, set spec.cnp.joinMethod
=physical
.
In the following example, the second node uses the pg_basebackup
command to replicate data from the
first node in the region-a
group. Then it uses bdr_init_physical
to join the region-a
group.
This example shows a physical join:
apiVersion: pgd.k8s.enterprisedb.io/v1beta1 kind: PGDGroup metadata: name: region-a spec: instances: 2 proxyInstances: 2 witnessInstances: 1 cnp: joinMethod: physical storage: size: 1Gi ...
Configure the join method for group join
You can configure the join method for group joins when creating cross-region PGD groups. The first node in the new PGD group joins an existing PGD group. In this context, the joining group is distinct from the node group.
The PGD4K operator uses the spec.pgd.joinMethod
section (which defaults to logical) to determine
how PGD groups join with each other. It uses the spec.pgd.discovery
section to specify the target to join.
This example shows a logical join, where spec.pgd.groupJoinMethod=logical
. The first node
in the region-b group waits for all hosts specified in spec.pgd.discovery
to become available. It then
identifies a suitable target to perform the logical join using the bdr.join_node_group
function. The
group service of all remote groups is typically defined in the discovery section for this type of join.
apiVersion: pgd.k8s.enterprisedb.io/v1beta1 kind: PGDGroup metadata: name: region-b namespace: region-b spec: instances: 2 proxyInstances: 2 witnessInstances: 1 pgd: parentGroup: name: world groupJoinMethod: logical discovery: - host: region-a-group - host: region-c-group cnp: storage: size: 1Gi
This example shows a physical join, configured with spec.pgd.groupJoinMethod=physical
.
The first node in the region-b group will traverse all the nodes defined in spec.pgd.discovery
,
waiting to find one node with a successful Raft consensus to perform the physical join using bdr_init_physical
.
Typically, the node service of the remote group is specified in the discovery section for this type of join.
apiVersion: pgd.k8s.enterprisedb.io/v1beta1 kind: PGDGroup metadata: name: region-b spec: instances: 2 proxyInstances: 2 witnessInstances: 1 pgd: parentGroup: name: world groupJoinMethod: physical discovery: - host: region-a-3-node - host: region-a-1-node - host: region-a-2-node cnp: joinMethod: physical storage: size: 1Gi
Note
A group join is essentially a type of node join, specifically when the first node in the group joins a node from a different group.
Note
Witness nodes always use a logical join to connect to a group.