WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Для лучшей работы MySQL Router, как правило, устанавливается на том же
самом хосте, где приложение, которое использует его.
Возможные причины включают:
Сокеты Unix могут функционировать с приложениями, соединяющимися с
MySQL Router, но не с MySQL Router, соединяющимся с MySQL Server. Можно управлять многими экземплярами MySQL Router
в сети, и вы не должны изолировать MySQL Router одной машиной.
Это вызвано тем, что у MySQL Router
нет привязки ни к какому конкретному серверу или хосту. Рис. 3.1. Пример развертывания MySQL Router Вот краткий пример, чтобы продемонстрировать, как MySQL Router
может быть развернут, используя самонастройку. Для получения дополнительной
информации посмотрите опцию
Этот пример создает автономный MySQL Router, используя опцию
Произведенный каталог MySQL Router выглядит подобно этому: Произведенный конфигурационный файл MySQL Router
( В этом примере MySQL Router сформировал четыре порта и четыре сокета.
Порты добавляются по умолчанию, сокеты были добавлены передачей
Чтобы продемонстрировать поведение MySQL Router, следующий клиент
соединяется с портом 6446, но связан с экземпляром MySQL на порту 3310. Для дополнительных примеров посмотрите
здесь и Sandbox Deployment of InnoDB Cluster. Проверьте установку MySQL Router, настроив песочницу с кластером InnoDB.
В этом случае роутер действует как промежуточный узел, перенаправляющий связи
клиента со списком серверов. Если один сервер падает, клиенты
перенаправляются к следующему доступному серверу в списке. Начните, создав три сервера MySQL. Можно сделать это
множеством путей, включая:
Для подготовленного подхода см.
Scripting AdminAPI или
https://github.com/mattlord/Docker-InnoDB-Cluster. Следующий пример использует метод AdminAPI, чтобы настроить нашу
песочницу. Это краткий обзор, поэтому посмотрите
Sandbox Deployment of InnoDB Cluster в описании кластера
InnoDB. Следующее предполагает, что у вас есть текущая версия MySQL Shell,
MySQL Server и MySQL Router. Этот пример использует MySQL Shell AdminAPI, чтобы настроить кластер
InnoDB с тремя экземплярами MySQL (один primary и два secondary)
и автономный MySQL Router с произведенным конфигурационным файлом.
Вывод был сокращен, используя "...". Затем настройте MySQL Router, чтобы перенаправить к этим серверам MySQL.
Мы будем использовать самонастройку (используя
MySQL Router теперь настроен, запущен и использует кластер
myCluster, который
мы настраивали ранее. Теперь соединитесь с MySQL Router как вы использовали бы любой другой
MySQL Server, соединяясь с настроенным портом MySQL Router. Следующий пример соединяется с MySQL Router на порте 6446,
порт, который мы указали для соединений read-write: Как продемонстрировано, мы соединились с MySQL Router, используя порт
6446, но мы связаны с нашим сервером MySQL на порте 3310 (PRIMARY).
Затем давайте соединимся с сервером read-only MySQL: Мы соединились с MySQL Router, используя порт 6447, но реально соединены с
сервером MySQL на порту 3320 (один из secondary). Режим read-only по
умолчанию использует циклическую стратегию, где следующая связь
относится к иному secondary: Как продемонстрировано, наша вторая связь только для чтения с портом 6447
подключена к другому MySQL secondary, в этом случае порт 3330 вместо 3320.
Теперь проверьте отказоустойчивость уничтожением экземпляра primary MySQL
(порт 3310), с которым мы соединились ранее. Можно продолжить использовать MySQL Shell, чтобы проверить связь,
но попробуем использовать тот же самый клиент
mysql как раньше: Как показано, несмотря на соединение с теми же самыми портами
(6446 для primary и 6447 для secondary), основные порты изменены.
Наш новый основной primary сервер, изменен с порта 3310 на 3320, в то время
как наш secondary с порта 3320 сменился на порт 3330. Мы продемонстрировали MySQL Router, выполняющий простые перенаправления
по списку primary и secondary экземпляров MySQL. Плагин Connection Routing
выполняет основанное на связи направление, перенаправляя
пакеты к серверу, не просматривая их. Это упрощенный подход, который
обеспечивает высокую пропускную способность. Для дополнительной общей
информации о перенаправлении связи посмотрите
раздел 1.3. Простую основанную на связи установку направления показывают ниже.
Эти и дополнительные опции описаны в
разделе
4.3.2. Здесь мы используем направление связи для циклического алгоритма
подключения mysql к трем серверам MySQL на порте 7001, как определено
round-robin
До MySQL Router 8.0 применялась ныне устаревшая опция
Допустим, все три экземпляра MySQL работают, теперь
запустите MySQL Router: MySQL Router слушает порты 7001 и 7002 и отправляет запросы
соответствующему серверу MySQL. Например: Это сначала соединится с foo.example.org, далее с bar.example.org и
наконец с baz.example.org, четвертый вызов возвращается к foo.example.org.
Вместо этого мы настроили поведение порта 7002 по-другому: Тот сначала соединяется с foo.example.org и дополнительные запросы
продолжат соединяться с foo.example.org, пока не будет сбоя, при котором
теперь используется bar.example.org. Для получения дополнительной информации
об этом поведении посмотрите
Глава 3. Развертывание MySQL Router
Исполнительные рекомендации
3.1. Самонастройка MySQL Router
--bootstrap
.--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
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
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
--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 для каждого маршрута.
shell> mysql -u root -h 127.0.0.1 -P 6446 -p
...
mysql> select @@port;
+--------+
| @@port |
+--------+
| 3310 |
+--------+
1 row in set (0.00 sec)
3.2.
Испытание MySQL Router в песочнице
Настройте песочницу сервера MySQL
mysql-test-run.pl
,
который является частью структуры MySQL Test Suite, см.
The MySQL Test Suite.
Разверните кластер песочницы
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!
Настройте роутер
--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
Тестирование роутера
shell>
mysql -u root -h 127.0.0.1 -P 6446 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3310 |
+--------+
shell>
mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3320 |
+--------+
shell>
mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3330 |
+--------+
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.
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 |
+--------+
3.3.
Основное направление связи
[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
routing_strategy
. Этот пример также формирует
стратегию first-available для двух
серверов, используя порт 7002. Стратегия first-available использует первый
доступный сервер из списка назначения. Количество экземпляров MySQL,
назначенных на каждый маршрут
destinations
ваше дело, поскольку это только пример. Роутер не просматривает пакеты и не
ограничивает связи на основе назначенной стратегии или режима, таким образом,
приложение должно определить, куда послать запросы чтения и записи. В этом
примере это порты 7001 и 7002.mode
вместо опции
routing_strategy
, которая была
добавлена в MySQL Router 8.0.
shell> ./bin/mysqlrouter -config=/etc/mysqlrouter-config.conf
shell> ./bin/mysql --user=root --port 7001 --protocol=TCP
shell> ./bin/mysql --user=root --port 7002 --protocol=TCP
mode
.
Найди своих коллег! |
Вы можете направить письмо администратору этой странички, Алексею Паутову.