Bug #42151 | Adjust Binlog Filename And Position By Epoch Automatically | ||
---|---|---|---|
Submitted: | 16 Jan 2009 9:06 | Modified: | 7 May 2009 13:31 |
Reporter: | Mikiya Okuno | Email Updates: | |
Status: | Won't fix | Impact on me: | |
Category: | MySQL Cluster: Replication | Severity: | S4 (Feature request) |
Version: | any | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[16 Jan 2009 9:06]
Mikiya Okuno
[16 Jan 2009 9:19]
Tomas Ulin
The plan is to address this by making a new Cluster Management system that handles these things for you. This work is now in progress. BR, Tomas
[27 Jan 2009 0:03]
MySQL Verification Team
= High Level Design = Extend COM_BINLOG_DUMP with least change so that the slave can tell the latest epoch to the master. * A user can specify a new master with the following procedure. # Retrieve a backup from the master using START BACKUP command from mgm. # Restore a backup to the slave using ndb_restore with -e option. # Issue CHANGE MASTER TO command without specifying binlog name and position like below: # Issue START SLAVE Command details: ndb_mgm> START BACKUP shell> ndb_restore -c mgm_hostname -n nodeid1 -b backupid -m -r /path/to/backup shell> ndb_restore -c mgm_hostname -n nodeid2 -b backupid -r /path/to/backup .... snip .... shell> ndb_restore -c mgm_hostname -n nodeidN -b backupid -e -r /path/to/backup mysql> RESET SLAVE; mysql> CHANGE MASTER TO master_host='hostname', master_port=3306, -> master_user='repl', paster_password='replpass'; mysql> START SLAVE; It's easy! * This will not work in multi-master/master-master setups. * This will do work well in replication-channel-failover setups. * User can start a secondary channel using the following commands: mysql> CHANGE MASTER TO master_host='hostname', master_port=3306, -> master_user='repl', paster_password='replpass'; mysql> START SLAVE; It's easy! * When a filename or a position is specified, the master and the slave behaves like as before. = Low level design = == COM_BINLOG_DUMP format == === normal === 4 byte: binlog pos 2 byte: flags 4 byte: server-id ----->: binlog file name === extended === 4 byte: binlog pos = 0 2 byte: flags & 2 4 byte: server-id 6 byte: "\0EPCH\0" // Magic number 8 byte: epoch number Because the binlog filename is replaced with the string which its leading letter is NULL, it looks like "no binlog filename specified" for servers without this extension. == Packet processing == S->M: COM_BINLOG_DUMP with EPOCH M->S: ROTATE event with a new filename and position M->S: Ordinal log events (RBR) == Functions == === request_dump() === Read an EPOCH from mysql.ndb_apply_status table if the table is populated properly. read_record() doesn't work properly with other storage engines than MyISAM. So mysql_parse() is used here with the following query: mysql> SELECT MAX(epoch) INTO @latest FROM mysql.ndb_apply_status; Then, retrieve the user variable from a THD instance. This query is safe to run because it doesn't return any result set; this is why a user variable is used here. Then, send the information using the extended COM_BINLOG_DUMP packet like in the section above. === mysql_parse() === Extract a packet and read the EPOCH, then read the file name and position from mysql.ndb_binlog_index table and call mysql_binlog_send() function with these stuff. mysql_binlog_send() function calls fake_rotate_event(), which sends a new binlog filename and position to the slave. The slave receives ROTATE event and correct the filename and position accordingly. if(flag&=2 && binlog_pos == 0 && strncmp(packet + 11, "EPCH", 5)) retrieve an EPOCH from the packet. retrieve a filename and position from ndb_binlog_index table, using mysql_parse() with the following query. SELECT SUBSTRING_INDEX(File, '/', -1), Position INTO @file, @pos FROM mysql.ndb_binlog_index WHERE epoch >= @latest ORDER BY epoch ASC LIMIT 1; Then, retrieve the user variables. === mysql_binlog_send() === This function is not changed, but it sends ROTATE event properly according to a new filename and position thru fake_rotate_event() function. == Why not extend CHANGE MASTER TO? == * If I'll do this, I should change a lot. Especially, changing a Master_info class design will have a significant impact. * User will not want to specify EPOCH manually, because it is stored in the system table.
[27 Jan 2009 0:09]
MySQL Verification Team
an experimental patch to implement this feature request. Patch for mysql-5.1.30-ndb-6.3.20
Attachment: rep-ndb-mod.patch (application/octet-stream, text), 11.36 KiB.
[26 Feb 2009 23:26]
MySQL Verification Team
Patch for mysql-cluster-6.3.23, fixed bugs.
Attachment: rep-ndb-mod.patch (application/octet-stream, text), 11.38 KiB.
[26 Feb 2009 23:37]
MySQL Verification Team
The patch above can work on 6.3.20, 6.3.21 and 6.3.22. Because relevant codes are unchanged.
[7 May 2009 13:31]
Jonathan Miller
Use currently as documented
[13 Mar 2014 13:37]
Omer Barnir
This bug is not scheduled to be fixed at this time.