MySQL репликация - блокировка таблицы? - PullRequest
9 голосов
/ 22 октября 2008

В настоящее время я работаю в компании, у которой есть веб-сайт, на котором работает mysql / php (все таблицы также используют тип таблицы MYISAM).

Мы хотели бы реализовать репликацию, но я читал в документах mysql и в других местах в Интернете, что это будет блокировать таблицы при выполнении записи в двоичный журнал (из которого в конечном итоге будут работать ведомые базы данных).

Будут ли эти блокировки вызывать проблемы на живом сайте, который требует много записи? Кроме того, есть ли способ включить репликацию без блокировки таблиц?

Ответы [ 3 ]

6 голосов
/ 23 октября 2008

Если вы измените типы таблиц на innodb, используется блокировка на уровне строк. Кроме того, ваша репликация будет более стабильной, так как обновления будут транзакционными. Репликация MyISAM - это долговременная боль.

Убедитесь, что ваши серверы соответствуют версии, и ВСЕГДА обязательно выключите мастер, прежде чем выключать подчиненные. Вы можете снова вызвать мастера сразу же после выключения рабов, но вы должны его снять.

Кроме того, убедитесь, что вы используете соответствующие параметры автоматического расширения для InnoDB. И, пока вы занимаетесь этим, вам, вероятно, захочется перейти от float и удвоить до 'decimal' (что означает mysql 5.1). Это избавит вас от головной боли при репликации.

Это, вероятно, немного больше, чем вы просили. Наслаждайтесь.

P.s., Да, блокировки myisam могут вызвать проблемы. Кроме того, innodb медленнее, чем myisam, если только myisam не блокирует огромный выбор.

4 голосов
/ 28 октября 2008

По моему опыту DBAing для сайта с интенсивной записью, запись двоичного журнала не добавляет ощутимых проблем с блокировкой или производительностью на главном компьютере . Если вы хотите сравнить его, просто включите бинарную регистрацию. Я действительно не думаю, что таблицы заблокированы для записи запросов в двоичный журнал.

Блокировка таблицы на slave - это совсем другое дело. Репликация является последовательной: каждый запрос выполняется до того, как ведомый запустит следующий. Поэтому длинные обновления приведут к тому, что репликация будет временно отставать. Если ваше приложение намеревается использовать репликацию для горизонтального масштабирования, оно должно знать, как это сделать.

0 голосов
/ 24 октября 2008

Решение с типом таблицы myisam не «лучше». Однако с этим можно обойтись.

Лучшее, что вы можете сделать, это убедиться, что ваш ведомый и ведущий работают на одном и том же оборудовании (различия в FPU могут приводить к ошибкам репликации), а также убедиться, что на ваших серверах MySQL запущены одинаковые номера версий.

Следующая ссылка отвечает на ваши вопросы. В частности, блокировки в таблицах MyISAM имеют меньше шансов на блокировку записи, если не происходит удаления. Таким образом, таблица, в которой нет отверстий для удаления, будет работать быстрее в реплицированной установке.

http://dev.mysql.com/doc/refman/5.1/en/internal-locking.html

Вы можете смягчить эффект «дырок», периодически экспортируя / импортируя DBA во время запланированных простоев (особенно после массовых удалений). Кроме того, убедитесь, что ведомые базы данных не отключаются, когда ведущий все еще работает. Это избавит вас от многих проблем.

...