Lab 03: MySQL Group Replication

Time: 45 minutes | Level: Advanced | DB: MySQL 8.0

Overview

MySQL Group Replication (MGR) provides fault-tolerant, multi-master distributed replication using Paxos-based consensus. Unlike traditional replication, all nodes agree on transaction order — enabling automatic failover and optional multi-primary writes.


Step 1: Create Network and Configuration Files

# Create Docker network
docker network create gr-network

# Create configuration directory
mkdir -p /tmp/gr-config

# Node 1 configuration
cat > /tmp/gr-config/node1.cnf <<'EOF'
[mysqld]
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_format=ROW
log_bin=mysql-bin
log_slave_updates=ON

# Group Replication settings
plugin_load_add=group_replication.so
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=OFF
group_replication_local_address="mysql-node1:33061"
group_replication_group_seeds="mysql-node1:33061,mysql-node2:33061,mysql-node3:33061"
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=ON
group_replication_enforce_update_everywhere_checks=OFF
EOF

# Node 2 configuration
cat > /tmp/gr-config/node2.cnf <<'EOF'
[mysqld]
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_format=ROW
log_bin=mysql-bin
log_slave_updates=ON

plugin_load_add=group_replication.so
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=OFF
group_replication_local_address="mysql-node2:33061"
group_replication_group_seeds="mysql-node1:33061,mysql-node2:33061,mysql-node3:33061"
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=ON
group_replication_enforce_update_everywhere_checks=OFF
EOF

# Node 3 configuration (same structure, different server-id and local_address)
cat > /tmp/gr-config/node3.cnf <<'EOF'
[mysqld]
server-id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_format=ROW
log_bin=mysql-bin
log_slave_updates=ON

plugin_load_add=group_replication.so
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=OFF
group_replication_local_address="mysql-node3:33061"
group_replication_group_seeds="mysql-node1:33061,mysql-node2:33061,mysql-node3:33061"
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=ON
group_replication_enforce_update_everywhere_checks=OFF
EOF

echo "Configurations created!"
ls -la /tmp/gr-config/

📸 Verified Output:


Step 2: Launch Three MySQL Nodes

📸 Verified Output:


Step 3: Create Replication User on All Nodes

📸 Verified Output:

💡 SET SQL_LOG_BIN=0 prevents the user creation from being replicated (each node already runs it). GROUP_REPLICATION_STREAM privilege is required in MySQL 8.0.18+.


Step 4: Bootstrap the Group on Node 1

📸 Verified Output:

💡 Bootstrap must only happen ONCE when starting a fresh group. Never bootstrap if the group is already running — it creates a split-brain!


Step 5: Add Nodes 2 and 3 to the Group

📸 Verified Output:


Step 6: Test Data Replication Across Group

📸 Verified Output:


Step 7: Single-Primary vs Multi-Primary Mode

📸 Verified Output:

💡 Multi-primary mode allows writes on all nodes but requires careful conflict handling. Use group_replication_transaction_size_limit and be aware of certification-based conflict detection.


Step 8: Capstone — Simulate Node Failure and Automatic Failover

📸 Verified Output:


Summary

Concept
Setting
Purpose

group_name

UUID string

Unique identifier for the replication group

server-id

Unique integer

Required for binary logging

Bootstrap

SET GLOBAL group_replication_bootstrap_group=ON

Initialize first group member ONCE

group_replication_members

performance_schema view

Monitor all group members

Single-primary

group_replication_single_primary_mode=ON

One writer, auto-failover

Multi-primary

switch_to_multi_primary_mode()

All nodes accept writes

MEMBER_STATE

ONLINE/RECOVERING/ERROR

Node health status

Automatic failover

Built-in (Paxos)

New primary elected when primary fails

Key Takeaways

  • Group Replication = Paxos consensus — all nodes agree on every transaction

  • Bootstrap exactly once — bootstrapping an existing group causes split-brain

  • Single-primary is safer for most workloads; multi-primary needs conflict awareness

  • Minimum 3 nodes for fault tolerance — 2 nodes can't form majority after 1 fails

  • MySQL InnoDB Cluster (MySQL Shell + MGR + MySQL Router) provides production-grade MGR management

Last updated