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

Балансиране на натоварването на MariaDB MaxScale на Docker:Разгръщане:Част първа

MariaDB MaxScale е усъвършенствано, добавено прокси за база данни за сървъри на бази данни на MariaDB. Той се намира между клиентските приложения и сървърите на базата данни, насочвайки клиентски заявки и отговори на сървъра. MaxScale също наблюдава сървърите, така че бързо ще забележи всякакви промени в състоянието на сървъра или топологията на репликация. Това прави MaxScale естествен избор за контролиране на отказ и подобни функции.

В тази серия от блогове от две части ще дадем пълно ръководство за това как да стартирате MariaDB MaxScale на Docker. Тази част обхваща внедряването като самостоятелен Docker контейнер и MaxScale клъстериране чрез Docker Swarm за висока наличност.

MariaDB MaxScale на Docker

Има редица изображения на MariaDB Docker, налични в Docker Hub. В този блог ще използваме официалното изображение, поддържано и публикувано от MariaDB, наречено "mariadb/maxscale" (таг:последно). Изображението е с размер около 71MB. Към момента на писане изображението е предварително инсталирано с MaxScale 2.3.4 като част от необходимите пакети.

Като цяло са необходими следните стъпки, за да стартирате MaxScale с това изображение в среда на контейнер:

  1. Изпълнена репликация на MariaDB (главен-подчинен или главен-главен)/Galera клъстер или NDB клъстер
  2. Създайте и предоставете потребител на база данни, предназначен за наблюдение на MaxScale
  3. Подгответе конфигурационния файл MaxScale
  4. Картирайте конфигурационния файл в контейнер или заредете в Kubernetes ConfigMap или Docker Swarm Configs
  5. Стартирайте контейнера/pod/service/replicaset

Имайте предвид, че MaxScale е продукт на MariaDB, което означава, че е съобразен с MariaDB сървър. Повечето от функциите все още са съвместими с MySQL, с изключение на някои части, като например GTID обработка, конфигурация на Galera Cluster и вътрешни файлове с данни. Версията, която ще използваме, е 2.3.4, която е издадена под Business Source License (BSL). Той позволява целият код да бъде отворен и използването на ТРИ сървъра е безплатно. Когато употребата преминава над три сървъра на бекенда, компанията, която го използва, трябва да плати за търговски абонамент. След определен период от време (2 години в случая на MaxScale) изданието преминава към GPL и цялото използване е безплатно.

Само за да е ясно, тъй като това е тестова среда, е добре да имаме повече от 2 възела. Както е посочено в страницата с често задавани въпроси на MariaDB BSL:

В:Мога ли да използвам продукти на MariaDB, лицензирани под BSL, в среда за тестване и разработка?
О:Да, в непроизводствена тестова среда и среда за разработка, можете да използвате продукти, лицензирани под BSL, без да се нуждаете от абонамент от MariaDB

В това ръководство вече имаме репликация на MariaDB с три възли, разгърната с помощта на ClusterControl. Следната диаграма илюстрира настройката, която ще внедрим:

Нашата системна архитектура се състои от:

  • mariadb1 - 192.168.0.91 (главен)
  • mariadb2 - 192.168.0.92 (подчинен)
  • mariadb3 - 192.168.0.93 (подчинен)
  • docker1 - 192.168.0.200 (Docker хост за контейнери - maxscale, приложение)

Подготовка на потребителя на MaxScale

Първо, създайте потребител на база данни на MySQL за MaxScale и разрешете всички хостове в мрежата 192.168.0.0/24:

MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';

След това дайте необходимите привилегии. Ако просто искате да наблюдавате задните сървъри с балансиране на натоварването, следните разрешения биха били достатъчни:

MariaDB> GRANT SHOW DATABASES ON *.* TO 'maxscale'@'192.168.0.%';
MariaDB> GRANT SELECT ON `mysql`.* TO 'maxscale'@'192.168.0.%';

Въпреки това, MaxScale може да направи много повече от маршрутизиране на заявки. Той има способността да извършва отказ и превключване, например промотиране на подчинен към нов главен. Това изисква привилегии SUPER и REPLICATION CLIENT. Ако искате да използвате тази функция, вместо това задайте ВСИЧКИ ПРИВИЛЕГИИ на потребителя:

mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';

Това е всичко за потребителската част.

Подготовка на конфигурационен файл на MaxScale

Изображението изисква работещ конфигурационен файл да бъде картографиран в контейнера, преди да бъде стартиран. Минималният конфигурационен файл, предоставен в контейнера, няма да ни помогне да изградим обратния прокси, който искаме. Следователно конфигурационният файл трябва да бъде подготвен предварително.

Следният списък може да ни помогне при събирането на необходимата основна информация, за да изградим нашия конфигурационен файл:

  • Тип клъстер – MaxScale поддържа репликация на MariaDB (главен-подчинен, главен-главен), Galera Cluster, Amazon Aurora, MariaDB ColumnStore и NDB Cluster (известен още като MySQL Cluster).
  • Заден IP адрес и/или име на хост – Достижим IP адрес или име на хост за всички бекенд сървъри.
  • Алгоритъм за маршрутизиране – MaxScale поддържа два типа маршрутизиране на заявки – разделяне на четене и запис и балансиране на натоварването в кръгова система.
  • Порт за слушане от MaxScale – По подразбиране MaxScale използва порт 4006 за кръгови връзки и 4008 за разделени връзки за четене и запис. Можете да използвате UNIX сокет, ако желаете.

В текущата директория създайте текстов файл, наречен maxscale.cnf, за да можем да го преобразуваме в контейнера при стартиране. Поставете следните редове във файла:

########################
## Server list
########################

[mariadb1]
type            = server
address         = 192.168.0.91
port            = 3306
protocol        = MariaDBBackend
serv_weight     = 1

[mariadb2]
type            = server
address         = 192.168.0.92
port            = 3306
protocol        = MariaDBBackend
serv_weight     = 1

[mariadb3]
type            = server
address         = 192.168.0.93
port            = 3306
protocol        = MariaDBBackend
serv_weight     = 1

#########################
## MaxScale configuration
#########################

[maxscale]
threads                 = auto
log_augmentation        = 1
ms_timestamp            = 1
syslog                  = 1

#########################
# Monitor for the servers
#########################

[monitor]
type                    = monitor
module                  = mariadbmon
servers                 = mariadb1,mariadb2,mariadb3
user                    = maxscale
password                = my_s3cret
auto_failover           = true
auto_rejoin             = true
enforce_read_only_slaves = 1

#########################
## Service definitions for read/write splitting and read-only services.
#########################

[rw-service]
type            = service
router          = readwritesplit
servers         = mariadb1,mariadb2,mariadb3
user            = maxscale
password        = my_s3cret
max_slave_connections           = 100%
max_sescmd_history              = 1500
causal_reads                    = true
causal_reads_timeout            = 10
transaction_replay              = true
transaction_replay_max_size     = 1Mi
delayed_retry                   = true
master_reconnection             = true
master_failure_mode             = fail_on_write
max_slave_replication_lag       = 3

[rr-service]
type            = service
router          = readconnroute
servers         = mariadb1,mariadb2,mariadb3
router_options  = slave
user            = maxscale
password        = my_s3cret

##########################
## Listener definitions for the service
## Listeners represent the ports the service will listen on.
##########################

[rw-listener]
type            = listener
service         = rw-service
protocol        = MariaDBClient
port            = 4008

[ro-listener]
type            = listener
service         = rr-service
protocol        = MariaDBClient
port            = 4006

Малко обяснения за всеки раздел:

  • Списък със сървъри – бекенд сървърите. Дефинирайте всеки MariaDB сървър на този клъстер в собствена строфа. Името на строфа ще се използва, когато посочим дефиницията на услугата по-надолу. Типът на компонента трябва да е „сървър“.
  • Конфигурация на MaxScale – Там дефинирайте всички свързани с MaxScale конфигурации.
  • Модул за наблюдение – Как MaxScale трябва да наблюдава задните сървъри. Типът на компонента трябва да бъде "монитор", последван от някой от модулите за наблюдение. За списъка с поддържани монитори вижте Монитори MaxScale 2.3.
  • Услуга – Къде да насочим заявката. Типът на компонента трябва да бъде "service". За списъка с поддържани рутери вижте MaxScale 2.3 Рутери.
  • Слушател – Как MaxScale трябва да слуша входящите връзки. Това може да бъде порт или файл на сокет. Типът на компонента трябва да е "слушател". Обикновено слушателите са обвързани с услугите.

Така че по принцип бихме искали MaxScale да слуша на два порта, 4006 и 4008. Порт 4006 е специално за кръгова връзка, подходящ за натоварвания само за четене за нашата MariaDB репликация, докато порт 4008 е специално за критични работни натоварвания за четене и запис. Също така искаме да използваме MaxScale за извършване на действие към нашата репликация в случай на отказ, превключване или повторно присъединяване към подчинен, така че използваме мониторния модул за наречен "mariadbmon".

Изпълнение на контейнера

Вече сме готови да стартираме нашия самостоятелен контейнер MaxScale. Картирайте конфигурационния файл с -v и не забравяйте да публикувате и двата порта на слушателя 4006 и 4008. По желание можете да активирате MaxScale REST API интерфейс на порт 8989:

$ docker run -d \
--name maxscale \
--restart always \
-p 4006:4006 \
-p 4008:4008 \
-p 8989:8989 \
-v $PWD/maxscale.cnf:/etc/maxscale.cnf \
mariadb/maxscale

Потвърдете с:

$ docker logs -f maxscale
...
2019-06-14 07:15:41.060   notice : (main): Started REST API on [127.0.0.1]:8989
2019-06-14 07:15:41.060   notice : (main): MaxScale started with 8 worker threads, each with a stack size of 8388608 bytes.

Уверете се, че не виждате грешка, когато разглеждате горните регистрационни файлове. Проверете дали процесите на docker-proxy слушат публикуваните портове - 4006, 4008 и 8989:

$ netstat -tulpn | grep docker-proxy
tcp6       0      0 :::8989                 :::*                    LISTEN      4064/docker-proxy
tcp6       0      0 :::4006                 :::*                    LISTEN      4092/docker-proxy
tcp6       0      0 :::4008                 :::*                    LISTEN      4078/docker-proxy

В този момент нашият MaxScale работи и може да обработва заявки.

MaxCtrl

MaxCtrl е административен клиент на командния ред за MaxScale, който използва MaxScale REST API за комуникация. Той е предназначен да бъде софтуерът за замяна на наследения клиент на командния ред MaxAdmin.

За да влезете в конзолата MaxCtrl, изпълнете командата "maxctrl" вътре в контейнера:

$ docker exec -it maxscale maxctrl
 maxctrl: list servers
┌──────────┬──────────────┬──────┬─────────────┬─────────────────┬─────────────┐
│ Server   │ Address      │ Port │ Connections │ State           │ GTID        │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb1 │ 192.168.0.91 │ 3306 │ 0           │ Master, Running │ 0-5001-1012 │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb2 │ 192.168.0.92 │ 3306 │ 0           │ Slave, Running  │ 0-5001-1012 │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb3 │ 192.168.0.93 │ 3306 │ 0           │ Slave, Running  │ 0-5001-1012 │
└──────────┴──────────────┴──────┴─────────────┴─────────────────┴─────────────┘

За да проверите дали всичко е наред, просто изпълнете следните команди:

maxctrl: list servers
maxctrl: list services
maxctrl: list filters
maxctrl: list sessions

За да получите допълнителна информация за всеки компонент, вместо това добавете префикс с команда "покажи", например:

maxctrl: show servers
┌──────────────────┬──────────────────────────────────────────┐
│ Server           │ mariadb3                                 │
├──────────────────┼──────────────────────────────────────────┤
│ Address          │ 192.168.0.93                             │
├──────────────────┼──────────────────────────────────────────┤
│ Port             │ 3306                                     │
├──────────────────┼──────────────────────────────────────────┤
│ State            │ Slave, Running                           │
├──────────────────┼──────────────────────────────────────────┤
│ Last Event       │ new_slave                                │
├──────────────────┼──────────────────────────────────────────┤
│ Triggered At     │ Mon, 17 Jun 2019 08:57:59 GMT            │
├──────────────────┼──────────────────────────────────────────┤
│ Services         │ rw-service                               │
│                  │ rr-service                               │
├──────────────────┼──────────────────────────────────────────┤
│ Monitors         │ monitor                                  │
├──────────────────┼──────────────────────────────────────────┤
│ Master ID        │ 5001                                     │
├──────────────────┼──────────────────────────────────────────┤
│ Node ID          │ 5003                                     │
├──────────────────┼──────────────────────────────────────────┤
│ Slave Server IDs │                                          │
├──────────────────┼──────────────────────────────────────────┤
│ Statistics       │ {                                        │
│                  │     "connections": 0,                    │
│                  │     "total_connections": 0,              │
│                  │     "persistent_connections": 0,         │
│                  │     "active_operations": 0,              │
│                  │     "routed_packets": 0,                 │
│                  │     "adaptive_avg_select_time": "0ns"    │
│                  │ }                                        │
├──────────────────┼──────────────────────────────────────────┤
│ Parameters       │ {                                        │
│                  │     "address": "192.168.0.93",           │
│                  │     "protocol": "MariaDBBackend",        │
│                  │     "port": 3306,                        │
│                  │     "extra_port": 0,                     │
│                  │     "authenticator": null,               │
│                  │     "monitoruser": null,                 │
│                  │     "monitorpw": null,                   │
│                  │     "persistpoolmax": 0,                 │
│                  │     "persistmaxtime": 0,                 │
│                  │     "proxy_protocol": false,             │
│                  │     "ssl": "false",                      │
│                  │     "ssl_cert": null,                    │
│                  │     "ssl_key": null,                     │
│                  │     "ssl_ca_cert": null,                 │
│                  │     "ssl_version": "MAX",                │
│                  │     "ssl_cert_verify_depth": 9,          │
│                  │     "ssl_verify_peer_certificate": true, │
│                  │     "disk_space_threshold": null,        │
│                  │     "type": "server",                    │
│                  │     "serv_weight": "1"                   │
│                  │ }                                        │
└──────────────────┴──────────────────────────────────────────┘

Свързване с базата данни

На потребителя на базата данни на приложението трябва да бъде предоставен хост MaxScale, тъй като от гледна точка на сървъра на MariaDB той може да вижда само хоста MaxScale. Помислете за следния пример без MaxScale на снимката:

  • Име на базата данни:myapp
  • Потребител:myapp_user
  • Хост:192.168.0.133 (сървър на приложения)

За да позволите на потребителя да получи достъп до базата данни в сървъра на MariaDB, трябва да изпълните следния оператор:

MariaDB> CREATE USER 'myapp_user'@'192.168.0.133' IDENTIFIED BY 'mypassword';
MariaDB> GRANT ALL PRIVILEGES ON myapp.* to 'myapp_user'@'192.168.0.133';

С MaxScale на снимката трябва да изпълните следния оператор вместо това (заменете IP адреса на сървъра на приложения с IP адреса на MaxScale, 192.168.0.200):

MariaDB> CREATE USER 'myapp_user'@'192.168.0.200' IDENTIFIED BY 'mypassword';
MariaDB> GRANT ALL PRIVILEGES ON myapp.* to 'myapp_user'@'192.168.0.200';

От приложението има два порта, които можете да използвате за свързване към базата данни:

  • 4006 – Слушател с кръгов режим, подходящ за натоварвания само за четене.
  • 4008 – Разделен слушател за четене и запис, подходящ за натоварвания при запис.

Ако на приложението ви е разрешено да посочи само един MySQL порт (например Wordpress, Joomla и т.н.), вместо това изберете RW порт 4008. Това е най-безопасното свързване на крайна точка, независимо от типа на клъстера. Въпреки това, ако вашето приложение може да обработва връзки към множество MySQL портове, можете да изпратите показанията на round-robin слушателя. Този слушател има по-малко допълнителни разходи и много по-бърз в сравнение с разделения слушател за четене-запис.

За нашата настройка за репликация на MariaDB, свържете се с една от тези крайни точки като комбинация хост/порт на база данни:

  • 192.168.0.200 порт 4008 – MaxScale – само за четене/запис или за запис
  • 192.168.0.200 порт 4006 – MaxScale – балансиран само за четене
  • 192.168.0.91 порт 3306 - MariaDB сървър (главен) - четене/запис
  • 192.168.0.92 порт 3306 – MariaDB сървър (подчинен) – само за четене
  • 192.168.0.93 порт 3306 – MariaDB сървър (подчинен) – само за четене

Забележка за тип мулти-главен клъстер, като Galera Cluster и NDB Cluster, порт 4006 може да се използва като балансирани връзки с много запис. С MaxScale имате много опции, от които да избирате, когато се свързвате с базата данни, като всяка от тях предоставя свой собствен набор от предимства.

Клъстериране на MaxScale с Docker Swarm

С Docker Swarm можем да създадем група от екземпляри на MaxScale чрез услугата Swarm с повече от една реплика заедно с Swarm Configs. Първо импортирайте конфигурационния файл в Swarm:

$ cat maxscale.conf | docker config create maxscale_config -

Потвърдете с:

$ docker config inspect --pretty maxscale_config

След това разрешете на потребителя на базата данни MaxScale да се свързва от всички хостове на Swarm в мрежата:

MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';
MariaDB> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';

Когато стартираме услугата Swarm за MaxScale, можем да създадем множество контейнери (наречени реплики), съпоставящи се със същия конфигурационен файл, както е посочено по-долу:

$ docker service create \
--name maxscale-cluster  \
--replicas=3 \
--publish published=4008,target=4008 \
--publish published=4006,target=4006 \
--config source=maxscale_config,target=/etc/maxscale.cnf \
mariadb/maxscale

Горното ще създаде три контейнера MaxScale, разпределени в Swarm възли. Потвърдете с:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                     PORTS
yj6u2xcdj7lo        maxscale-cluster    replicated          3/3                 mariadb/maxscale:latest   *:4006->4006/tcp, *:4008->4008/tcp

Ако приложенията се изпълняват в мрежата на Swarm, можете просто да използвате името на услугата "maxscale-cluster" като хост на база данни за вашите приложения. Външно можете да се свържете с всеки от хостовете на Docker на публикуваните портове и мрежата на Swarm ще насочи и балансира връзките към правилните контейнери по кръговрат. В този момент нашата архитектура може да бъде илюстрирана по-долу:

Във втората част ще разгледаме разширени случаи на използване на MaxScale в Docker като контрол на услугите, управление на конфигурацията, обработка на заявки, сигурност и съгласуване на клъстери.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задайте набора от символи и сортиране на таблица в MariaDB

  2. Изпълняване на заявки за анализ на големи данни с помощта на SQL и Presto

  3. Балансиране на натоварването на базата данни с ProxySQL &AWS Aurora

  4. Знаете, че искате:Мигрирайте от Oracle към MariaDB

  5. Архивиране на база данни - Сравняване на MariaDB Mariabackup и Percona Xtrabackup