MySQL - теория репликации
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>