One of the latest labs releases of Oracle MySQL brings multi source
replication. This lifts the limitation found in earlier releases
that a MySQL slave can only have one master.
To be fair, there were other ways of doing this already:
- Using a time based switch as described in MySQL High Availability
- Using the multi source feature in the yet-to-be released MariaDB 10
- Using Tungsten Replicator
There are many good uses of multi source replication. You could
use it to combine data from multiple shards or
applications.
If MySQL is used with a loadbalancer the most easy to build setup
is a 2-way multi master. This makes it possible to use the InnoDB
storage engine. Using MySQL Cluster is another alternative, but
MySQL Cluster uses the NDB storage engine, and might not be a
supported option for your application. A MySQL Cluster setup also
needs at least 4 machines to be fully redundant and MySQL Multi
Master only needs two machines.
There is little intelligence required in the loadbalancer. It
should write to one server and read from both servers. If the
first server is unavailable then it should write to the second
one. The requirement to only write to one server has to do with
the fact that replication is not fully synchronous (MySQL Cluster
is synchronous, and there it is supported to write to all nodes).
While the might seem like a disadvantage, it can actually be
helpfull to do online schema changes.
One of the drawbacks of multi master is that multi master with
more than 2 nodes can be a nightmare to maintain and will
probably not help you to get more performance or
reliability.
Another drawback is that it is not easy to add a disaster
recovery setup to a multi master setup. If you have 2 locations
with 2 servers in each location and create a multi-master setup
from each pair than it's not possible to get one pair to slave
from another pair as each server already has a master. You could
create a multi-master on one site and then have a
slave-with-a-slave in the other location, but then you'll have to
change that setup during or after the site failover to get to the
same setup as you had in the primary location.
With multi source replication you can now create a multimaster
setup which is slave of another multi-master setup.
I did do some basic tests with the labs release for multi source
replication and it looks great.
The "FOR CHANNEL='chan1'" syntax works quite well, although I
would have gone for "FOR CHANNEL 'chan1'" (without the equal
sign). I would have been nice if MariaDB and MySQL would have
used the same syntax, but unfortunately this isn't the case.
(MariaDB uses "CHANGE MASTER 'master1' TO...")
For multi source replication to work you have to set both
master_info_repository and relay_log_info_repository to TABLE. I
only had one of these set, and the error message was not really
clear about which setting was wrong.
2013-11-23T14:37:52.972108Z 1 [ERROR] Slave: Cannot create new
master info structure when repositories are of type FILE.
Convert slave repositories to TABLE to replicate from
Multiple sources.
I build a tree-node multi-master with multi source replication.
Each server was a slave of the other two servers. The advantages
of this setup to a regular 3 node circular setup is that you
don't need to enable log-slave-updates, which can save quite some
I/O on the binlog files. Also if one node breaks then the
remaining two nodes will still receive updates from each other
instead of only one node receiving all updates.
If you use sharding you can use multi source replication to
combine two (or more) shards into one. This is similar to
how I like to do major version upgrades: first make the new setup
a slave of the old setup. This gives you a window for testing the
new setup.
So multi source replication is very usefull in many setups.