Master-Slave semi circle replication not working in MySQL
-
05-10-2020 - |
Question
I didn't know how to describe it so I am calling it semi circle. Here's what I am doing.
Server A
Server B = This is slave of Server A
Server C = This is slave of Server B
When I update something on Server A then it is reflected on Server B. But the same change is not reflected on Server C.
Only when I update something on Server B then change is reflected on Server C.
How do I make it so any changes done on Server A will come to Server B (which is already working) and then it goes to Server C?
EDIT
Upon investigation I found out that when I make some change on Server A then its log file position changes. But when those changes are reflected on Server B then Server B log file position doesn't change. It is because of this reason Server C doesn't know if there has been any change on Server B unless I explicitly change something (insert,update,delete) on Server B.
So is there a way to tell MySQL to increment log file position when Slave is receiving updates from Master?
Solution
I think the problem is the following:
Since B is a Slave of A, replication log position changes when something on A is executed and then records the changes to its binlogs. Server B picks up Server A binlog events and executes it.
Why won't Server B just pass it on to Server C ?
Server B need the following option enabled
[mysqld]
log_slave_updates
Whenever you want a server to be a Slave and a Master at the same time, you need log_slave_updates enabled. Here is what the MySQL Documentation says:
Whether updates received by a slave server from a master server should be logged to the slave's own binary log. Binary logging must be enabled on the slave for this variable to have any effect.
In your case, Server B reads Server A's binlog events as recorded in Server B's relay logs, executes those events in Server B and nothing more.
When you enable log_slave_updates on Server B, then the following happens
- Server B reads Server A's binlog events as recorded in Server B's relay logs
- Server B executes those events in Server B
- Server B records the event it executes in Server B's binlogs
- Server C will receive Server B's binlogs and execute them
I mentioned using log_slave_updates a couple of times before:
Sep 09, 2014
: Is it mandatory to enable --log_slave_updates with MySQL Replication using GTID?Nov 26, 2012
: Replicate MySQL 5.0 Master to 5.5 Slave?
Therefore, when you said
It is because of this reason Server C doesn't know if there has been any change on Server B unless I explicitly change something (insert,update,delete) on Server B
The explicitly change something
becomes implicit when you use log_slave_updates.