Вопрос или проблема
На: https://proxysql.com/documentation/ProxySQL-Configuration/
Инструкции по proxy sql гласят:
ПРИМЕЧАНИЕ: Серверы MySQL в качестве бэкенда имеют read_only = 1, настроенный на всех репликах. ProxySQL рассматривает бэкенд-инстансы с read_only = 0 как WRITER-инстансы, поэтому это следует устанавливать только на ваших основных серверах MySQL (или всех основных серверах в случае многоосновной репликации). Убедитесь, что это правильно настроено, выполните set global read_only = 1 и настройте это в файле my.cnf, так как ProxySQL будет принимать решения о маршрутизации на основе этого значения.
Означает ли это, что если я выполню:
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (0,'mariadb1.cn.lan',3306);
мой сервер mariadb1.cn.lan будет доступен для чтения/записи?
Что означает
set global read_only = 1
Ответ или решение
ProxySQL — это мощный инструмент, предназначенный для улучшения масштабируемости и надежности MySQL-баз данных. Одной из его ключевых функций является динамическое распределение нагрузки между несколькими серверами базы данных. В этой связи важным понятием в ProxySQL является hostgroup_id
, который играет ключевую роль в распределении трафика между различными серверами. Давайте подробно рассмотрим, что означает hostgroup_id
и как он используется в контексте ProxySQL, а также разберёмся с понятием read_only
в MySQL.
Теория
Hostgroup и hostgroup_id в ProxySQL
-
В ProxySQL
hostgroup_id
используется для группировки серверов, которые могут выполнять определенные роли. Это идентификатор группы серверов, который является основным при распределении запросов. -
По умолчанию, различные группы серверов (hostgroups) могут быть настроены для выполнения операций только на чтение, только на запись или обеих функций. Hostgroup с
hostgroup_id=0
обычно настраивается для первичных серверов (WRITER), куда направляются команды на запись.
Чтение и запись в MySQL
- В контексте MySQL понятие
read_only
относится к возможности сервера выполнять операции записи. SET GLOBAL read_only = 1
делает базу доступной только для чтения. Это обычно используется для реплик (чаще для серверов Slave), чтобы предотвратить нежелательные изменения данных.
Пример
В вашем примере:
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0, 'mariadb1.cn.lan', 3306);
этот запрос добавляет сервер mariadb1.cn.lan
в группу серверов с идентификатором hostgroup_id=0
. Если ProxySQL настроен по умолчанию, это означает, что hostgroup_id=0
предназначен для WRITER-серверов. Таким образом, если read_only
на этом сервере отключен (read_only=0
), ProxySQL будет считать его доступным для операций записи.
Применение
Если ваш сервер mariadb1.cn.lan
настроен с read_only=0
, ProxySQL будет маршрутизировать запросы на запись к этому серверу, исходя из логики балансировки нагрузки. Это имеет критическую важность в системах, где необходимо гарантировать, что только определенные серверы могут принимать запросы на запись.
В случае неправильной конфигурации, как если бы вы оставили read_only=0
на всех серверных узлах, вы бы могли столкнуться с непредсказуемым поведением, особенно в средах с несколькими допускающими запись серверами. Правильно относясь к конфигурированию переменной read_only
, вы обеспечиваете, что нагрузка распределяется согласно проектным решениям, минимизируя риск конфликтов записи.
Выводы
Правильная конфигурация hostgroup_id
и управление read_only
важны для обеспечения надёжной и отказоустойчивой работы сервера. Используя hostgroup_id
, вы можете точно определить, какой сервер будет получать конкретные типы запросов. Это способствует более целенаправленному распределению нагрузок и повышению устойчивости базы данных.
ProxySQL предоставляет сложные механизмы управления и предоставляет вашему проекту гибкость в конфигурации, позволяя одновременно увеличивать производительность и надежность базы данных. Однако правильная настройка и понимание его работы необходимы для полной реализации всех его возможностей.