4-Semi-Sync Replication
Explains the handshake and acknowledgement process for semi-synchronous replication, ensuring data is committed on at least one replica.
Regular MariaDB replication is asynchronous. MariaDB also includes semisynchronous replication semi-synchronous Binlog Event.
Event Header Changes
If the user variable @rpl_semi_sync_slave is set, 2 extra bytes are added after the status byte of a binlog network stream and before the normal binlog event header.
uint<1> semi-sync indicator, always
0xef.uint<1> semi-sync flags, either
0x00(noACK) or0x01(ACK).
Note : The packet size, as in the network protocol header, is then: event_size + 1 byte status + 2 bytes semi-sync replication.
The MariaDB server sets the user variable whenever it is starting replication. For MariaDB Connector/C , the following query must be executed before the call to mariadb_rpl_open() is made to enable semi-sync replication.
SET @rpl_semi_sync_slave=1If the semi-sync flag is set to 0x01, the master waits for a Semi Sync ACK packet from the slave and when the Semi Sync ACK is seen, the master acknowledges the client which has issued the transaction with a standard OK_Packet or a ERR_Packet.
The master can then write the transaction to the binary log and send the next events to the replica.
Note : The master only requests Semi Sync ACKs if rpl_semi_sync_master_enabled is enabled. If it is not enabled, the semi-sync flag will always be 0x00.
Semi Sync ACK Details
This event is sent by the replica only if the semi-sync flag is set to 0x01.
uint<1> semi-sync indicator, always 0xef;
uint<8> the next position of received event;
string binlog file name.
Sending an ACK when the semi-sync flag is set to 0x0 causes an error, and the connection is closed.
Example of Heartbeat Event With Semi-Sync Protocol and CRC32
We can see:
2a 00 00 [3 bytes] packet size.
06 [1] sequence.
00 [1] status byte = 00 => OK.
ef 00 [2] bytes => semi sync indicator (0xef) and semi-sync flag (00).
The ef 00 2 bytes after the OK byte 00.
Example of XID_EVENT, With CRC32
The master sets the Semi-Sync ACK request in the XID_EVENT event:
We see the 2 semi sync bytes: ef and 01. The latter, being 1, means the replica server must send the Semi Sync ACK packet.
We also see in the binlog event header:
Event Type [1] = 10
XID_EVENT.Next Event pos [4] = 4a 05 00 00 => 1354.
Example of Semi-Sync ACK
This is sent by the replica server after the XID_EVENT receiving.
We see:
The semi sync indicator [1] = 0xef, sent before anything else.
The Next Event position [8] = 4a 05 00 00 00 00 00 00 => 1354 which is the next position of the XID_EVENT above.
The binlog filename = mysql-bin.000034.
Please note:
There is no terminating
CRC32.The packet sequence now start starts from 0.
This page is licensed: CC BY-SA / Gnu FDL
Last updated
Was this helpful?

