mysql._replikacija_dannyx
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| mysql._replikacija_dannyx [2016/01/28 18:44] – создано daniil | mysql._replikacija_dannyx [Дата неизвестна] (текущий) – внешнее изменение (Дата неизвестна) 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== MySQL. Репликация данных ====== | ====== MySQL. Репликация данных ====== | ||
| + | **Репликация** — одна из техник масштабирования баз данных. Состоит эта техника в том, что данные с одного сервера базы данных постоянно копируются (реплицируются) на один или несколько других (называемые репликами). Для приложения появляется возможность использовать не один сервер для обработки всех запросов, | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | Существует два основных подхода при работе с репликацией данных: | ||
| + | |||
| + | * Master-Slave репликация. | ||
| + | * Master-Master репликация. | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Master-Slave репликация ===== | ||
| + | В этом подходе выделяется один основной сервер базы данных, | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | В приложении нужно использовать два соединения — одно для Мастера, | ||
| + | |||
| + | <code php> | ||
| + | <? | ||
| + | $master = mysql_connect(' | ||
| + | $slave = mysql_connect(' | ||
| + | |||
| + | # ... | ||
| + | mysql_query(' | ||
| + | |||
| + | # ... | ||
| + | $q = mysql_query(' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Несколько Слейвов ==== | ||
| + | Преимущество этого типа репликации в том, что Вы можете использовать более одного Слейва. Обычно следует использовать не более 20 Слейв серверов при работе с одним Мастером. | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | Тогда из приложения Вы выбираете случайным образом один из Слейвов для обработки запросов: | ||
| + | <code php> | ||
| + | <? | ||
| + | $master = mysql_connect(' | ||
| + | $slaves = [ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ]; | ||
| + | $slave = mysql_connect($slaves[array_rand($slaves)], | ||
| + | |||
| + | # ... | ||
| + | mysql_query(' | ||
| + | |||
| + | # ... | ||
| + | $q = mysql_query(' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Задержка репликации ==== | ||
| + | Асинхронность репликации означает, | ||
| + | |||
| + | <code php> | ||
| + | <? | ||
| + | $master = mysql_connect(' | ||
| + | $slave = mysql_connect(' | ||
| + | |||
| + | # ... | ||
| + | mysql_query(' | ||
| + | $q = mysql_query(' | ||
| + | |||
| + | # ... | ||
| + | $q = mysql_query(' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Выход из строя ==== | ||
| + | |||
| + | При выходе из строя Слейва, | ||
| + | |||
| + | Если выходит из строя Мастер, | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Резервирование ==== | ||
| + | Намного чаще репликацию Master-Slave используют не для масштабирования, | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Master-Master репликация ===== | ||
| + | В этой схеме, любой из серверов может использоваться как для чтения так и для записи: | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | При использовании такого типа репликации достаточно выбирать случайное соединение из доступных Мастеров: | ||
| + | <code php> | ||
| + | <? | ||
| + | $masters = [ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ]; | ||
| + | $master = mysql_connect($masters[array_rand($masters)], | ||
| + | |||
| + | # ... | ||
| + | mysql_query(' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Выход из строя ==== | ||
| + | |||
| + | Вероятные поломки делают Master-Master репликацию непривлекательной. Выход из строя одного из серверов практически всегда приводит к потере каких-то данных. Последующее восстановление также сильно затрудняется необходимостью ручного анализа данных, | ||
| + | |||
| + | Используйте Master-Master репликацию только в крайнем случае. Вместо нее лучше пользоваться техникой " | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Асинхронность репликации ==== | ||
| + | |||
| + | В MySQL репликация работает в асинхронном режиме. Это значит, | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | Задержка в репликации (replication lag) может быть как очень маленькой, | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Синхронный режим ==== | ||
| + | Синхронный режим репликации позволит гарантировать копирование данных на Слейв. | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | Это упростит работу в приложении, | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== " | ||
| + | |||
| + | Следует помнить, | ||
| + | \\ | ||
| + | В таких случаях, | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | При записи данных, | ||
| + | |||
| + | <code php> | ||
| + | <? | ||
| + | $dbs = [ | ||
| + | ' | ||
| + | ' | ||
| + | ]; | ||
| + | |||
| + | foreach ( $dbs as $db ) | ||
| + | { | ||
| + | $connection = mysql_connect($db, | ||
| + | mysql_query(' | ||
| + | } | ||
| + | |||
| + | |||
| + | # ... | ||
| + | |||
| + | $connection_read = mysql_connect($dbs[array_rand($dbs)], | ||
| + | mysql_query(' | ||
| + | </ | ||
| + | |||
| + | Это позволит использовать преимущества репликации даже если сама технология ее не поддерживает. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Выход из строя ==== | ||
| + | При поломке одного из серверов в такой схеме необходимо сделать следующее: | ||
| + | * Исключить сервер из списка используемых. | ||
| + | * Настроить репликацию Master-Slave на новом сервере, | ||
| + | * Когда все данные репликации будут синхронизированы, | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Самое важное ===== | ||
| + | Репликация используется в большей мере для резервирования баз данных и в меньшей для масштабирования. Master-Slave репликация удобна для распределения запросов чтения по нескольким серверам. Подход ручной репликации позволит использовать преимущества репликации для технологий, | ||
| + | |||
| + | |||
| ---- | ---- | ||
| Строка 5: | Строка 188: | ||
| ===== Источники ===== | ===== Источники ===== | ||
| * [[http:// | * [[http:// | ||
| - | |||
mysql._replikacija_dannyx.1453995888.txt.gz · Последнее изменение: 2016/01/28 00:00 (внешнее изменение)
