Spec-Zone.ru › MySQL Shell 9.2

6.8.3 Настройка кластера InnoDB и MySQL Router

В приведенном ниже примере мы выполним следующие задачи, используя развертывание в песочнице с AdminAPI для развертывания кластера InnoDB с MySQL Router.

Развертывание и использование локальных экземпляров MySQL в песочнице позволяет вам протестировать функциональность локально перед развертыванием на производственных серверах. AdminAPI имеет встроенную функциональность для создания экземпляров песочницы, предварительно настроенных для работы с кластером InnoDB, InnoDB ClusterSet и InnoDB ReplicaSet в локально развернутой среде.

Этот пример содержит следующие разделы:

  • Установка

  • Создание кластера InnoDB

  • Инициализация MySQL Router

  • Тестирование конфигурации MySQL Router

Предупреждение

Экземпляры песочницы подходят только для развертывания и запуска на вашем локальном компьютере для целей тестирования.

Установка

Установите следующие компоненты:

  • MySQL Server: Для получения дополнительной информации см. .

  • MySQL Shell: Для получения дополнительной информации см. Установка MySQL Shell.

  • MySQL Router: Для получения дополнительной информации см. Установка MySQL Router.

Создание конфигурации песочницы кластера InnoDB

Чтобы обеспечить толерантность к одному отказу, создайте кластер InnoDB с тремя экземплярами. В этом примере мы будем использовать три экземпляра песочницы, работающие на одном компьютере. В реальной настройке эти три экземпляра будут работать на разных хостах в сети.

  1. Для запуска MySQL Shell введите:

    > mysqlsh
    
  2. Для создания и запуска экземпляров 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, выполните следующие шаги:

  1. Подключитесь к экземпляру MySQL, который вы хотите сделать основным экземпляром в кластере InnoDB, введя:

    mysql-js> shell.connect('root@localhost:3310')
    
  2. Выполните команду 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>
    
  3. Проверьте, что создание прошло успешно, используя функцию 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” }
            
  4. Кластер запущен, но еще не устойчив к отказам. Добавьте другие экземпляры 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')
    }
    
  5. Выберите метод восстановления из выпадающего меню. Доступны следующие варианты:

    • Клонирование: Клонирует экземпляр, который вы добавляете в основной кластер, удаляя любые транзакции, содержащиеся в этом экземпляре. Плагин 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.
    
  6. Добавьте третий созданный экземпляр и снова выберите C для метода восстановления Клонирование:

    mysql-js> cluster.addInstance('root@localhost:3330')
    
  7. Проверьте состояние кластера, введя:

    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!
    
  8. Кластер теперь может выдержать до одного отказа. Выйдите из MySQL Shell, введя:\q

Инициализация MySQL Router

После настройки MySQL InnoDB Cluster протестируйте высокодоступность кластера. Для этой цели используйте MySQL Router. Если один экземпляр отказывает, MySQL Router автоматически обновляет свою конфигурацию маршрутизации и гарантирует, что новые соединения маршрутизируются к оставшимся экземплярам.

Прежде чем MySQL Router сможет выполнить операции маршрутизации, необходимо сообщить ему о новом кластере InnoDB. Для этого используйте параметр –bootstrap и укажите MySQL Router на текущий экземпляр R/W MySQL Server (основной экземпляр) кластера. Сохраните конфигурацию маршрутизатора в папку с именем mysql-router, используя параметр -d.

  1. Откройте терминал в вашем домашнем каталоге:

    • В системе Linux введите:

      [demo-user@losthost]$> mysqlrouter --bootstrap root@localhost:3310 -d mysqlrouter
      
    • В системе Windows введите:

      C:\Users\demo-user> mysqlrouter --bootstrap root@localhost:3310 -d mysql-router
      

      MySQL Router затем выведет TCP/IP-порты, которые он будет использовать для маршрутизации соединений. Для получения дополнительной информации см. Развертывание MySQL Router.

  2. После успешной настройки MySQL Router запустите его в фоновом потоке:

    • В системе Windows используйте команду start /B и укажите маршрутизатору файл конфигурации, который был сгенерирован с помощью параметра –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
END_OF_DOCUMENT_MARKER

Настройка маршрутизатора MySQL для тестирования

После запуска кластера InnoDB и маршрутизатора MySQL протестируйте настройку кластера.

Вместо подключения к одному из экземпляров MySQL Server напрямую, подключайтесь через маршрутизатор MySQL.

  1. Выполните следующую команду подключения:

    > mysqlsh root@localhost:6446
  2. Укажите пароль root для подключения к кластеру InnoDB.

  3. Проверьте состояние кластера InnoDB, создав переменную cluster и присвоив ей значение операции dba.getCluster():

    mysql-js> cluster = dba.getCluster()
    mysql-js> cluster.status()
  4. Переключитесь в SQL режим:

    mysql-js> \sql
  5. Запросите порт, на котором работает экземпляр, выполнив:

    mysql-sql> SELECT @@port;
    
            +--------+
            | @@port |
            +--------+
            |   3310 |
            +--------+
    1 row in set (0.0007 sec)
    
  6. Вернитесь в режим JavaScript:

    mysql-js> \js
  7. Используйте функцию dba.killSandboxInstance() для остановки экземпляра MySQL Server:

                dba.killSandboxInstance(3310)
    
    Killing MySQL instance...
    
    Instance localhost:3310 successfully killed.
    
  8. Проверьте, правильно ли маршрутизатор MySQL перенаправляет трафик, выполнив команду SELECT @@port для только что остановленного экземпляра и проверьте результат:

    • Переключитесь в SQL режим:

      mysql-js> \sql
    • Проверьте порт MySQL:

      mysql-sql> SELECT @@port;
  9. Возвращается ошибка; ERROR: 2013 (HY000): Lost connection to MySQL server during query. Эта ошибка означает, что экземпляр, работающий на порту 3310, больше не работает.

  10. Проверьте порт снова:

    mysql-sql> SELECT @@port;
    +--------+
    | @@port |
    +--------+
    |   3320 |
    +--------+
    
  11. Этот вывод показывает, что экземпляр, работавший на порту 3320, был повышен до нового Read/Write первичного экземпляра.

  12. Возвращайтесь в режим 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"
    }
    
  13. Экземпляр MySQL Server, ранее работавший на порту 3310, MISSING.

  14. Перезапустите этот экземпляр, выполнив операцию dba.startSandboxInstance() с номером порта:

    mysql-js> dba.startSandboxInstance(3310)
  15. Проверка состояния кластера показывает, что экземпляр был восстановлен как активный в кластере, но как 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"
    }
    
  16. Все экземпляры снова работают, и кластер снова может выдерживать один сбой.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-shell-9.2-en/setting-up-innodb-cluster-and-mysql-router.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API