Mysql Failover (Невозможно записать операции на новый мастер) - PullRequest
1 голос
/ 16 февраля 2012

У меня есть настройка mysql master-master на основе отношения master-slave для целей репликации. Мне удалось получить работающую часть репликации, и я исследовал отказоустойчивую часть, в результате которой ведомое устройство стало ведущим (если первоначальный главный вышел из строя) на основе ручного вмешательства.

Однако я не могу «Перенаправить записи на новый мастер после применения журнала ретрансляции». Я пытаюсь сделать это через разъем / J. Строка подключения, используемая в коде приложения: String dbURL = "jdbc:mysql://180.148.100.222,180.148.100.223:3306/dbName";

Ожидаемый результат должен быть, когда я запускаю новый сеанс с помощью http://180.148.100.222:8080/index.html (клиентское приложение), чтобы инициировать операцию WRITE, он будет перенаправлен на 180.148.100.223 (так как 180.148.100.222 в этом случае потерпит неудачу) и успешно выполнить операцию записи.

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

Заранее спасибо - любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 27 января 2015

Установив параметр failOverReadOnly=false, вы можете запретить аварийному соединению находиться в режиме только для чтения.Также используйте com.mysql.jdbc.ReplicationDriver или сообщите свой URL-адрес соединения jdbc для внутреннего выбора драйвера, задав URL-адрес, например jdbc:mysql:replication://<your url...>

В тестовой среде с двумя экземплярами базы данных mysql (порт 3306 и 3307) я использовал следующее соединение jdbcurl:

jdbc:mysql:replication://address=(type=master)(protocol=tcp)(host=localhost)(port=3306),address=(type=master)(protocol=tcp)(host=localhost)(port=3307)/test?autoReconnect=true&amp;connectTimeout=50&amp;failOverReadOnly=false&amp;allowMasterDownConnections=true" />

Дополнительные параметры см. в Свойства для Connector / J .

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


Что вам действительно нужно решение без мастеров с балансировкой нагрузки .Это можно сделать с помощью пула соединений.Я использовал встроенные функции org.apache.commons.dbcp2.BasicDataSource, но у него есть один недостаток : пул создается только один раз и доступен только до тех пор, пока не отключится первый мастер.На втором хозяине не будет бассейна.Возможно, на это поведение может повлиять расширение BasicDataSource с помощью собственной логики, я еще не полностью протестировал его.

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

Вот код:

 <beans:bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="url"        
        value="jdbc:mysql://address=(protocol=tcp)(host=localhost)(port=3306)(type=master),address=(protocol=tcp)(host=localhost)(port=3307)(type=master)/test?autoReconnect=true&amp;connectTimeout=5&amp;failOverReadOnly=false&amp;allowMasterDownConnections=true" />
    <beans:property name="username" value="myDBUser" />
    <beans:property name="password" value="myPassword" />
    <beans:property name="initialSize" value="10"/>
</beans:bean>

Обратите внимание, что ReplicationDriver не используется, BasicDataSource управляет переключением при сбое.

Michael

0 голосов
/ 22 января 2015

Попробуйте создать свой URL-адрес для подключения по протоколу tcp:

jdbc:mysql://address=(protocol=tcp)(host=<IP address host 1>)(port=<your port>)(type=master),address=(protocol=tcp)(host=<IP address host 2>)(port=<your port>)(type=master)/<db_name>

Используйте (protocol=tcp) или (protocol=pipe) для именованных каналов в Windows и (path=path_to_pipe) для именованных каналов (host=hostname) для TCP

Убедитесь, что вы используете MySQL Connector / J 5.1.27 или выше, см. Поддержка Mulitple-Master .Это должно работать при использовании адресов IPv6.Он (должен) также работает с IPv4 и направляет весь трафик первому мастеру.Когда первый мастер отключается, соединение переключается на второго мастера.Однако я заметил, что аварийное соединение со вторым мастером внезапно доступно только для чтения.Я пытаюсь выяснить, почему ...

В качестве альтернативы вы также можете настроить соединение с балансировкой нагрузки, см. эту ссылку .

Майкл

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