6.8.3 Настройка кластера InnoDB и MySQL Router
В следующем примере мы выполним следующие задачи, используя песочницу с развертыванием AdminAPI для развертывания кластера InnoDB с MySQL Router.
Использование локальных песочных инстансов MySQL позволяет протестировать функциональность локально, прежде чем развертывать её на производственных серверах. AdminAPI имеет встроенную функциональность для создания песочных инстансов, предварительно настроенных для работы с InnoDB Cluster, InnoDB ClusterSet и InnoDB ReplicaSet в локально развернутой среде.
Этот пример содержит следующие разделы:
Песочные инстансы подходят только для развертывания и работы на вашем локальном компьютере в целях тестирования.
Установка
Установите следующие компоненты:
MySQL Server: Для получения дополнительной информации см. .
MySQL Shell: Для получения дополнительной информации, см. Установка MySQL Shell.
MySQL Router: Для получения дополнительной информации см. .
Создание конфигурации песочницы кластера InnoDB
Для обеспечения толерантности к одному отказу создайте кластер InnoDB с тремя инстансами. В этом примере мы будем использовать три песочных инстанса, работающих на одном компьютере. В реальной настройке эти три инстанса будут работать на разных хостах в сети.
-
Для запуска MySQL Shell введите:
> mysqlsh -
Для создания и запуска песочных инстансов MySQL используйте функцию
dba.deploySandboxInstance(), которая является частью X AdminAPI. Введите следующие три инструкции в MySQL Shell и введите пароль root для каждого инстанса:mysql-js> dba.deploySandboxInstance(3310) mysql-js> dba.deploySandboxInstance(3320) mysql-js> dba.deploySandboxInstance(3330)ПримечаниеИспользуйте один и тот же пароль root для всех инстансов.
Создание кластера InnoDB
Для создания кластера InnoDB выполните следующие шаги:
-
Подключитесь к инстансу MySQL, который вы хотите сделать основным инстансом в кластере InnoDB, выполнив:
mysql-js> shell.connect('root@localhost:3310') -
Выполните команду
dba.createCluster()для создания кластера и используйте присвоенную переменнуюclusterдля хранения выведенного значения:mysql-js> cluster = dba.createCluster('devCluster')Эта команда выводит:
A new InnoDB cluster will be created on instance 'localhost:3310'. Validating instance configuration at localhost:3310... NOTE: Instance detected as a sandbox. Please note that sandbox instances are only suitable for deploying test clusters for use within the same host. This instance reports its own address as 127.0.0.1:3310 Instance configuration is suitable. NOTE: Group Replication will communicate with other members using '127.0.0.1:33101'. Use the localAddress option to override. Creating InnoDB cluster 'devCluster' on '127.0.0.1:3310'... Adding Seed Instance... Cluster successfully created. Use Cluster.addInstance() to add MySQL instances. At least 3 instances are needed for the cluster to be able to withstand up to one server failure. <Cluster:devCluster> -
Проверьте, что создание прошло успешно, используя функцию
cluster.status()с присвоенной переменнойcluster:mysql-js> cluster.status()
Вывод следующего статуса:
{ “clusterName”: “devCluster”, “defaultReplicaSet”: { "name": "default", "primary": "127.0.0.1:3310", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "127.0.0.1:3310": { "address": "127.0.0.1:3310", "memberRole": "PRIMARY", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" } }, "topologyMode": "Single-Primary" }, “groupInformationSourceMember”: “127.0.0.1:3310” } -
Кластер запущен, но еще не устойчив к отказу. Добавьте еще инстансы MySQL в кластер, используя функцию
<Cluster>.addInstance():{ mysql-js> cluster.addInstance('root@localhost:3320') NOTE: The target instance '127.0.0.1:3320' has not been pre-provisioned (GTID set is empty). The Shell is unable to decide whether incremental state recovery can correctly provision it. The safest and most convenient way to provision a new instance is through automatic clone provisioning, which will completely overwrite the state of '127.0.0.1:3320' with a physical snapshot from an existing cluster member. To use this method by default, set the 'recoveryMethod' option to 'clone'. The incremental state recovery may be safely used if you are sure all updates ever executed in the cluster were done with GTIDs enabled, there are no purged transactions and the new instance contains the same GTID set as the cluster or a subset of it. To use this method by default, set the 'recoveryMethod' option to 'incremental'. Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone): mysql-js> cluster.addInstance('root@localhost:3330') } -
Выберите метод восстановления из запроса. Доступны следующие варианты:
Клонирование: Клонирует инстанс, который вы добавляете в основной кластер, удаляя все транзакции, которые содержит инстанс. Плагин MySQL Clone устанавливается автоматически. Если вы добавляете пустой инстанс (он не обрабатывал транзакции) или инстанс, содержащий транзакции, которые вы не хотите сохранять, выберите опцию Клонирования.
Инкрементальное восстановление: Восстанавливает все транзакции, обработанные кластером, в присоединяемом инстансе с помощью асинхронной репликации. Инкрементальное восстановление подходит, если вы уверены, что все обновления, когда-либо обработанные кластером, были завершены с включенными глобальными идентификаторами транзакций (
GTID). Нет очищенных транзакций, и новый инстанс содержит тот же наборGTID, что и кластер, или подмножество его.
В этом примере выберите C для Клонирования:
Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone): C Validating instance configuration at localhost:3320... NOTE: Instance detected as a sandbox. Please note that sandbox instances are only suitable for deploying test clusters for use within the same host. This instance reports its own address as 127.0.0.1:3320 Instance configuration is suitable. NOTE: Group Replication will communicate with other members using '127.0.0.1:33201'. Use the localAddress option to override. A new instance will be added to the InnoDB cluster. Depending on the amount of data on the cluster this might take from a few seconds to several hours. Adding instance to the cluster... Monitoring recovery process of the new cluster member. Press ^C to stop monitoring and let it continue in background. Clone based state recovery is now in progress. NOTE: A server restart is expected to happen as part of the clone process. If the server does not support the RESTART command or does not come back after a while, you may need to manually start it back. * Waiting for clone to finish... NOTE: 127.0.0.1:3320 is being cloned from 127.0.0.1:3310 ** Stage DROP DATA: Completed ** Clone Transfer FILE COPY ############################################################ 100% Completed PAGE COPY ############################################################ 100% Completed REDO COPY ############################################################ 100% Completed NOTE: 127.0.0.1:3320 is shutting down... * Waiting for server restart... ready * 127.0.0.1:3320 has restarted, waiting for clone to finish... ** Stage RESTART: Completed * Clone process has finished: 72.61 MB transferred in about 1 second (~72.61 MB/s) State recovery already finished for '127.0.0.1:3320' The instance '127.0.0.1:3320' was successfully added to the cluster. -
Добавьте третий созданный инстанс и снова выберите C для метода восстановления Клонирования:
mysql-js> cluster.addInstance('root@localhost:3330') -
Проверьте состояние кластера, выполнив:
mysql-js> cluster.status()Вывод следующий:
{ "clusterName": "devCluster", "defaultReplicaSet": { "name": "default", "primary": "127.0.0.1:3310", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "127.0.0.1:3310": { "address": "127.0.0.1:3310", "memberRole": "PRIMARY", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" }, "127.0.0.1:3320": { "address": "127.0.0.1:3320", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" }, "127.0.0.1:3330": { "address": "127.0.0.1:3330", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "127.0.0.1:3310" } The setup of the InnoDB Cluster was successful! Кластер теперь может выдерживать до одного отказа. Выйдите из MySQL Shell, выполнив:
\q
Настройка MySQL Router
После настройки кластера MySQL InnoDB протестируйте высокую доступность кластера. Для этого используйте MySQL Router. Если один инстанс откажет, MySQL Router автоматически обновит свою конфигурацию маршрутизации и гарантирует, что новые подключения будут маршрутизироваться на оставшиеся инстансы.
Прежде чем MySQL Router сможет выполнить операции маршрутизации, его необходимо ознакомить с новым кластером InnoDB. Для этого используйте опцию –bootstrap и укажите MySQL Router на текущий инстанс MySQL R/W (основной инстанс) кластера. Сохраните конфигурацию Router в папке под названием mysql-router с помощью опции -d.
-
Откройте терминал в домашнем каталоге:
-
В системе Linux введите:
[demo-user@losthost]$> mysqlrouter --bootstrap root@localhost:3310 -d mysqlrouter -
В системе Windows введите:
C:\Users\demo-user> mysqlrouter --bootstrap root@localhost:3310 -d mysql-routerMySQL Router затем выведет TCP/IP-порты, которые он будет использовать для маршрутизации подключений. Для получения дополнительной информации см. Развертывание MySQL Router.
-
-
После успешной настройки MySQL Router запустите его в фоновом потоке:
-
В системе Windows используйте команду
start /Bи укажите Router на файл конфигурации, сгенерированный с помощью опции–bootstrap:C:\> start /B mysqlrouter -c %HOMEPATH%\mysql-router\mysqlrouter.conf -
Или вызовите скрипт
Windows PowerShellв папкеmysqlrouter, созданной ранее:\mysqlrouter\start.ps1 -
В системе Linux с использованием systemd введите:
sudo systemctl start mysqlrouter.service -
Или в системе Linux вызовите скрипт
Shellв папкеmysqlrouter, созданной ранее:/mysqlrouter/start.sh
-
Настройка маршрутизатора MySQL для тестирования
После запуска кластера InnoDB и маршрутизатора MySQL протестируйте настройку кластера.
Вместо подключения к одному из экземпляров MySQL Server напрямую, подключайтесь через маршрутизатор MySQL.
-
Выполните следующую команду подключения:
> mysqlsh root@localhost:6446
Укажите пароль root для подключения к кластеру InnoDB.
-
Проверьте состояние кластера InnoDB, создав переменную
clusterи присвоив ей значение операцииdba.getCluster():mysql-js> cluster = dba.getCluster()
mysql-js> cluster.status()
-
Переключитесь в SQL режим:
mysql-js> \sql
-
Запросите порт, на котором работает экземпляр, выполнив:
mysql-sql> SELECT @@port; +--------+ | @@port | +--------+ | 3310 | +--------+ 1 row in set (0.0007 sec) -
Вернитесь в режим JavaScript:
mysql-js> \js
-
Используйте функцию
dba.killSandboxInstance()для остановки экземпляра MySQL Server:dba.killSandboxInstance(3310) Killing MySQL instance... Instance localhost:3310 successfully killed.
-
Проверьте, правильно ли маршрутизатор MySQL перенаправляет трафик, выполнив команду
SELECT @@portдля только что остановленного экземпляра и проверьте результат:-
Переключитесь в SQL режим:
mysql-js> \sql -
Проверьте порт MySQL:
mysql-sql> SELECT @@port;
-
Возвращается ошибка;
ERROR: 2013 (HY000): Lost connection to MySQL server during query. Эта ошибка означает, что экземпляр, работающий на порту 3310, больше не работает.-
Проверьте порт снова:
mysql-sql> SELECT @@port; +--------+ | @@port | +--------+ | 3320 | +--------+ Этот вывод показывает, что экземпляр, работавший на порту 3320, был повышен до нового
Read/Writeпервичного экземпляра.-
Возвращайтесь в режим JavaScript и проверьте состояние кластера:
mysql-js> cluster.status() { "clusterName": "devCluster", "defaultReplicaSet": { "name": "default", "primary": "127.0.0.1:3320", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures. 1 member is not active.", "topology": { "127.0.0.1:3310": { "address": "127.0.0.1:3310", "memberRole": "SECONDARY", "mode": "n/a", "readReplicas": {}, "role": "HA", "shellConnectError": "MySQL Error 2003: Could not open connection to '127.0.0.1:3310': Can't connect to MySQL server on '127.0.0.1:3310' (10061)", "status": "(MISSING)" }, "127.0.0.1:3320": { "address": "127.0.0.1:3320", "memberRole": "PRIMARY", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" }, "127.0.0.1:3330": { "address": "127.0.0.1:3330", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "127.0.0.1:3320" } Экземпляр MySQL Server, ранее работавший на порту 3310,
MISSING.-
Перезапустите этот экземпляр, выполнив операцию
dba.startSandboxInstance()с номером порта:mysql-js> dba.startSandboxInstance(3310) -
Проверка состояния кластера показывает, что экземпляр был восстановлен как активный в кластере, но как
SECONDARYчлен:mysql-js > cluster.status() { "clusterName": "devCluster", "defaultReplicaSet": { "name": "default", "primary": "127.0.0.1:3320", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "127.0.0.1:3310": { "address": "127.0.0.1:3310", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" }, "127.0.0.1:3320": { "address": "127.0.0.1:3320", "memberRole": "PRIMARY", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" }, "127.0.0.1:3330": { "address": "127.0.0.1:3330", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.28" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "127.0.0.1:3320" } Все экземпляры снова работают, и кластер снова может выдерживать один сбой.
© 2025 Oracle
Licensed under the GPLv2 License.