Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL InnoDB Cluster 8.0 - Пълна разходка за внедряване:Част първа

MySQL InnoDB Cluster се състои от 3 компонента:

  • Групова репликация на MySQL (група сървъри на база данни, които се репликират един на друг с толерантност към грешки).
  • MySQL рутер (рутер за заявки към здравите възли на базата данни)
  • MySQL Shell (помощник, клиент, инструмент за конфигуриране)

В първата част на това ръководство ще разположим MySQL InnoDB клъстер. Има редица практически уроци, достъпни онлайн, но това ръководство обхваща всички необходими стъпки/команди за инсталиране и стартиране на клъстера на едно място. Ще разгледаме операциите за наблюдение, управление и мащабиране, както и някои проблеми при работа с MySQL InnoDB Cluster във втората част на тази публикация в блога.

Следната диаграма илюстрира нашата архитектура след внедряване:

Ще внедрим общо 4 възела; MySQL групова репликация с три възела и един възел на MySQL рутер, разположени съвместно в сървъра на приложения. Всички сървъри работят на Ubuntu 18.04 Bionic.

Инсталиране на MySQL

Следните стъпки трябва да се извършат на всички възли на базата данни db1, db2 и db3.

Първо, трябва да направим някакво картографиране на хоста. Това е от решаващо значение, ако искате да използвате име на хост като идентификатор на хост в InnoDB Cluster и това е препоръчителният начин да направите. Картирайте всички хостове като следните вътре в /etc/hosts:

$ vi /etc/hosts
192.168.10.40   router apps
192.168.10.41   db1 db1.local
192.168.10.42   db2 db2.local
192.168.10.43   db3 db3.local
127.0.0.1       localhost localhost.localdomain

Спрете и деактивирайте AppArmor:

$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor

Изтеглете най-новото хранилище за конфигурации на APT от уебсайта на хранилището на MySQL Ubuntu на адрес https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/ . Към момента на писане на това писане последният е с дата 15 октомври 2019 г., който е mysql-apt-config_0.8.14-1_all.deb:

$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb

Инсталирайте пакета и го конфигурирайте за "mysql-8.0":

$ dpkg -i mysql-apt-config_0.8.14-1_all.deb

Инсталирайте GPG ключа:

$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5

Актуализирайте реполиста:

$ apt-get update

Инсталирайте Python и последван от MySQL сървър и MySQL обвивка:

$ apt-get -y install mysql-server mysql-shell

Ще ви бъдат представени следните съветници за конфигуриране:

  1. Задаване на root парола – Посочете силна парола за root потребителя на MySQL.
  2. Задайте метода на удостоверяване – Изберете „Използване на наследен метод за удостоверяване (Запазване на съвместимостта с MySQL 5.x)“

MySQL трябваше да бъде инсталиран на този етап. Потвърдете с:

$ systemctl status mysql

Уверете се, че получавате състояние „активно (работещо)“.

Подготовка на сървъра за InnoDB клъстер

Следните стъпки трябва да се извършат на всички възли на базата данни db1, db2 и db3.

Конфигурирайте MySQL сървъра да поддържа групова репликация. Най-лесният и препоръчан начин да направите това е да използвате новия MySQL Shell:

$ mysqlsh

Удостоверете се като локален root потребител и следвайте съветника за конфигуриране, както е показано в примера по-долу:

MySQL  JS > dba.configureLocalInstance("[email protected]:3306");

След като се удостоверите, трябва да получите редица въпроси като следния:

Отговори на тези въпроси със следните отговори:

  • Избор 2 – Създайте нов администраторски акаунт за InnoDB клъстер с минимални необходими разрешения
  • Име на акаунт:[email protected]%
  • Парола:mys3cret&&
  • Потвърдете паролата:mys3cret&&
  • Искате ли да извършите необходимите промени в конфигурацията?:y
  • Искате ли да рестартирате потребителския модел, след като го конфигурирате?:y

Не забравяйте да повторите горното за всички възли на базата данни. В този момент демонът MySQL трябва да слуша всички IP адреси и груповата репликация е активирана. Сега можем да продължим със създаването на клъстера.

Създаване на клъстер

Сега сме готови да създадем клъстер. На db1 се свържете като администратор на клъстер от MySQL Shell:

MySQL|JS> shell.connect('[email protected]:3306');
Creating a session to '[email protected]:3306'
Please provide the password for '[email protected]:3306': ***********
Save password for '[email protected]:3306'? [Y]es/[N]o/Ne[v]er (default No): Y
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 9
Server version: 8.0.18 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
<ClassicSession:[email protected]:3306>

Трябва да сте свързани като [email protected] (можете да разберете, като погледнете низа на подканата преди '>'). Вече можем да създадем нов клъстер:

MySQL|db1:3306 ssl|JS> cluster = dba.createCluster('my_innodb_cluster');

Проверете състоянието на клъстера:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

В този момент само db1 е част от клъстера. Режимът на топология по подразбиране е Single-Primary, подобно на концепцията за набор от реплики, където само един възел е записващ в даден момент. Останалите възли в клъстера ще бъдат четци.

Обърнете внимание на състоянието на клъстера, което казва OK_NO_TOLERANCE, и допълнително обяснение под ключ statusText. В концепцията за набор от реплика един възел няма да осигури толерантност към грешки. Необходими са минимум 3 възела, за да се автоматизира отказът на основния възел. Ще разгледаме това по-късно.

Сега добавете втория възел, db2 и приемете метода за възстановяване по подразбиране, "Клониране":

MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');

Следната екранна снимка показва напредъка на инициализацията на db2, след като изпълнихме горната команда. Операцията по синхронизиране се извършва автоматично от MySQL:

Проверете състоянието на клъстера и db2:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db2:3306": {
                "address": "db2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

В този момент имаме два възела в клъстера, db1 и db2. Състоянието все още показва OK_NO_TOLERANCE с допълнително обяснение под стойността на statusText. Както беше посочено по-горе, MySQL Group Replication изисква поне 3 възела в клъстер за отказоустойчивост. Ето защо трябва да добавим третия възел, както е показано по-нататък.

Добавете последния възел, db3 и приемете метода за възстановяване по подразбиране, "Клониране", подобен на db2:

MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');

Следващата екранна снимка показва напредъка на инициализацията на db3, след като изпълнихме горната команда. Операцията по синхронизиране се извършва автоматично от MySQL:

Проверете състоянието на клъстера и db3:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK",
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db2:3306": {
                "address": "db2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db3:3306": {
                "address": "db3:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

Сега клъстерът изглежда добре, където състоянието е ОК и клъстерът може да толерира до един възел за отказ наведнъж. Основният възел е db1, където показва "първичен":"db1:3306" и "режим":"R/W", докато други възли са в състояние "R/O". Ако проверите стойностите read_only и super_read_only на RO възли, и двете се показват като true.

Внедряването на MySQL Group Replication вече е завършено и е синхронизирано.

Разгръщане на рутера

На сървъра за приложения, на който ще стартираме нашето приложение, се уверете, че съпоставянето на хоста е правилно:

$ vim /etc/hosts
192.168.10.40   router apps
192.168.10.41   db1 db1.local
192.168.10.42   db2 db2.local
192.168.10.43   db3 db3.local
127.0.0.1       localhost localhost.localdomain

Спрете и деактивирайте AppArmor:

$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor

След това инсталирайте пакета за хранилище MySQL, подобно на това, което направихме при инсталиране на база данни:

$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb
$ dpkg -i mysql-apt-config_0.8.14-1_all.deb

Добавете GPG ключ:

$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5

Актуализирайте репо списъка:

$ apt-get update

Инсталирайте MySQL рутер и клиент:

$ apt-get -y install mysql-router mysql-client

MySQL Router вече е инсталиран под /usr/bin/mysqlrouter. MySQL рутерът предоставя флаг за стартиране за автоматично конфигуриране на работата на рутера с MySQL InnoDB клъстер. Това, което трябва да направим, е да посочим URI на низа към един от възлите на базата данни като администратор на InnoDB клъстер (clusteradmin).

За да опростим конфигурацията, ще стартираме процеса на mysqlrouter като root потребител:

$ mysqlrouter --bootstrap [email protected]:3306 --directory myrouter --user=root

Ето какво трябва да получим, след като посочим паролата за потребител на clusteradmin:

Командата bootstrap ще ни помогне да генерираме конфигурационния файл на рутера в /root/myrouter/mysqlrouter.conf. Сега можем да стартираме демона mysqlrouter със следната команда от текущата директория:

$ myrouter/start.sh

Проверете дали очакваните портове слушат правилно:

$ netstat -tulpn | grep mysql
tcp        0 0 0.0.0.0:6446            0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:6447            0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:64470           0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:64460           0.0.0.0:* LISTEN   14726/mysqlrouter

Сега нашето приложение може да използва порт 6446 за четене/запис и 6447 за MySQL връзки само за четене.

Свързване към клъстера

Нека създадем потребител на база данни на главния възел. На db1, свържете се с MySQL сървъра чрез MySQL shell:

$ mysqlsh [email protected]:3306

Превключете от режим на Javascript към режим на SQL:

MySQL|localhost:3306 ssl|JS> \sql

Switching to SQL mode... Commands end with ;

Създайте база данни:

MySQL|localhost:3306 ssl|SQL> CREATE DATABASE sbtest;

Създайте потребител на база данни:

MySQL|localhost:3306 ssl|SQL> CREATE USER [email protected]'%' IDENTIFIED BY 'password';

Предоставете на потребителя базата данни:

MySQL|localhost:3306 ssl|SQL> GRANT ALL PRIVILEGES ON sbtest.* TO [email protected]'%';

Сега нашата база данни и потребител са готови. Нека инсталираме sysbench, за да генерираме тестови данни. На сървъра на приложения направете:

$ apt -y install sysbench mysql-client

Сега можем да тестваме на сървъра на приложения за свързване към MySQL сървъра чрез MySQL рутер. За връзка за запис, свържете се с порт 6446 на хоста на рутера:

$ mysql -usbtest -p -h192.168.10.40 -P6446 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user()        | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db1        | 0           | 0                 |
+---------------+------------+-------------+-------------------+

За връзка само за четене, свържете се с порт 6447 на хоста на рутера:

$ mysql -usbtest -p -h192.168.10.40 -P6447 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user()        | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db3        | 1           | 1                 |
+---------------+------------+-------------+-------------------+

Изглежда добре. Вече можем да генерираме някои тестови данни със sysbench. На сървъра на приложения генерирайте 20 таблици със 100 000 реда на таблица, като се свържете към порт 6446 на сървъра на приложения:

$ sysbench \
/usr/share/sysbench/oltp_common.lua \
--db-driver=mysql \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--mysql-port=6446 \
--mysql-host=192.168.10.40 \
--tables=20 \
--table-size=100000 \
prepare

За да извършите прост тест за четене-запис на порт 6446 за 300 секунди, изпълнете:

$ sysbench \
/usr/share/sysbench/oltp_read_write.lua \
--report-interval=2 \
--threads=8 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6446 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run

За работни натоварвания само за четене можем да изпратим MySQL връзката към порт 6447:

$ sysbench \
/usr/share/sysbench/oltp_read_only.lua \
--report-interval=2 \
--threads=1 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6447 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run

Заключение

Това е. Нашата настройка на MySQL InnoDB Cluster вече е завършена с всичките му компоненти, работещи и тествани. Във втората част ще разгледаме операциите по управление, наблюдение и мащабиране на клъстера, както и решенията на редица често срещани проблеми при работа с MySQL InnoDB Cluster. Останете на линия!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Максимално време за изпълнение в phpMyadmin

  2. Автоматизиране на внедряване на база данни на MySQL

  3. Как работи функцията MID() в MySQL

  4. Мигрирайте от традиционна репликация към GTID

  5. Как да намеря местоположението на MySQL my.cnf