Для лучшей работы MySQL Router, как правило, устанавливается на том же самом хосте, где приложение, которое использует его. Возможные причины включают:
Сокеты Unix могут функционировать с приложениями, соединяющимися с MySQL Router, но не с MySQL Router, соединяющимся с MySQL Server.
Можно управлять многими экземплярами MySQL Router в сети, и вы не должны изолировать MySQL Router одной машиной. Это вызвано тем, что у 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.
Проверьте установку MySQL Router, настроив песочницу с кластером InnoDB. В этом случае роутер действует как промежуточный узел, перенаправляющий связи клиента со списком серверов. Если один сервер падает, клиенты перенаправляются к следующему доступному серверу в списке.
Начните, создав три сервера MySQL. Можно сделать это множеством путей, включая:
Для подготовленного подхода см. Scripting AdminAPI или https://github.com/mattlord/Docker-InnoDB-Cluster.
mysql-test-run.pl
,
который является частью структуры MySQL Test Suite, см.
The MySQL Test Suite.Следующий пример использует метод 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.
Плагин 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
.