Создание кластера MySQL 5.7

MySQL
  • Установить MySQL

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

Установите MySQL, используя Zip-архив

Уведомление

Для работы MySQL Community 5.7 Server на платформе Windows требуется распространяемый пакет Microsoft Visual C++ 2013. Перед установкой проверьте, поддерживает ли его системная среда.

  1. скачатьВерсия для сообщества MySQL 5.7

  2. Выберите место установки

    Уведомление

    Выберите место установки и убедитесь, что в пути установки нет пробелов. Местоположение этой установки выбрано в C:\MySQL.

  3. Создать файл конфигурацииmy.ini, и воляmy.iniХранится в каталоге установки MySQL

    [mysqld]
    # 设置MySQL安装路径
    basedir=C:/MySQL
    # 设置MySQL数据保存目录
    datadir=C:/MySQL/data
    
  4. Вручную инициализируйте каталог данных с помощью mysqld

    • Описание параметров инициализации

      • --initializeИнициализация с этой опцией будет генерировать случайный пароль, рекомендуется комбинировать--consoleвозможность использовать
      • --initialize-insecureИнициализация с этой опцией не будет генерировать никаких паролей.
      • --defaults-fileУказывает файл конфигурации, читаемый при инициализации каталога данных mysql.Эта опция должна быть вmysqldпосле командыпервый
    • Инициализировать каталог данных

      Уведомление

      --initializeИнициализация опции генерирует случайный пароль в последней строке

      mysqld --defaults-file=C:/MySQL/my.ini ----initialize --console
      
  5. Запустите сервер MySQL

    mysqld --console
    
  6. Подключиться к серверу MySQL

    • использовать--initializeВозможность инициализировать каталог данных, используйте случайный пароль для входа на сервер

      mysql -u root -p
      
    • использовать--initialize-insecureвозможность инициализировать каталог данных, используйте--skip-passwordВозможность подключения к серверу

      mysql -u root --skip-password
      
  7. После подключения смените пароль root

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'
    

    Уведомление

    Обычно подключение к серверу с использованием 127.0.0.1 разрешается для учетной записи localhost. Соединение с сервером MySQL может быть обеспечено

    CREATE USER 'username'@'hostname' IDENTIFIED BY 'new_password'
    

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

  1. Введение в кластер InnoDB

    Кластер MySQL InnoDB предоставляет набор решений высокой доступности для MySQL.MySQL ShellВключенный AdminAPI позволяет легко настраивать и управлять кластером, состоящим как минимум из 3 экземпляров сервера MySQL. Каждый экземпляр сервера MySQL запускает модуль MySQL Group Replication, который обеспечивает механизм репликации данных кластера InnoDB со встроенными возможностями аварийного переключения.

    Уведомление

    InnoDB Cluster не поддерживает MySQL NDB Cluster. Кластер NDB опирается наNDBМеханизм хранения, а также многие программы NDB Cluster не поставлялись с MySQL Server 5.7. Кроме того, mysqld, поставляемый с MySQL Server 5.7, нельзя использовать с кластером NDB.

    На следующей диаграмме показано, как MySQL InnoDB Cluster использует эти технологии для совместной работы.

Использование AdminAPI

MySQL Shell предоставляет функцию AdminAPI, предоставляемую AdminAPI.dbaГлобальные переменные и методы позволяют развертывать, настраивать и управлять кластерами InnoDB. Например, используйте метод dba.createCluster() для создания кластера InnoDB.

Уведомление

MySQL Shell позволяет вам подключаться к серверу через сокеты, но AdminAPI требует TCP-подключения к экземпляру сервера. Не используйте подключения на основе сокетов в AdminAPI.

MySQL Shell предоставляет интерактивную справку по AdminAPI. Чтобы получить список всех доступных команд dba, используйте метод dba.help(). Для получения справки по конкретному методу используйте формат object.help('имя метода').

  1. Создайте кластер InnoDB

    • Sandbox deployment: Если вы тестируете InnoDB Cluster перед производственным развертыванием, функция «Песочница» позволяет вам быстро создать кластер на вашем локальном компьютере.
    • Production deployment: Если вы хотите использовать InnoDB Cluster в производственной среде, вам необходимо настроить все экземпляры MySQL Server, а затем развернуть сервер на машине.

    Уведомление

    Развертывание в песочнице не подходит для развертывания в полной производственной среде.

  2. Требования к среде кластера InnoDB Cluster

    • InnoDB Cluster использует модуль групповой репликации, и вы должны гарантировать, что ваши серверы должны соответствовать тем же требованиям. AdminAPI предоставляетdba.checkInstanceConfiguration()Убедитесь, что экземпляр соответствует требованиям групповой репликации,dba.configureLocalInstance()Настройте экземпляры в соответствии с требованиями групповой репликации.

      Уведомление

      При развертывании в песочнице экземпляры настраиваются на автоматическое выполнение этих условий.

      Основные требования к групповой репликации
      • InnoDB Storage Engine, данные должны использовать транзакционный механизм хранения InnoDB.
      • Первичные ключи, чтобы гарантировать, что каждая таблица, использующая групповую репликацию, должна иметь определенный первичный ключ или его эквивалент.
      • Сеть IPv4, модуль групповой репликации MySQL поддерживает только сеть IPv4.
      • Производительность сети, групповая репликация требует, чтобы экземпляры серверов находились в непосредственной близости друг от друга в кластерной среде, поскольку на функциональность групповой репликации сильно влияют сетевые задержки и пропускная способность.
      конфигурация сервера
      • Двоичный журнал активен, активировать двоичный журнал,--log-bin[=log_file_name].
      • Ведомые обновления зарегистрированы, серверу необходимо обновить двоичный журнал через приложение групповой репликации,--log-slave-updates.
      • Двоичный формат строки журнала, формат групповой репликации основан на строке для последовательного распространения изменений между серверами в группе,--binlog-format=row
      • Глобальные идентификаторы транзакций включены, групповая репликация использует глобальные идентификаторы транзакций для точного отслеживания совершенных транзакций на каждом экземпляре сервера, что позволяет делать выводы о том, что эти серверы выполняют транзакции, которые могут конфликтовать с транзакциями, совершенными в другом месте.--gtid-mode=on.
      • Хранилища информации о репликации, настройки--master-info-repository=TABLEа также--relay-log-info-repository=TABLE. Групповая репликация требует записи информации о главном узле и информации о подчиненном узле в системные таблицы.mysql.slave_master_infoа такжеmysql.slave_relay_log_infoсистемная таблица. Такой подход гарантирует, что подключаемый модуль групповой репликации имеет согласованные возможности репликации и управления транзакциями для репликации метаданных.
      • Извлечение набора операций записи, набор--transaction-write-set-extraction=XXHASH64Для сбора строк и записи в двоичный журнал сервер также собирает записи. Наборы записей основаны на первичном ключе каждой строки и представляют собой упрощенное и компактное представление разметки, которая однозначно идентифицирует измененные строки. Затем этот тег используется для обнаружения коллизий.
      • Многопоточные приложения, участники групповой репликации могут быть настроены как многопоточные приложения, что позволяет применять транзакции параллельно. настраивать--slave-parallel-workers=N(N определяет количество потоков параллельного приложения),--slave-preserve-commit-order=1а также--slave-parallel-type=LOGICAL_CLOCK. Групповая репликация опирается на механизм согласованности вокруг принятия и применения совершенных транзакций в одном и том же порядке всеми участвующими членами, поэтому он должен быть установлен--slave-preserve-commit-order=1Убедитесь, что окончательная фиксация параллельной транзакции находится в том же порядке, что и исходная транзакция. Наконец, чтобы определить, какие транзакции могут выполняться параллельно, подчиненный сервер должен содержать родительскую информацию о генерирующей транзакции.
    • Shell MySQL используется для настройки кластера InnoDB, а скрипт конфигурации требует доступа к версии Python 2.7.

  3. способ установки

    То, как пользователи устанавливают InnoDB Cluster, зависит от используемого метода развертывания. Для развертывания в песочнице установите компоненты кластера на один компьютер. Развертывание в песочнице — это локальное развертывание одного компьютера, поэтому установку необходимо выполнить только один раз на локальном компьютере. Для производственных развертываний установите компоненты на каждый компьютер.

  4. Sandbox deployment

    Вы можете создавать кластеры InnoDB и управлять ими с помощью оболочки MySQL, которая включает AminAPI. Перед производственным развертыванием вы можете использовать развертывание в песочнице. InnoDB Cluster — лучший способ изучить кластер. MySQL Shell имеет встроенное развертывание Sandbox, которое можно использовать для создания правильно настроенного кластера InnoDB Cluster.

    Уведомление

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

    Развернуть экземпляр песочницы

    Глобальная переменная dba в AdminAPI, предоставляемом MySQL Shell, обеспечивает функцию развертывания Sandbox, которую вы можете использоватьdba.deploySandboxInstance()Создайте и разверните экземпляр Sandbox.

    Запустите оболочку MySQL

    > mysqlsh
    

    Помимо включения режима SQL, MySQL Shell также предоставляет два режима языка сценариев: Javascript и Python. В этом примере кластер Sandbox InnoDB создается в основном в режиме Javascript. В MySQL Shell это можно сделать через\js,\pyа также\sqlКоманда для переключения режимов, по умолчанию в режиме Javascript.

    msyql-js> dba.deploySandboxInstance(3310)
    

    Уведомление

    В режимах Javascript и Python нет необходимости завершать команду точкой с запятой.

    Параметр, переданный в deploySandboxInstance(), — это номер порта MySQL, и экземпляр MySQL будет прослушивать соединения с порта 3310. После выполнения команды вам будет предложено ввести пароль root экземпляра.

    Уведомление

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

    Чтобы развернуть дополнительные экземпляры Sandbox, повторите приведенную выше команду:

    msyql-js> dba.deploySandboxInstance(3320)
    msyql-js> dba.deploySandboxInstance(3330)
    
    Создать кластер InnoDB для песочницы

    Следующим шагом является подключение к главному серверу MySQL Server (Сервер — это экземпляр, который содержит данные для репликации другими экземплярами.) для создания кластера InnoDB. В этом примере экземпляр Sandbox пуст, поэтому вы можете выбрать любой экземпляр.

    Используйте MySQL Shell для подключения к главному экземпляру, в данном случае к экземпляру на порту 3310:

    mysql-js> \connect root@localhost:3310
    

    \connectэто оболочка MySQLshell.connect()Ярлыки для методов:

    mysql-js> shell.connect('root@localhost:3310')
    

    После подключения AdminAPI может записывать в файл конфигурации этого экземпляра. Это отличается от использования производственного развертывания, когда вам необходимо подключиться к удаленному экземпляру и запустить приложение MySQL Shell локально на экземпляре, прежде чем AdminAPI сможет записать файл конфигурации экземпляра.

    использоватьdba.createCluster()метод для создания кластера InnoDB с подключенным в данный момент экземпляром в качестве мастера:

    mysql-js> var cluster = dba.createCluster('testCluster')
    

    createCluster()Настройте метаданные InnoDB Cluster для выбранного экземпляра с текущим подключенным экземпляром в качестве основного экземпляра.createCluster()Метод возвращает созданный кластер, который в приведенном выше примере присваивается переменной cluster.createCluster()Аргумент состоит в том, чтобы дать кластеру InnoDB имя.

    Добавить экземпляр в кластер InnoDB

    Транзакции, выполняемые ведущим экземпляром, выполняются повторно при добавлении подчиненного экземпляра.

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

    Добавьте второй экземпляр InnoDB Cluster:

    mysql-js> cluster.addInstance('root@localhost:3320')
    

    Запросить пароль пользователя root.

    Добавить третий экземпляр

    mysql-js> cluster.addInstance('root@localhost:3330')
    

    намекать

    Если экземпляр является экземпляром Sandbox, можно указать только экземпляр localhost.

    Конфигурация кластера хранения

    Чтобы добавить экземпляр Sandbox в кластер, конфигурация, необходимая для кластера InnoDB, должна быть сохранена в файле конфигурации каждого экземпляра.

    использоватьdba.configureLocalInstance('instance')Конфигурация экземпляра может быть сохранена в файле конфигурации каждого экземпляра.

    mysql-js> \connect instance
    mysql-js> dba.configureLocalInstance('instance')
    

    Уведомление

    Если dba.configureLocalInstance() не выполняется успешно, экземпляр не сможет присоединиться к кластеру после следующего перезапуска.

    Повторите вышеуказанные операции, чтобы убедиться, что конфигурация каждого экземпляра Sandbox сохранена.Для этого примера вам нужно настроить хранилище на портах 3310, 3320 и 3330.

    mysql-js> \connect root@localhost:port_number)
    mysql-js> dba.configureLocalInstance('root@localhost:port_number)
    

    Чтобы проверить, был ли создан кластер, используйте функцию status() экземпляра кластера.

    После развертывания кластера вы можете настроить MySQL Router для обеспечения высокой доступности.

  5. Развертывание производства

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

    На следующей диаграмме показан сценарий, который вы используете в этом разделе:

    Уведомление

    В отличие от развертывания в песочнице, для производственного развертывания необходимо подключиться к каждой машине и использовать AdminAPI, предоставляемый MySQL Shell.dba.configureLocalInstance()Сохраните конфигурацию для каждого экземпляра. Вы также можете контролировать доступ к кластеру через MySQL Shell.

    Права пользователя

    Учетная запись пользователя экземпляра управления пользователями не обязательно должна быть учетной записью root, но ей необходимо назначить полное разрешение на чтение администратора MySQL и записать ее в таблицу метаданных кластера (SUPER, GRANT OPTION, CREATE, DROP, так далее.). Предоставьте your_user необходимые разрешения для управления кластером InnoDB:

    GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO your_user@'%' WITH GRANT OPTION;
    GRANT RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, \
    CREATE USER ON *.* TO your_user@'%' WITH GRANT OPTION;
    GRANT SELECT ON *.* TO your_user@'%' WITH GRANT OPTION;
    

    Если требуются только операции чтения, можно использовать учетную запись с более ограниченными привилегиями. Дайте разрешение your_user на мониторинг кластера InnoDB:

    GRANT SELECT ON mysql_innodb_cluster_metadata.* TO your_user@'%';
    GRANT SELECT ON performance_schema.global_status TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_applier_configuration TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_applier_status TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_applier_status_by_coordinator TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_applier_status_by_worker TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_connection_configuration TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_connection_status TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_group_member_stats TO your_user@'%';
    GRANT SELECT ON performance_schema.replication_group_members TO your_user@'%';
    GRANT SELECT ON performance_schema.threads TO your_user@'%' WITH GRANT OPTION;
    
    Настроить имя хоста

    Производственные экземпляры, составляющие кластер, работают на разных машинах, поэтому каждая машина должна иметь уникальное имя хоста и иметь возможность разрешать имена хостов других машин в кластере, на котором запущены экземпляры сервера. Если это не так, вы можете

    • Настройте каждый компьютер для сопоставления IP-адреса каждого другого компьютера с именем хоста.
    • Настройка DNS-сервисов
    • Будуreport_hostКаждый экземпляр настроен как доступный извне адрес

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

    SELECT coalesce(@@report_host, @@hostname);
    
    подробный журнал

    При использовании производственного развертывания настройка подробного ведения журнала для MySQL Shell может помочь вам найти и решить любые проблемы, возникающие при подготовке экземпляра сервера к тому, чтобы он стал частью кластера InnoDB. использовать--log-levelНастройки опции:

    ps> mysqlsh --log-level=DEBUG3
    

    Помимо включения ведения журнала MySQL Shell, вы можете просматривать выходные данные после каждого вызова API:

    mysql-js> dba.verbose=2
    

    Это наиболее полный вывод вызова AdminAPI. Доступные варианты вывода:

    • 0 или OFF рекомендуется, когда не проводится поиск и устранение неисправностей, это значение такжеПо умолчанию.
    • 1 или ON будет выводить подробный контент каждый раз, когда он вызывается
    • 2 будет отлаживать данные с полным содержимым.
    Проверить конфигурацию экземпляра

    Перед развертыванием рабочего сервера вы можете использоватьdba.checkInstanceConfiguration()Функция проверяет, соответствует ли MySQL на каждом экземпляре конфигурации кластера InnoDB.Эта операция не проверяет никаких данных на экземпляре.Демонстрируются следующие данные:

    mysql-js> dba.checkInstanceConfiguration('ic@ic-1:3306')
    
    Please provide the password for 'ic@ic-1:3306':
    Validating instance...
    
    The instance 'ic-1:3306' is not valid for Cluster usage.
    
    The following issues were encountered:
    
    - Some configuration options need to be fixed.
    
    +----------------------------------+---------------+----------------+--------------------------------------------------+
    | Variable                         | Current Value | Required Value | Note                                             |
    +----------------------------------+---------------+----------------+--------------------------------------------------+
    | binlog_checksum                  | CRC32         | NONE           | Update the server variable or restart the server |
    | enforce_gtid_consistency         | OFF           | ON             | Restart the server                               |
    | gtid_mode                        | OFF           | ON             | Restart the server                               |
    | log_bin                          | 0             | 1              | Restart the server                               |
    | log_slave_updates                | 0             | ON             | Restart the server                               |
    | master_info_repository           | FILE          | TABLE          | Restart the server                               |
    | relay_log_info_repository        | FILE          | TABLE          | Restart the server                               |
    | transaction_write_set_extraction | OFF           | XXHASH64       | Restart the server                               |
    +----------------------------------+---------------+----------------+--------------------------------------------------+
    
    
    Please fix these issues , restart the server and try again.
    
    {
      "config_errors": [
        {
          "action": "server_update",
          "current": "CRC32",
          "option": "binlog_checksum",
          "required": "NONE"
        },
        {
          "action": "restart",
          "current": "OFF",
          "option": "enforce_gtid_consistency",
          "required": "ON"
        },
        {
          "action": "restart",
          "current": "OFF",
          "option": "gtid_mode",
          "required": "ON"
        },
        {
          "action": "restart",
          "current": "0",
          "option": "log_bin",
          "required": "1"
        },
        {
          "action": "restart",
          "current": "0",
          "option": "log_slave_updates",
          "required": "ON"
        },
        {
          "action": "restart",
          "current": "FILE",
          "option": "master_info_repository",
          "required": "TABLE"
        },
        {
          "action": "restart",
          "current": "FILE",
          "option": "relay_log_info_repository",
          "required": "TABLE"
        },
        {
          "action": "restart",
          "current": "OFF",
          "option": "transaction_write_set_extraction",
          "required": "XXHASH64"
        }
      ],
      "errors": [],
      "restart_required": true,
      "status": "error"
    }
    mysql-js>
    

    Повторите этот процесс для каждого экземпляра в запланированном кластере, чтобы проверить, подходит ли экземпляр для запуска кластера.

    Экземпляр конфигурации

    вы можете в соответствии сdba.checkInstanceConfiguration()Проверьте отчет, чтобы настроить вышеуказанные параметры в файле конфигурации, чтобы убедиться, что служба базы данных соответствует требованиям кластера InnoDB. Вы также можете пройтиdba.configureLocalInstance()Экземпляры автоматически настраиваются в соответствии с требованиями кластера. Пример данных, когда:

    mysql-js> dba.configureLocalInstance('root@localhost:3306')
    
    Please provide the password for 'root@localhost:3306':
    
    Please specify the path to the MySQL configuration file: /etc/mysql/mysql.conf.d/mysqld.cnf
    Validating instance...
    
    The configuration has been updated but it is required to restart the server.
    {
      "config_errors": [
        {
          "action": "restart",
          "current": "OFF",
          "option": "enforce_gtid_consistency",
          "required": "ON"
        },
        {
          "action": "restart",
          "current": "OFF",
          "option": "gtid_mode",
          "required": "ON"
          },
        {
          "action": "restart",
          "current": "0",
          "option": "log_bin",
          "required": "1"
        },
        {
          "action": "restart",
          "current": "0",
          "option": "log_slave_updates",
          "required": "ON"
        },
        {
          "action": "restart",
          "current": "FILE",
          "option": "master_info_repository",
          "required": "TABLE"
        },
        {
          "action": "restart",
          "current": "FILE",
          "option": "relay_log_info_repository",
          "required": "TABLE"
        },
        {
          "action": "restart",
          "current": "OFF",
          "option": "transaction_write_set_extraction",
          "required": "XXHASH64"
        }
      ],
      "errors": [],
      "restart_required": true,
      "status": "error"
    }
    mysql-js>
    
    Создать кластер

    Используйте MySQL Shell для подключения к основному серверу базы данных и создайте кластер на этом сервере.

    shell> mysqlsh --uri username@hostname:port
    mysql-js> var cluster = dba.createCluster('prodCluster')
    
          A new InnoDB cluster will be created on instance 'ic@ic-1:3306'.
    
          Creating InnoDB cluster 'prodCluster' on 'ic@ic-1:3306'...
          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.
    

    Добавьте другие экземпляры в кластер InnoDB:

    mysql-js> cluster.addInstance('username@hostname:port')
    

    Уведомление

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

  6. Развертывание с групповой репликацией

    Если ваш экземпляр сервера уже имеет групповую репликацию и вы хотите использовать ее для создания кластера, добавьтеadoptFromGRпараметры, переданныеdba.createCluster(). Созданный кластер InnoDB будет соответствовать тому, работает ли группа репликации как база данных с одним мастером или как база данных с несколькими мастерами.

    намекать

    Если экземпляр групповой репликации содержит таблицы, созданные механизмом MyISAM, преобразуйте все такие таблицы в механизм хранения InnoDB перед созданием кластера.

    mysql-js> var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});
    
    A new InnoDB cluster will be created on instance 'root@gr-member-2:3306'.
    
    Creating InnoDB cluster 'prodCluster' on 'root@gr-member-2:3306'...
    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.