Разделение хостов баз данных для оптимизации в Laravel

Источник: «Separating Database Hosts to Optimize Read and Write Operations in Laravel»
Если говорить о производительности базы данных, то она в первую очередь определяется тем, насколько хорошо база данных справляется с операциями чтения и записи.

Динамика чтения и записи

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

Например, в MySQL производительность чтения может пострадать при одновременном выполнении операций записи, поскольку операции записи могут получить блокировки, которые могут задержать операции чтения, особенно если база данных интенсивно используется и количество одновременных операций велико.

Кроме того, в большинстве случаев дисковый ввод/вывод распределяется между операциями чтения и записи. Большие объёмы записи могут привести к задержке ввода/вывода, замедляя операции чтения.

Подход мастер и слейв

Чтобы решить эту проблему, можно использовать отдельные узлы баз данных для операций чтения и записи. Этого можно добиться, создав мастер и слейв экземпляры базы данных и используя репликацию для синхронизации данных между двумя базами.

Мастер используется для выполнения операций записи, а слейв — для операций чтения.

Хосты базы данных Мастер/Master и Слейв/Slave
Хосты базы данных Мастер/Master и Слейв/Slave

В Laravel это делается легко

Когда всё это настроено, приходит время использовать их в приложении. Laravel позволяет управлять всем этим с особой лёгкостью.

Всё, что нужно, — это настроить хосты read и write в файле config/database.php следующим образом.

'mysql' => [
'read' => [
'host' => [
'192.168.1.1',
'196.168.1.2',
],
],
'write' => [
'host' => [
'196.168.1.3',
],
],
'sticky' => true,

// код закомментирован для краткости
],

Как видите, Laravel автоматически определяет операции чтения и записи и использует хосты соответствующим образом.

Необязательный параметр sticky может быть установлен в true, чтобы разрешить немедленное чтение записей, которые были записаны в базу данных в течение текущего цикла запроса. Это означает, что если есть запись, записанная в базу данных, её можно немедленно прочитать с хоста базы данных write в том же цикле запроса. Она >прилипает к узлу записи.

В заключение

Так можно использовать отдельные хосты баз данных для оптимизации операций чтения и записи в Laravel. Исходя из требований приложения, можно настроить конфигурацию соответствующим образом, например, изменить количество хостов или липкость, и это, несомненно, повысит производительность приложения.

Дополнительные материалы

Предыдущая Статья

Предоставление определения типа для CSS с @property

Следующая Статья

Как настроить MySQL репликацию Master-Slave