
Начнем установку, будем использовать 3 сервера для непосредственно mysql и 1 сервер для подключения к нашему кластеру — mysql роутер.
сервера для mysql
1 2 3 |
10.10.10.1 10.10.10.2 10.10.10.3 |
и сервер для роутера
1 |
10.10.10.10 |
OS Centos 7 c выключенный selinux и firewalld. Mysql будем использовать версии 5.7
Подключаем репозиторий
1 |
rpm -i https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm |
выключаем 8 версию и включаем 5.7
1 2 3 4 5 |
yum install yum-utils yum-config-manager --disable mysql80-community yum-config-manager --enable mysql57-community yum repolist yum install mysql-community-server mysql-shell |
Правим /etc/my.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid bind-address=0.0.0.0 port=3301 # Replication part server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW plugin-load = group_replication.so # Group replication part transaction_write_set_extraction=XXHASH64 loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = 10.10.10.1:33011 loose-group_replication_bootstrap_group = OFF report_port = 3301 report_host = 10.10.10.1 |
Mysql вешаем на порт 3301.
На порту 33011 будет происходить обмен данными между серверами кластера.
Файл /etc/my.cnf мы приводим к такому виду на всех трех серверах кластера, меняем IP в переменных loose-group_replication_local_address и report_host, а также изменяем server_id — для каждого сервера уникальный.
Запускаем mysql, проводим первоначальную настройку.
1 2 3 |
systemctl start mysqld grep 'password' /var/log/mysqld.log mysql_secure_installation |
Начнем создание кластера, для начало создадим на всех 3-х серверах пользователя cladmin, для это воспользуемся консоль mysqlsh
1 2 3 4 5 6 7 8 |
[root@10.10.10.1 ~] mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "StrongPassword!#1"}) > \c cladmin@10.10.10.1:3301 > dba.checkInstanceConfiguration() > cl=dba.createCluster('TestCluster', {ipWhitelist: '10.10.10.1,10.10.10.2,10.10.10.3'}) > dba.configureLocalInstance() > cl.status() |
Вывод cl.status() примерно должен быть таким
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
MySQL 10.10.10.1:3301 ssl JS > cluster.status() { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "10.10.10.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "10.10.10.1:3301": { "address": "10.10.10.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "mysql://cladmin@10.10.10.1:3301" } |
Когда вносим изменения в конфигураию кластера, обязательно выполняем команду
1 |
> dba.configureLocalInstance() |
Аналогичные действия выполняем на всех 3-х серверах, не забываем прописать верные IP и ID в /etc/my.cnf (server_id, loose-group_replication_local_address, report_host)
После того как предыдущие шаги выполнены на нодах которые мы подключаем (2-й и 3-й сервер в нашем примере), выполняем
1 2 |
[root@10.10.10.2 ~] mysql -p > set GLOBAL group_replication_allow_local_disjoint_gtids_join=ON; |
1 2 3 4 5 |
[root@10.10.10.2 ~] mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "StrongPassword!#1"}) > \c cladmin@10.10.10.2:3301 > dba.checkInstanceConfiguration() |
После данной процедуры на втором сервере, возвращаемся на первый сервер
1 2 3 4 |
[root@10.10.10.1 ~] mysqlsh --uri cladmin@1.1.1.1:3301 --cluster > cluster.addInstance('cladmin@10.10.10.2:3301', {ipWhitelist: '10.10.10.1,10.10.10.2,10.10.10.3'}) > cluster.status() > dba.configureLocalInstance() |
Также выполняем dba.configureLocalInstance() на втором сервере !!!
Вывод cluster.status() должен стать примерно таким
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
{ "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "10.10.10.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "10.10.10.1:3301": { "address": "10.10.10.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.2:3301": { "address": "10.10.10.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "mysql://cladmin@10.10.10.1:3301" } |
По аналогичной схеме добавим 3-й сервер.
Если в будущем мы планируем расширить кластер до 5 или более серверов, нам надо будет отредактировать whitelist, это можно сделать через mysqlsh перейдя в sql режим или напрямую в /etc/my.cnf (не забыть перезагрузить демоны mysql).
Пример как сделать используя консоль mysqlsh (поочередно на каждой из RW нод):
1 2 3 4 5 |
[root@10.10.10.1 ~] mysqlsh --uri cladmin@10.10.10.1:3301 --cluster > \sql > STOP GROUP_REPLICATION; > SET GLOBAL group_replication_ip_whitelist="10.10.10.1,10.10.10.2,10.10.10.3,10.10.10.4,10.10.10.5"; > START GROUP_REPLICATION; |
После добавления всех 3 серверов cluster.status() будет возвращать следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
[root@10.10.10.1 ~] mysqlsh --uri cladmin@10.10.10.1:3301 --cluster MySQL 10.10.10.1:3301 ssl JS > cluster.status() { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "10.10.10.1:3301", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "10.10.10.1:3301": { "address": "10.10.10.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "10.10.10.2:3301": { "address": "10.10.10.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "10.10.10.3:3301": { "address": "10.10.10.3:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "10.10.10.1:3301" } |
Если кластер развалится до состояния одного сервера, его надо будет запускать с параметром loose-group_replication_bootstrap_group = ON в /etc/my.cnf
После запуска параметр надо будет выключить обратно, в противном случаи этот сервер всегда будет отделяться от кластера и работать самостоятельно.
Настройка Mysql роутера.
Добавим репу и поставим пакет
1 2 |
[root@mysql-router ~] rpm -i https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm [root@mysql-router ~] yum install mysql-router |
Создаем каталог для конфигурационных файлов нашего кластера:
1 |
[root@mysql-router ~] mkdir /etc/mysqlrouter/mysql-router |
Настройку будем делать с помощью bootstrap, при указании IP адреса, необходимо указать адрес текущего RW сервера
1 |
[root@mysql-router ~] mysqlrouter --bootstrap cladmin@10.10.10.1:3301 --directory /etc/mysqlrouter/mysql-router --user=root |
Результат успешной конфигурации, вывод:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Reconfiguring MySQL Router instance at '/etc/mysqlrouter/mysql-router'... Checking for old Router accounts Creating account mysql_router1_yxkccoosbuoc@'%' MySQL Router has now been configured for the InnoDB cluster 'TestCluster'. The following connection information can be used to connect to the cluster after MySQL Router has been started with generated configuration.. Classic MySQL protocol connections to cluster 'TestCluster': - Read/Write Connections: localhost:6446 - Read/Only Connections: localhost:6447 X protocol connections to cluster 'TestCluster': - Read/Write Connections: localhost:64460 - Read/Only Connections: localhost:64470 |
Порт 6446 — для подключений RW
Порт 6447 — для подключений RO
Создадим systemd service файл чтобы запускать mysql роутер с нашими сгенерированными конфигурационными файлами
1 |
[root@mysql-router ~] nano /etc/systemd/system/mysqlrouter-cluster.service |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[Unit] Description=MySQL Router After=syslog.target After=network.target [Service] Type=simple User=root Group=root PIDFile=/etc/mysqlrouter/mysql-router/mysqlrouter.pid ExecStart=/bin/bash -c "/usr/bin/mysqlrouter -c /etc/mysqlrouter/mysql-router/mysqlrouter.conf" Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=true [Install] WantedBy=multi-user.target |
Включим в автозагрузку и запустим наш роутер:
1 2 3 |
systemctl daemon-reload systemctl start mysqlrouter-cluster systemctl status mysqlrouter-cluster |
Проверяем
1 2 3 4 5 6 |
[root@mysql-router ~] netstat -ntupl Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:64460 0.0.0.0:* LISTEN 16645/mysqlrouter tcp 0 0 0.0.0.0:6446 0.0.0.0:* LISTEN 16645/mysqlrouter tcp 0 0 0.0.0.0:6447 0.0.0.0:* LISTEN 16645/mysqlrouter tcp 0 0 0.0.0.0:64470 0.0.0.0:* LISTEN 16645/mysqlrouter |
Ссылки на материалы
http://mysqlserverteam.com/mysql-innodb-cluster-a-hands-on-tutorial/
https://habr.com/ru/post/423587/