Kevin Burton <[EMAIL PROTECTED]> wrote on 06/20/2005 01:35:38 PM:

> We're noticing a problem where if we were to write to the master with
> multiple threads that our slave DB will fall behind.

> Note that we're trying to perform as many inserts as humanly possible
> and the load on the master is 1.

> My theory is that the master, since it can write to multiple tables, is
> faster due to the IO controller being able to more efficiently command
> queue and buffer IO.

> Since replication is only one thread its not able to benefit from these
> optimizations and hence is prone to falling behind.

> Kevin

> --

> 
> Use Rojo (RSS/Atom aggregator)! - visit http://rojo.com.
> See irc.freenode.net #rojo if you want to chat.

> Rojo is Hiring! - http://www.rojonetworks.com/JobsAtRojo.html

> Kevin A. Burton, Location - San Francisco, CA
> AIM/YIM - sfburtonator,  Web - http://peerfear.org/
> GPG fingerprint: 5FB2 F3E2 760E 70A8 6174 D393 E84D 8D04 99F1 4412

To answer your subject line: No, and for the very reason you state. All of 
the master commands are serialized. You slave won't be broken, just slower 
because each command has to happen after the one before while your 
multi-user commands can interleave (assuming the row/table locks let them) 
on the master. However as each transaction on the master commits its 
changes (the binlog is nearly 100%INSERTS, UPDATES, and DELETES with a few 
administrative commands thrown in) the master writes what just committed 
to the BINLOG. Because the master is logging a statement only as it 
completes, the BINLOG should provide to the slave a serialized record of 
the changes that occur on the master. 

However, if you create changes on the master AND changes on the slave, 
that _will_ break things. Let me walk you through a scenario. An INSERT 
happens on the master to TableA and autogenerates the PK 9368. Someone 
else does an INSERT on the slave's copy of TableA, also generating the PK 
9368. When the command to create that row makes it from the Master through 
the binlog to the slave, you will generate an error because the slave 
won't be able to have two rows with the same PK value.

What is missing from MySQL to allow for multi-master replication is (at 
least) the facility necessary to make multi-server locking work. They are 
close to achieving this in the Cluster product but it's not available in 
any other engine. In our made-up scenario, the slave would need to 
"reserve" the auto_inc value 9386 for itself AND on the master the create 
the record. That way the master couldn't make a duplicate record. 
Multi-master updates are VERY hard to implement because what happens if 
BOTH servers are still up but only their connection is lost. If they BOTH 
think they are the surviving service then BOTH would carry on (in an 
attempt to minimize service loss). Should their connections to each other 
be restored, chaos will ensue until they can be brought back into synch. 
That's one of the hardest scenarios to deal with and the developers are 
working on control methods to mitigate such scenarios. Like I said, it's 
coming but not yet.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to