VillageSQL is a drop-in replacement for MySQL with extensions.
All examples in this guide work on VillageSQL. Install Now →
How Replication Works
- The source commits a transaction and writes it to the binary log.
- The replica’s I/O thread connects to the source, reads new binlog events, and writes them to a local relay log.
- The replica’s SQL thread reads from the relay log and executes each event.
Setting Up a Replica
On the source — enable binary logging and set a unique server ID inmy.cnf:
--source-data:
SOURCE_AUTO_POSITION = 1 enables GTID-based replication. If you’re not using GTIDs, specify SOURCE_LOG_FILE and SOURCE_LOG_POS instead (values from the snapshot file header).
GTID Replication
Global Transaction Identifiers (GTIDs) assign a unique ID to every committed transaction. They make failover and replica setup simpler — instead of tracking binlog filenames and positions, MySQL tracks which transactions each server has applied. Enable GTIDs on both source and replica:SOURCE_AUTO_POSITION = 1 is all you need — MySQL figures out which transactions the replica is missing and replays them automatically.
Monitoring Replication
Both
Replica_IO_Running and Replica_SQL_Running must be Yes for replication to be working.
Replication Lag
Replication lag happens when the replica’s SQL thread can’t keep up with the source’s write rate. Common causes:- Single-threaded SQL thread: by default, replicas apply events serially. Enable parallel replication with
replica_parallel_workers:
- Long-running queries on the replica: queries that lock rows block the SQL thread.
- Network latency: slow I/O thread causes the SQL thread to run out of work.
- Disk I/O on replica: syncing relay log or data files is the bottleneck.
Replication Architectures
The default setup — one source, one or more async replicas — isn’t the only option. MySQL offers several replication architectures with different consistency and availability trade-offs.
When to use each:
- Async replication — the right default for read scaling and disaster-recovery replicas where some lag is acceptable.
- Semi-sync — when you need durability insurance against source failure but can’t tolerate the operational complexity of Group Replication. Adds ~1 network round trip per write commit.
- Group Replication / InnoDB Cluster — when you need automatic failover and can afford the write latency increase. InnoDB Cluster wraps Group Replication with MySQL Router and MySQL Shell for easier management.
group_replication plugin; configuration is beyond the scope of this guide.
Read Scaling with Replicas
Direct read-heavy queries to replicas to reduce load on the source:Replication vs. Alternatives
Replication solves specific problems well and is the wrong tool for others. Before reaching for it, check whether it actually fits.
The short version: replication is the right call when one server handles all your writes and you need read scale, HA, or a warm standby. If your write throughput is the bottleneck, replication copies the problem to every replica — sharding or a distributed database addresses it at the source.
Stopping and Starting Replication
Frequently Asked Questions
Does replication work across MySQL major versions?
MySQL supports replicating from an older source to a newer replica, but not the reverse. Always upgrade replicas before upgrading the source.What’s the difference between semi-synchronous and asynchronous replication?
In asynchronous replication (the default), the source commits without waiting for any replica to acknowledge receipt. In semi-synchronous replication, the source waits for at least one replica to confirm it received the event before returning to the client. Semi-sync reduces the risk of data loss on source failure, at the cost of slightly higher write latency.Troubleshooting
See also
- MySQL Binary Logging — the binary log that replication streams from source to replica
- MySQL Backup Strategies — complementary strategy to replication for durability

