Инструменты пользователя

Инструменты сайта


mysql._replikacija_dannyx

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
mysql._replikacija_dannyx [2016/01/28 18:44]
daniil создано
mysql._replikacija_dannyx [2016/01/28 00:00] (текущий)
Строка 1: Строка 1:
 ====== MySQL. Репликация данных ====== ====== MySQL. Репликация данных ======
 +**Репликация** — одна из техник масштабирования баз данных. Состоит эта техника в том, что данные с одного сервера базы данных постоянно копируются (реплицируются) на один или несколько других (называемые репликами). Для приложения появляется возможность использовать не один сервер для обработки всех запросов, а несколько. Таким образом появляется возможность распределить нагрузку с одного сервера на несколько.
 +
 +{{ ::mysql.replication.jpg?nolink |}}
 +
 +Существует два основных подхода при работе с репликацией данных:
 +
 +  * Master-Slave репликация.
 +  * Master-Master репликация.
 +
 +
 +----
 +
 +===== Master-Slave репликация =====
 +В этом подходе выделяется один основной сервер базы данных, который называется Мастером. На нем происходят все изменения в данных (любые запросы INSERT/UPDATE/DELETE). Слейв сервер постоянно копирует все изменения с Мастера. С приложения на Слейв сервер отправляются запросы чтения данных (запросы SELECT). Таким образом Мастер сервер отвечает за изменения данных, а Слейв за чтение.
 +
 +{{ ::mysql.master.slave.jpg?nolink |}}
 +
 +В приложении нужно использовать два соединения — одно для Мастера, второе — для Слейва:
 +
 +<code php>
 +<?
 +$master = mysql_connect('10.10.0.1', 'root', 'pwd');
 +$slave = mysql_connect('10.10.0.2', 'root', 'pwd');
 +
 +# ...
 +mysql_query('INSERT INTO users ...', $master);
 +
 +# ...
 +$q = mysql_query('SELECT * FROM photos ...', $slave);
 +</code>
 +
 +----
 +
 +==== Несколько Слейвов ====
 +Преимущество этого типа репликации в том, что Вы можете использовать более одного Слейва. Обычно следует использовать не более 20 Слейв серверов при работе с одним Мастером.
 +
 +{{ ::mysql.master.slaves.jpg?nolink |}}
 +
 +Тогда из приложения Вы выбираете случайным образом один из Слейвов для обработки запросов:
 +<code php>
 +<?
 +$master = mysql_connect('10.10.0.1', 'root', 'pwd');
 +$slaves = [
 + '10.10.0.2',
 + '10.10.0.3',
 + '10.10.0.4',
 +];
 +$slave = mysql_connect($slaves[array_rand($slaves)], 'root', 'pwd');
 +
 +# ...
 +mysql_query('INSERT INTO users ...', $master);
 +
 +# ...
 +$q = mysql_query('SELECT * FROM photos ...', $slave);
 +</code>
 +
 +----
 +
 +==== Задержка репликации ====
 +Асинхронность репликации означает, что данные на Слейве могут появится с небольшой задержкой. Поэтому, в последовательных операциях необходимо использовать чтение с Мастера, чтобы получить актуальные данные:
 +
 +<code php>
 +<?
 +$master = mysql_connect('10.10.0.1', 'root', 'pwd');
 +$slave = mysql_connect('10.10.0.2', 'root', 'pwd');
 +
 +# ...
 +mysql_query('UPDATE users SET age = 25 WHERE id = 7', $master);
 +$q = mysql_query('SELECT * FROM users WHERE id = 7', $master);
 +
 +# ...
 +$q = mysql_query('SELECT * FROM photos ...', $slave);
 +</code>
 +
 +----
 +
 +==== Выход из строя ====
 +
 +При выходе из строя Слейва, достаточно просто переключить все приложение на работу с Мастером. После этого восстановить репликацию на Слейве и снова его запустить. \\
 +
 +Если выходит из строя Мастер, нужно переключить все операции (и чтения и записи) на Слейв. Таким образом он станет новым Мастером. После восстановления старого Мастера, настроить на нем реплику, и он станет новым Слейвом.
 +
 +----
 +
 +==== Резервирование ====
 +Намного чаще репликацию Master-Slave используют не для масштабирования, а для резервирования. В этом случае, Мастер сервер обрабатывает все запросы от приложения. Слейв сервер работает в пассивном режиме. Но в случае выхода из строя Мастера, все операции переключаются на Слейв.
 +
 +----
 +
 +===== Master-Master репликация =====
 +В этой схеме, любой из серверов может использоваться как для чтения так и для записи:
 +
 +{{ ::mysql.master.master.jpg?nolink |}}
 +
 +При использовании такого типа репликации достаточно выбирать случайное соединение из доступных Мастеров:
 +<code php>
 +<?
 +$masters = [
 + '10.10.0.1',
 + '10.10.0.2',
 + '10.10.0.3',
 +];
 +$master = mysql_connect($masters[array_rand($masters)], 'root', 'pwd');
 +
 +# ...
 +mysql_query('INSERT INTO users ...', $master);
 +</code>
 +
 +----
 +
 +==== Выход из строя ====
 +
 +Вероятные поломки делают Master-Master репликацию непривлекательной. Выход из строя одного из серверов практически всегда приводит к потере каких-то данных. Последующее восстановление также сильно затрудняется необходимостью ручного анализа данных, которые успели либо не успели скопироваться.
 +
 +Используйте Master-Master репликацию только в крайнем случае. Вместо нее лучше пользоваться техникой "ручной" репликации, описанной ниже.
 +
 +----
 +
 +==== Асинхронность репликации ====
 +
 +В MySQL репликация работает в асинхронном режиме. Это значит, что приложение не знает, как быстро данные появятся на Слейве.
 +
 +{{ ::async.replication.jpg?nolink |}}
 +
 +Задержка в репликации (replication lag) может быть как очень маленькой, так и очень большой. Обычно рост задержки говорит о том, что сервера не справляются с текущей нагрузкой и их необходимо масштабировать дальше, например техниками **горизонтального** и **вертикального шардинга**.
 +
 +----
 +
 +==== Синхронный режим ====
 +Синхронный режим репликации позволит гарантировать копирование данных на Слейв.
 +
 +{{ ::mysql.sync.replication.jpg?nolink |}}
 +
 +Это упростит работу в приложении, т.к. все операции чтения можно будет всегда отправлять на Слейв. Однако это может значительно уменьшить скорость работы MySQL. Синхронный режим не следует использовать в Web приложениях.
 +
 +----
 +
 +===== "Ручная" репликация =====
 +
 +Следует помнить, что репликация — это не технология, а методика. Встроенные механизмы репликации могут принести ненужные усложнения либо не иметь какой-то нужной функции. Некоторые технологии вообще не имеют встроенной репликации.
 +\\
 +В таких случаях, следует использовать самостоятельную реализацию репликации. В самом простом случае, приложение будет дублировать все запросы сразу на несколько серверов базы данных:
 +
 +{{ ::manual.replication.jpg?nolink |}}
 +
 +При записи данных, все запросы будут отправляться на несколько серверов. Зато операции чтения можно будет отправлять на любой сервер. Нагрузка при этом будет распределяться по всем доступным серверам:
 +
 +<code php>
 +<?
 +$dbs = [
 + '10.10.0.1',
 + '10.10.0.2'
 +];
 +
 +foreach ( $dbs as $db )
 +{
 + $connection = mysql_connect($db, 'root', 'pwd');
 + mysql_query('INSERT INTO users ...', $connection);
 +}
 +
 +
 +# ...
 +
 +$connection_read = mysql_connect($dbs[array_rand($dbs)], 'root', 'pwd');
 +mysql_query('SELECT * FROM users WHERE ...', $connection_read);
 +</code>
 +
 +Это позволит использовать преимущества репликации даже если сама технология ее не поддерживает.
 +
 +----
 +
 +==== Выход из строя ====
 +При поломке одного из серверов в такой схеме необходимо сделать следующее:
 +  * Исключить сервер из списка используемых.
 +  * Настроить репликацию Master-Slave на новом сервере, используя один из рабочих серверов в качестве Мастера.
 +  * Когда все данные репликации будут синхронизированы, включить сервер обратно в список используемых и остановить репликацию.
 +
 +----
 +
 +===== Самое важное =====
 +Репликация используется в большей мере для резервирования баз данных и в меньшей для масштабирования. Master-Slave репликация удобна для распределения запросов чтения по нескольким серверам. Подход ручной репликации позволит использовать преимущества репликации для технологий, которые ее не поддерживают. Зачастую репликация используется вместе с **шардингом** при решении вопросов масштабирования.
 +
 +
  
 ---- ----
Строка 5: Строка 188:
 ===== Источники ===== ===== Источники =====
   * [[http://ruhighload.com/post/%D0%A0%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85|Репликация данных]]   * [[http://ruhighload.com/post/%D0%A0%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85|Репликация данных]]
- 
mysql._replikacija_dannyx.txt · Последнее изменение: 2016/01/28 00:00 (внешнее изменение)