Как отразить трафик базы данных mysql на другой сервер - PullRequest
0 голосов
/ 12 января 2019

У меня есть две базы данных Mysql сервера в Cent OS 7. Сервер A (192.168.0.1) является действующим сервером, а сервер B (192.168.0.2) является тестовым сервером. Я хочу отразить трафик с сервера A на сервер B. Я использовал следующие команды:

Server A) iptables -A PREROUTING -t mangle -p tcp --dport 3306  -j TEE --gateway 192.168.0.2
Server A) iptables -A POSTROUTING -t mangle -p tcp --dport 3306  -j TEE --gateway 192.168.0.2

Server B) iptables -t nat -A PREROUTING -p tcp -d 192.168.0.1 --dport 3306 -j DNAT --to 192.168.0.2

Моя проблема существует на сервере B. На сервере B, когда я вижу tcpdump на порту 3306, я вижу один и тот же пакет на сервере A. Другими словами, результат tcpdump на обоих серверах одинаков.

Я искал несколько дней в Интернете, и я попробовал несколько решений. Одним из решений является определение IP-адреса сервера A на сервере B на интерфейсе lo. Я сделал это, но не сработало. Mysql на сервере B не попал в пакет, и я не вижу установленного соединения.

Я вижу эту страницу и использовал ее, но у этого решения есть издержки на сервере A, а количество подключений - 3 раза.

Есть ли решение для моей проблемы?

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Вы просто не можете сделать это путем зеркалирования потоков TCP.

Вам нужен дополнительный «внешний» инструмент, либо прокси-сервер, разработанный для такой цели (если есть такая вещь - я скептически отношусь к этой стратегии, поскольку такой подход излишне усложнит производственную среду, но он может заставить работать) или что-то вроде Percona Query Playback & sup1; который использует MySQL Slow Query Log для захвата каждого запроса с активного сервера после его завершения и воспроизведения на вторичном сервере.

Используется Slow Query Log - я подозреваю - потому что он имеет более чистый и удобный для анализа формат, чем General Query Log , который очень сложно Машина разбирается и не дает столько полезной информации.

Установка @@long_query_time в 0 убеждает MySQL Server считать все запросы соответствующими критериям «медленного» и, следовательно, подходящими для записи в медленный журнал.

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


& ПОД1; Percona Query Playback предназначен для примера, а не для одобрения. Я читал об этой утилите, но не помню, использовал ли я ее в прошлом.

0 голосов
/ 13 января 2019

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

Я решил использовать proxysql , потому что эта утилита имеет инструменты зеркального трафика.

Спасибо

0 голосов
/ 12 января 2019

Если вы просто пытаетесь синхронизировать базы данных двух серверов, почему бы просто не использовать репликацию MySQL и сделать сервер B репликой / подчиненным для сервера A?

По крайней мере, в этом сценарии, если происходит сбой соединения и репликация останавливается (или временно отстает), его можно восстановить и реплика может быть запущена для синхронизации с мастером. Если вы потеряете сетевое соединение между Сервером A и Сервером B и просто «опрыскиваете» Сервер B дублированным сетевым трафиком с Сервера A - нет никакой гарантии, что ваши наборы данных действительно будут синхронизированы.

Проверьте документы для настройки репликации между двумя серверами: https://dev.mysql.com/doc/refman/8.0/en/replication.html

...