Создание кластера MySQL с использованием docker-контейнеров mysql-server на нескольких серверах
Я пытаюсь создать кластер MySQL из 3 узлов, используя контейнеры докеров mysql-server.
У меня есть 3 отдельных облачных экземпляра, и на всех трех из них настроен докер. На каждом сервере будет работать только 1 контейнер - для достижения высокой доступности в кластере.
Я запускаю контейнеры на всех 3 серверах по отдельности командой
docker run --name=db -p 3301:3306 -v db:/var/lib/mysql -d mysql/mysql-server
Я сопоставляю порт 3306 контейнера с портом 3301 моего сервера. Я также создал нового пользователя clusterteradmin для удаленного доступа.
Затем из mysql-shell я выполнил следующую команду - для всех 3 серверов
dba.configureInstance('clusteradmin@serverIp:3301')
Я получаю подобное сообщение для всех-
Обратите внимание, что он говорит: "Этот экземпляр сообщает свой собственный адрес как 39xxxxxxxxxx:3306".
Затем я успешно создаю кластер на одном из серверов. Но при добавлении двух других серверов в этот кластер я получаю следующую ошибку
При проверке журналов для этого конкретного сервера я вижу следующие строки
В нем написано: "равноправный адрес a9yyyyyyyyyy:33061 недействителен". Это связано с тем, что, поскольку контейнеры работают на разных серверах, идентификатор контейнера не распознается другими контейнерами на другом сервере.
Я перепробовал много вариантов, но безуспешно. Один из способов заключался в использовании параметров report-host и report-port при запуске контейнера, например:
docker run --name=db2 -p 3301:3306 -v db2:/var/lib/mysql -d mysql/mysql-server --report-host=139.59.11.215 --report-port=3301
Но проблема с этим подходом заключается в том, что во время dba.configureInstance() он хочет обновить порт до значения по умолчанию и выдает ошибку, например
Любой, кому удалось создать такой кластер контейнеров mysql-server, работающих на разных серверах, я был бы очень признателен за указатели в этом отношении.
1 ответ
Я просмотрел документацию и исходный код, но не нашел объяснения, почему прослушивание и объявление разных портов проблематично.
Я решил проблему, используя
--port 3301
при вызове mysql-сервера:
docker run --name=db2 -p 3301:3301 -v db2:/var/lib/mysql -d mysql/mysql-server --report-host=139.59.11.215 --port 3301