RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 3. Развертывание MySQL Router

Исполнительные рекомендации

Для лучшей работы MySQL Router, как правило, устанавливается на том же самом хосте, где приложение, которое использует его. Возможные причины включают:

  • Позволить местные сокетные соединения UNIX вместо TCP/IP.

    Сокеты Unix могут функционировать с приложениями, соединяющимися с MySQL Router, но не с MySQL Router, соединяющимся с MySQL Server.

  • Уменьшить сетевое время ожидания.
  • Позволить MySQL Router соединяться с MySQL, не требуя дополнительных учетных записей на хосте роутера для учетных записей MySQL, которые создаются определенно для хостов приложений, например, myapp@198.51.100.45 вместо myapp@%.
  • Типично серверы приложений является самыми легкими в масштабировании.

Можно управлять многими экземплярами MySQL Router в сети, и вы не должны изолировать MySQL Router одной машиной. Это вызвано тем, что у MySQL Router нет привязки ни к какому конкретному серверу или хосту.

Рис. 3.1. Пример развертывания MySQL Router

3.1. Самонастройка MySQL Router

Вот краткий пример, чтобы продемонстрировать, как MySQL Router может быть развернут, используя самонастройку. Для получения дополнительной информации посмотрите опцию --bootstrap.

Этот пример создает автономный MySQL Router, используя опцию --directory, включает сокеты и предполагает, что кластер InnoDB с именем myCluster уже есть:

shell> mysqlrouter --bootstrap root@localhost:3310 --directory \
                      /tmp/myrouter --conf-use-sockets

Please enter MySQL password for root:

Bootstrapping MySQL Router instance at '/tmp/myrouter'...
MySQL Routerhas now been configured for the InnoDB cluster 'myCluster'.

The following connection information can be used to connect to the cluster.

Classic MySQL protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:6446
- Read/Write Connections: /tmp/myrouter/mysql.sock
- Read/Only Connections: localhost:6447
- Read/Only Connections: /tmp/myrouter/mysqlro.sock

X protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:64460
- Read/Write Connections: /tmp/myrouter/mysqlx.sock
- Read/Only Connections: localhost:64470
- Read/Only Connections: /tmp/myrouter/mysqlxro.sock

shell> cd /tmp/myrouter
shell> ./start.sh

Произведенный каталог MySQL Router выглядит подобно этому:

shell> ls -l | awk '{print $9}'
data
log
mysqlro.sock
mysqlrouter.conf
mysqlrouter.key
mysqlrouter.pid
mysql.sock
mysqlxro.sock
mysqlx.sock
run
start.sh
stop.sh

Произведенный конфигурационный файл MySQL Router (mysqlrouter.conf) выглядит подобно этому:

# File automatically generated during MySQL Router bootstrap
[DEFAULT]
logging_folder=/tmp/myrouter/log
runtime_folder=/tmp/myrouter/run
data_folder=/tmp/myrouter/data
keyring_path=/tmp/myrouter/data/keyring
master_key_path=/tmp/myrouter/mysqlrouter.key
connect_timeout=15
read_timeout=30
dynamic_state=/tmp/myrouter/data/state.json

[logger]
level = INFO

[metadata_cache:myCluster]
router_id=5
user=mysql_router5_p79mg6q6ytrw
metadata_cluster=myCluster
ttl=0.5

[routing:myCluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
socket=/tmp/myrouter/mysql.sock
destinations=metadata-cache://myCluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=classic

[routing:myCluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
socket=/tmp/myrouter/mysqlro.sock
destinations=metadata-cache://myCluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=classic

[routing:myCluster_default_x_rw]
bind_address=0.0.0.0
bind_port=64460
socket=/tmp/myrouter/mysqlx.sock
destinations=metadata-cache://myCluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=x

[routing:myCluster_default_x_ro]
bind_address=0.0.0.0
bind_port=64470
socket=/tmp/myrouter/mysqlxro.sock
destinations=metadata-cache://myCluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=x

В этом примере MySQL Router сформировал четыре порта и четыре сокета. Порты добавляются по умолчанию, сокеты были добавлены передачей --conf-use-sockets. Связанные параметры командной строки:

  • --conf-use-sockets: Произвольно позвольте сокеты UNIX для всех четырех типов подключения, как продемонстрировано в примере.
  • --conf-skip-tcp: Произвольно выключить порты TCP, опция применяется с --conf-use-sockets, если вы хотите только сокеты.
  • --conf-base-port: Измените диапазон портов вместо того, чтобы использовать порты по умолчанию. Это устанавливает порт для соединений classic read-write (PRIMARY) и умолчание в 6446.
  • --conf-bind-address: Измените значение bind_address для каждого маршрута.

Чтобы продемонстрировать поведение MySQL Router, следующий клиент соединяется с портом 6446, но связан с экземпляром MySQL на порту 3310.

shell> mysql -u root -h 127.0.0.1 -P 6446 -p
...
mysql> select @@port;
+--------+
| @@port |
+--------+
| 3310   |
+--------+
1 row in set (0.00 sec)

Для дополнительных примеров посмотрите здесь и Sandbox Deployment of InnoDB Cluster.

3.2. Испытание MySQL Router в песочнице

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

Настройте песочницу сервера MySQL

Начните, создав три сервера MySQL. Можно сделать это множеством путей, включая:

  • Используя интерфейс MySQL Shell AdminAPI, который обеспечивает кластер InnoDB. Это рекомендуемый и самый простой подход. Для получения дополнительной информации посмотрите InnoDB Cluster.

    Для подготовленного подхода см. Scripting AdminAPI или https://github.com/mattlord/Docker-InnoDB-Cluster.

  • Устанавливая три экземпляра MySQL Server на трех различных хостах или на том же самом хосте.
  • Применяя скрипт mysql-test-run.pl, который является частью структуры MySQL Test Suite, см. The MySQL Test Suite.
  • Используя утилиту MySQL mysqlcloneserver.

Следующий пример использует метод AdminAPI, чтобы настроить нашу песочницу. Это краткий обзор, поэтому посмотрите Sandbox Deployment of InnoDB Cluster в описании кластера InnoDB. Следующее предполагает, что у вас есть текущая версия MySQL Shell, MySQL Server и MySQL Router.

Разверните кластер песочницы

Этот пример использует MySQL Shell AdminAPI, чтобы настроить кластер InnoDB с тремя экземплярами MySQL (один primary и два secondary) и автономный MySQL Router с произведенным конфигурационным файлом. Вывод был сокращен, используя "...".

shell> mysqlsh

mysql-js> dba.deploySandboxInstance(3310)
...
mysql-js> dba.deploySandboxInstance(3320)
...
mysql-js> dba.deploySandboxInstance(3330)
...
mysql-js> \connect root@localhost:3310
...
mysql-js> cluster = dba.createCluster("myCluster")
...
mysql-js> cluster.addInstance("root@localhost:3320")
...
mysql-js> cluster.addInstance("root@localhost:3330")
...
mysql-js> cluster.status()
{
"clusterName": "myCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "localhost:3310",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"localhost:3310": {
"address": "localhost:3310",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"localhost:3320": {
"address": "localhost:3320",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"localhost:3330": {
"address": "localhost:3330",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
}
},
"groupInformationSourceMember": "mysql://root@localhost:3310"
}
mysql-js> \q
Bye!

Настройте роутер

Затем настройте MySQL Router, чтобы перенаправить к этим серверам MySQL. Мы будем использовать самонастройку (используя --bootstrap) и создадим отдельный MySQL Router с применением опции --directory. Это использует плагин кэша метаданных, чтобы надежно сохранить данные авторизации.

shell> mysqlrouter --bootstrap root@localhost:3310 --directory /tmp/myrouter

Please enter MySQL password for root:

Bootstrapping MySQL Router instance at '/tmp/mysqlrouter'...
MySQL Routerhas now been configured for the InnoDB cluster 'myCluster'.

The following connection information can be used to connect to the cluster.

Classic MySQL protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:6446
- Read/Only Connections: localhost:6447

X protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:64460
- Read/Only Connections: localhost:64470
shell> cd /tmp/myrouter
shell> ./start.sh

MySQL Router теперь настроен, запущен и использует кластер myCluster, который мы настраивали ранее.

Тестирование роутера

Теперь соединитесь с MySQL Router как вы использовали бы любой другой MySQL Server, соединяясь с настроенным портом MySQL Router.

Следующий пример соединяется с MySQL Router на порте 6446, порт, который мы указали для соединений read-write:

shell> mysql -u root -h 127.0.0.1 -P 6446 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3310   |
+--------+

Как продемонстрировано, мы соединились с MySQL Router, используя порт 6446, но мы связаны с нашим сервером MySQL на порте 3310 (PRIMARY). Затем давайте соединимся с сервером read-only MySQL:

shell> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3320   |
+--------+

Мы соединились с MySQL Router, используя порт 6447, но реально соединены с сервером MySQL на порту 3320 (один из secondary). Режим read-only по умолчанию использует циклическую стратегию, где следующая связь относится к иному secondary:

shell> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3330   |
+--------+

Как продемонстрировано, наша вторая связь только для чтения с портом 6447 подключена к другому MySQL secondary, в этом случае порт 3330 вместо 3320.

Теперь проверьте отказоустойчивость уничтожением экземпляра primary MySQL (порт 3310), с которым мы соединились ранее.

shell> mysqlsh --uri root@127.0.0.1:6446
mysql-js> dba.killSandboxInstance(3310)

The MySQL sandbox instance on this host in
/home/philip/mysql-sandboxes/3310 will be killed

Killing MySQL instance...

Instance localhost:3310 successfully killed.

Можно продолжить использовать MySQL Shell, чтобы проверить связь, но попробуем использовать тот же самый клиент mysql как раньше:

shell> mysql -u root -h 127.0.0.1 -P 6446 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3320   |
+--------+

shell> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3330   |
+--------+

Как показано, несмотря на соединение с теми же самыми портами (6446 для primary и 6447 для secondary), основные порты изменены. Наш новый основной primary сервер, изменен с порта 3310 на 3320, в то время как наш secondary с порта 3320 сменился на порт 3330.

Мы продемонстрировали MySQL Router, выполняющий простые перенаправления по списку primary и secondary экземпляров MySQL.

3.3. Основное направление связи

Плагин Connection Routing выполняет основанное на связи направление, перенаправляя пакеты к серверу, не просматривая их. Это упрощенный подход, который обеспечивает высокую пропускную способность. Для дополнительной общей информации о перенаправлении связи посмотрите раздел 1.3.

Простую основанную на связи установку направления показывают ниже. Эти и дополнительные опции описаны в разделе 4.3.2.

[logger]
level = INFO

[routing:secondary]
bind_address = localhost
bind_port = 7001
destinations = foo.example.org:3306,bar.example.org:3306,baz.example.org:3306
routing_strategy = round-robin

[routing:primary]
bind_address = localhost
bind_port = 7002
destinations = foo.example.org:3306,bar.example.org:3306
routing_strategy = first-available

Здесь мы используем направление связи для циклического алгоритма подключения mysql к трем серверам MySQL на порте 7001, как определено round-robin routing_strategy. Этот пример также формирует стратегию first-available для двух серверов, используя порт 7002. Стратегия first-available использует первый доступный сервер из списка назначения. Количество экземпляров MySQL, назначенных на каждый маршрут destinations ваше дело, поскольку это только пример. Роутер не просматривает пакеты и не ограничивает связи на основе назначенной стратегии или режима, таким образом, приложение должно определить, куда послать запросы чтения и записи. В этом примере это порты 7001 и 7002.

До MySQL Router 8.0 применялась ныне устаревшая опция mode вместо опции routing_strategy, которая была добавлена в MySQL Router 8.0.

Допустим, все три экземпляра MySQL работают, теперь запустите MySQL Router:

shell> ./bin/mysqlrouter -config=/etc/mysqlrouter-config.conf

MySQL Router слушает порты 7001 и 7002 и отправляет запросы соответствующему серверу MySQL. Например:

shell> ./bin/mysql --user=root --port 7001 --protocol=TCP

Это сначала соединится с foo.example.org, далее с bar.example.org и наконец с baz.example.org, четвертый вызов возвращается к foo.example.org. Вместо этого мы настроили поведение порта 7002 по-другому:

shell> ./bin/mysql --user=root --port 7002 --protocol=TCP

Тот сначала соединяется с foo.example.org и дополнительные запросы продолжат соединяться с foo.example.org, пока не будет сбоя, при котором теперь используется bar.example.org. Для получения дополнительной информации об этом поведении посмотрите mode.

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru