MySQL - теория репликации

Материал из Wiki - Iphoster - the best ever hosting and support. 2005 - 2024
Перейти к:навигация, поиск

MySQL - теория репликации

3 основных подхода при работе с репликацией mysql:

- master-slave
- master-master
- ручная репликация


Master-Slave

В данном случае 1 сервер является мастером, остальные сервера slave сервера - реплики.
На Master сервере происходит выполнение всех sql запросов в том числе на изменение данных, на slave серверах происходит только запросы на чтение-выборку - то есть SELECT запросы.
Данный метод используется как резервирование данных или разгрузки основного сервера за счет выплнение SELECT запросов на репликах.
Если выходит из строя master - то один из slave делается master сервером, остальные копируют данные с него. Старый master после замены становится slave.
Так как репликация происходит асинхронно, то возникают задержки между копированием данных с master-а на slave сервер, поэтому для последовательных операциях нужно использовать master сервер.


Пример: master-slave
<?
$master = mysql_connect('192.168.0.1', 'root', 'pass');
$slave = mysql_connect('192.168.0.2', 'root', 'pass');
mysql_query('UPDATE users SET age = 17 WHERE id = 1', $master);
$q = mysql_query('SELECT * FROM users WHERE id = 1', $master);
$q = mysql_query('SELECT * FROM photos ...', $slave);
Пример: master- несколько slave серверов
<?
$master = mysql_connect('192.168.0.1', 'root', 'pwd');
$slaves = [
	'192.168.0.2',
	'192.168.0.3',
	'192.168.0.4',
 ];
$slave = mysql_connect($slaves[array_rand($slaves)], 'root', 'pass');
mysql_query('INSERT INTO users ...', $master);
$q = mysql_query('SELECT * FROM photos ...', $slave);
Пример: задержка репликации
<?
$master = mysql_connect('192.168.0.1', 'root', 'pass');
$slave = mysql_connect('192.168.0.2', 'root', 'pass');
mysql_query('UPDATE users SET age = 17 WHERE id = 1', $master);
$q = mysql_query('SELECT * FROM users WHERE id = 1', $master);
$q = mysql_query('SELECT * FROM photos ...', $slave);


Master-Master

В этой схеме все mysql сервера могут использоваться как для чтения, так и для записи данных.

Пример: Master-Master
<?
$masters = [
	'192.168.0.1',
	'192.168.0.2',
	'192.168.0.3',
 ];
$master = mysql_connect($masters[array_rand($masters)], 'root', 'pass');
mysql_query('INSERT INTO users ...', $master);

Ручная репликация

Ручная репликация - когда приложение одновременно записывает данные на несколько mysql серверов, а SELECT запросы уже может делать с рандомного mysql сервера.

Пример: ручная репликация
<?
$dbs = [
	'192.168.0.1',
	'192.168.0.2'
 ];
foreach ( $dbs as $db )
{
 $connection = mysql_connect($db, 'root', 'pass');
 mysql_query('INSERT INTO users ...', $connection);
} 
$connection_read = mysql_connect($dbs[array_rand($dbs)], 'root', 'pass');
mysql_query('SELECT * FROM users WHERE ...', $connection_read); </nowiki>