Назад | Перейти на главную страницу

MySQL удаленное соединение медленное

Поскольку трафик в моей электронной коммерции (PrestaShop) продолжает расти, а навигация становится медленной, я решил после прочтения многих сообщений здесь отделить свой веб-сервер от сервера БД. Я установил удаленное соединение с MySQL. Оба сервера находятся в одном центре обработки данных и имеют между собой пинг менее 1 мс.

Когда я переключаю БД на новый удаленный сервер, все идет очень медленно,

Я пропустил разрешение имени в конфигурации my.cnf, но ничего заметно не изменилось. любое действие на веб-сайте загружается более 10 секунд

Что мне не хватает? Это из-за PrestaShop? Как тогда я могу улучшить доступность моего сервера? Должен ли я просто балансировать нагрузку между серверами с Интернетом и БД в одном ящике?

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
#skip_name_resolve
skip-name-resolve
#bind-address            = 127.0.0.1
#
# * Fine Tuning
#
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10
# * Query Cache Configuration
#
query_cache_limit       = 1M
query_cache_size        = 16M

#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1

log_error = /var/log/mysql/error.log

#slow_query_log_file = /var/log/mysql/mysql-slow.log
#slow_query_log      = 1
#long_query_time = 2
#log_queries_not_using_indexes

#server-id              = 1
#log_bin                        = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name

# chroot = /var/lib/mysql/

# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer              = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

Я не получаю потери пакетов между серверами.

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

Мои серверы на Debian 8:
Процессор: Intel 2x Xeon E5-2630v3 - 16c / 32t - 2,4 ГГц / 3,2 ГГц
Оперативная память: 128Go DDR4 ECC 1866 МГц
Диск: SoftRaid 2x2To SSD

На ваш вопрос нет однозначного ответа, так как информации просто недостаточно. Однако вместо того, чтобы сосредоточиться на сети как на основной причине вашей проблемы, я лучше изучу конфигурацию MySQL на новом сервере. Обычно это в /etc/mysql/my.cnf (или похожие). Сравните обе версии старой и новой установки. Может нужно увеличить пул подключений что ли?

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

Если второй сервер - это новая установка, возможно, никто не будет изменять настройки на этом сервере.

Вторичный вы можете получить хорошие результаты, если разделите трафик.

Например:

  • interfaceA веб-сервера, подключенного напрямую к интерфейсу сервера БД

  • interfaceB веб-сервера, используемого для обработки веб-запросов

Попробуйте запустить запрос MySQL вручную с сервера приложений на сервер базы данных с помощью mysql такую ​​команду и определите, как она будет выполняться:

  • time mysql -u'username' -p'password' -e'show status'

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

Ознакомьтесь с протоколом сжатия MySQL - это удобно, когда есть множество записей для возврата на веб-страницу с внешнего сервера (особенно WAN)

https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-connections.html

Если установлено значение true (или 1), этот параметр включает сжатие всей информации, передаваемой между клиентом и сервером, если оба поддерживают сжатие. По умолчанию сжатие отсутствует (false или 0). Если вы подключаетесь с использованием параметров команды, эквивалентным параметром является --compress (-C). Сжатие доступно только для соединений MySQL Shell, использующих классический протокол MySQL. Вы можете установить параметр конфигурации defaultCompress MySQL Shell, чтобы включить сжатие для каждого глобального сеанса. Команда MySQL Shell \ status показывает, включено ли сжатие для сеанса.