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

mysqldump очень медленный при использовании частного IP

Я столкнулся с очень странной проблемой с Mysql.

У меня есть два облачных сервера, и они находятся в одном регионе и в сети VPC, поэтому скорость внутреннего соединения довольно высокая. Оба сервера работают под управлением CentOS 7.6. Я провел простой тест, используя scp скопировать между ними один большой файл со скоростью около 160 МБ / с.

Затем я установил MySQL 5.7 на один из серверов. Я импортировал в него базу данных (около 40 ГБ).

В следующий раз, когда я попытался сделать mysqldump (локально на сервере db) Я обнаружил, что скорость очень низкая. Это примерно 4 ~ 5 МБ / с. Это заняло более 30 минут.

Вот команда, которую я использовал:

mysqldump -q --master-data=2 --single-transaction -utest -p'xxxxx' -h192.168.1.47 testdb > testdb.sql

192.168.1.47 - это частный IP-адрес сервера.

Затем я удалил часть «-h192.168.1.47» и использовал вместо нее «localhost», скорость очень высокая и составляла около 20 ~ 30 МБ / с. Выгрузка базы данных заняла всего шесть минут.

Я попытался сбросить базу данных по сети на другом моем сервере, и это тоже очень медленно.

Мой вопрос: есть ли какие-либо настройки или ограничения на стороне Linux или MySQL, которые могут вызвать такое поведение? Ниже приведен файл конфигурации mysql.

symbolic-links=0

skip-name-resolve
bind-address=192.168.1.47
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
table_open_cache=4096
open_files_limit=65535
max_connections=1500
interactive_timeout=3600
wait_timeout=3600
interactive_timeout=3600
innodb_lock_wait_timeout=300
max_allowed_packet=64M
innodb_log_file_size=512M
innodb_log_buffer_size=1M
tmp_table_size=1024M
max_heap_table_size=1024M
innodb_buffer_pool_size=80G
query_cache_type=0
query_cache_size=0
log-bin=/data/mysql/dbmaster
server-id=1
binlog_format=mixed
expire_logs_days=5


log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

mysqldump будет использовать именованные каналы для localhost, а не TCP. Вы можете дважды проверить, что это проблема, сравнив np:localhost с участием tcp:\\localhost. (Я думаю, что это правильный синтаксис для np: но вам может потребоваться указать имя файла, например, в /tmp. Я что-то читал о tcp:(local) и np:(local) где-то, и я не уверен, было ли это буквальным, стоит попробовать, если мои предложения не работают.) Если tcp:\\localhost совпадает с вашим IP-адресом, то разница заключается в накладных расходах на использование стека TCP, а не именованных каналов.

Обратите внимание, что база данных 40 ГБ - это 40 ГБ на диске, что является относительно компактным представлением. В SQL это занимает НАМНОГО больше байтов! Как сказано в документации для mysqldump, это неэффективный способ резервного копирования базы данных. Эффективный способ - создать резервную копию файловой структуры, которую использует база данных SQL (что намного эффективнее во многих отношениях, включая возможность инкрементного резервного копирования).

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

Если исполнение tcp://localhost работает быстро (похоже на просто localhost), затем убедитесь, что связь с вашим IP-адресом осуществляется с помощью интерфейса обратной петли, используя это:

tcpdump -i lo -n

Обратите внимание, что при этом будет генерироваться МНОГО выходных данных, если трафик использует интерфейс обратной петли (это то, что вам нужно для наилучшей производительности). Так что сделайте это в другом окне, конвейере или перенаправлении, и будьте готовы сразу же прервать mysqldump. Если это НЕ дает много вывода. Вам также придется отсеять обычный фоновый трафик. Если фонового трафика много, попробуйте что-нибудь вроде этого:

tcpdump -i lo -n > junk

Запустите это в течение двух секунд и нажмите ^ C, когда mysqldump не запущен, и проверьте размер нежелательной почты. Попробуйте еще раз в течение двух секунд, когда он есть, и мусор должен быть огромным по сравнению, если он использует устройство обратной связи (которое вы хотите).

Если он не использует устройство обратной петли для вашего внешнего IP-адреса, что-то не так с сетевой конфигурацией вашей локальной системы, и вы хотите открыть новый вопрос по этому поводу.