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

Как да наблюдавате MySQL контейнери с Prometheus - внедряване на самостоятелен и рояк::Част първа

Мониторингът е проблем за контейнерите, тъй като инфраструктурата е динамична. Контейнерите могат да се създават и унищожават рутинно и са ефимерни. И така, как да следите вашите MySQL екземпляри, работещи на Docker?

Както при всеки софтуерен компонент, има много опции, които могат да се използват. Ще разгледаме Prometheus като решение, създадено за разпределена инфраструктура и работи много добре с Docker.

Това е блог от две части. В този блог част 1 ще покрием аспекта на внедряването на нашите MySQL контейнери с Prometheus и неговите компоненти, работещи като самостоятелни Docker контейнери и Docker Swarm услуги. В част 2 ще разгледаме важните показатели за наблюдение от нашите MySQL контейнери, както и интеграцията със системите за пейджинг и уведомяване.

Въведение в Прометей

Prometheus е пълна система за наблюдение и тенденция, която включва вградено и активно изстъргване, съхранение, запитване, изобразяване на графики и предупреждение въз основа на данни от времеви серии. Prometheus събира метрики чрез механизма за изтегляне от конфигурирани цели на дадени интервали, оценява изразите на правилата, показва резултатите и може да задейства сигнали, ако се наблюдава, че някое условие е вярно. Той поддържа всички целеви показатели, които искаме да измерим, ако някой желае да стартира MySQL като Docker контейнери. Тези показатели включват показатели за физически хостове, показатели за контейнера на Docker и показатели за MySQL сървъра.

Разгледайте следната диаграма, която илюстрира архитектурата на Prometheus (взета от официалната документация на Prometheus):

Ще внедрим някои MySQL контейнери (самостоятелни и Docker Swarm) в комплект със сървър Prometheus, MySQL експортер (т.е. агент на Prometheus за излагане на MySQL метрики, които след това могат да бъдат изтъркани от сървъра на Prometheus) и също Alertmanager за обработка на базирани сигнали върху събраните показатели.

За повече подробности вижте документацията на Prometheus. В този пример ще използваме официалните изображения на Docker, предоставени от екипа на Prometheus.

Самостоятелен Docker

Разгръщане на MySQL контейнери

Нека стартираме два самостоятелни MySQL сървъра на Docker, за да опростим нашето ръководство за внедряване. Единият контейнер ще използва най-новата версия на MySQL 8.0, а другият е MySQL 5.7. И двата контейнера са в една и съща Docker мрежа, наречена "db_network":

$ docker network create db_network
$ docker run -d \
--name mysql80 \
--publish 3306 \
--network db_network \
--restart unless-stopped \
--env MYSQL_ROOT_PASSWORD=mypassword \
--volume mysql80-datadir:/var/lib/mysql \
mysql:8 \
--default-authentication-plugin=mysql_native_password

MySQL 8 по подразбиране използва нов плъгин за удостоверяване, наречен caching_sha2_password . За съвместимост с контейнера за експортиране на Prometheus MySQL, нека използваме широко разпространената mysql_native_password плъгин всеки път, когато създадем нов потребител на MySQL на този сървър.

За втория MySQL контейнер, работещ 5.7, изпълняваме следното:

$ docker run -d \
--name mysql57 \
--publish 3306 \
--network db_network \
--restart unless-stopped \
--env MYSQL_ROOT_PASSWORD=mypassword \
--volume mysql57-datadir:/var/lib/mysql \
mysql:5.7

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

[[email protected] mysql]# docker ps | grep mysql
cc3cd3c4022a        mysql:5.7           "docker-entrypoint.s…"   12 minutes ago      Up 12 minutes       0.0.0.0:32770->3306/tcp   mysql57
9b7857c5b6a1        mysql:8             "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       0.0.0.0:32769->3306/tcp   mysql80

В този момент нашата архитектура изглежда така:

Нека започнем да ги наблюдаваме.

Излагане на Docker метрики на Prometheus

Docker има вградена поддръжка като цел на Prometheus, където можем да използваме за наблюдение на статистиката на двигателя на Docker. Можем просто да го активираме, като създадем текстов файл, наречен "daemon.json" в хоста на Docker:

$ vim /etc/docker/daemon.json

И добавете следните редове:

{
  "metrics-addr" : "12.168.55.161:9323",
  "experimental" : true
}

Където 192.168.55.161 е основният IP адрес на хоста на Docker. След това рестартирайте демона на Docker, за да заредите промяната:

$ systemctl restart docker

Тъй като сме дефинирали --restart=unless-stopped в командата за изпълнение на нашите MySQL контейнери, контейнерите ще бъдат стартирани автоматично след стартиране на Docker.

Разгръщане на MySQL Exporter

Преди да продължим по-нататък, mysqld експортерът изисква MySQL потребител да се използва за целите на наблюдение. В нашите MySQL контейнери създайте потребителя за наблюдение:

$ docker exec -it mysql80 mysql -uroot -p
Enter password:
mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporterpassword' WITH MAX_USER_CONNECTIONS 3;
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

Обърнете внимание, че се препоръчва да зададете максимален лимит за връзка за потребителя, за да избегнете претоварване на сървъра с мониторинг на скрейпове при голямо натоварване. Повторете горните изрази във втория контейнер, mysql57:

$ docker exec -it mysql57 mysql -uroot -p
Enter password:
mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporterpassword' WITH MAX_USER_CONNECTIONS 3;
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

Нека стартираме контейнера за експортиране на mysqld, наречен "mysql8-exporter", за да разкрием показателите за нашия MySQL 8.0 екземпляр, както е посочено по-долу:

$ docker run -d \
--name mysql80-exporter \
--publish 9104 \
--network db_network \
--restart always \
--env DATA_SOURCE_NAME="exporter:[email protected](mysql80:3306)/" \
prom/mysqld-exporter:latest \
--collect.info_schema.processlist \
--collect.info_schema.innodb_metrics \
--collect.info_schema.tablestats \
--collect.info_schema.tables \
--collect.info_schema.userstats \
--collect.engine_innodb_status

А също и друг експортен контейнер за нашия MySQL 5.7 екземпляр:

$ docker run -d \
--name mysql57-exporter \
--publish 9104 \
--network db_network \
--restart always \
-e DATA_SOURCE_NAME="exporter:[email protected](mysql57:3306)/" \
prom/mysqld-exporter:latest \
--collect.info_schema.processlist \
--collect.info_schema.innodb_metrics \
--collect.info_schema.tablestats \
--collect.info_schema.tables \
--collect.info_schema.userstats \
--collect.engine_innodb_status

Активирахме куп флагове за колекционери за контейнера, за да разкрием метриките на MySQL. Можете също да активирате --collect.slave_status, --collect.slave_hosts, ако имате MySQL репликация, работеща на контейнери.

Би трябвало да можем да извлечем показателите на MySQL чрез curl директно от хоста на Docker (порт 32771 е публикуваният порт, присвоен автоматично от Docker за контейнер mysql80-exporter):

$ curl 127.0.0.1:32771/metrics
...
mysql_info_schema_threads_seconds{state="waiting for lock"} 0
mysql_info_schema_threads_seconds{state="waiting for table flush"} 0
mysql_info_schema_threads_seconds{state="waiting for tables"} 0
mysql_info_schema_threads_seconds{state="waiting on cond"} 0
mysql_info_schema_threads_seconds{state="writing to net"} 0
...
process_virtual_memory_bytes 1.9390464e+07

В този момент нашата архитектура изглежда така:

Вече сме готови да настроим сървъра на Prometheus.

Разгръщане на Prometheus Server

Първо, създайте конфигурационен файл на Prometheus в ~/prometheus.yml и добавете следните редове:

$ vim ~/prometheus.yml
global:
  scrape_interval:     5s
  scrape_timeout:      3s
  evaluation_interval: 5s

# Our alerting rule files
rule_files:
  - "alert.rules"

# Scrape endpoints
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'mysql'
    static_configs:
      - targets: ['mysql57-exporter:9104','mysql80-exporter:9104']

  - job_name: 'docker'
    static_configs:
      - targets: ['192.168.55.161:9323']

От конфигурационния файл на Prometheus сме дефинирали три задачи - "prometheus", "mysql" и "docker". Първата е задачата за наблюдение на самия сървър на Prometheus. Следващата е задачата да наблюдаваме нашите MySQL контейнери, наречени "mysql". Ние дефинираме крайните точки на нашите MySQL експортери на порт 9104, който разкри съвместимите с Prometheus показатели от MySQL 8.0 и 5.7 екземпляри съответно. „alert.rules“ е файлът с правила, който ще включим по-късно в следващата публикация в блога с цел предупреждение.

След това можем да картографираме конфигурацията с контейнера Prometheus. Също така трябва да създадем обем на Docker за данните на Prometheus за постоянство и също така да изложим публично порт 9090:

$ docker run -d \
--name prometheus-server \
--publish 9090:9090 \
--network db_network \
--restart unless-stopped \
--mount type=volume,src=prometheus-data,target=/prometheus \
--mount type=bind,src="$(pwd)"/prometheus.yml,target=/etc/prometheus/prometheus.yml \
--mount type=bind,src="$(pwd)
prom/prometheus

Сега нашият сървър Prometheus вече работи и може да бъде достъпен директно на порт 9090 на хоста на Docker. Отворете уеб браузър и отидете на http://192.168.55.161:9090/ за достъп до уеб потребителския интерфейс на Prometheus. Проверете състоянието на целта под Състояние -> Цели и се уверете, че всички са зелени:

В този момент нашата контейнерна архитектура изглежда така:

Нашата система за наблюдение на Prometheus за нашите самостоятелни MySQL контейнери вече е внедрена.

Docker Swarm

Разгръщане на клъстер Galera с 3 възела

Да предположим, че искаме да разположим клъстер Galera с три възела в Docker Swarm, ще трябва да създадем 3 различни услуги, като всяка услуга представлява един възел на Galera. Използвайки този подход, можем да запазим статично разрешимо име на хост за нашия контейнер Galera, заедно с контейнери за експортиране на MySQL, които ще придружават всеки от тях. Ще използваме изображението на MariaDB 10.2, поддържано от екипа на Docker, за да стартираме нашия клъстер Galera.

Първо, създайте конфигурационен файл на MySQL, който да се използва от нашата услуга Swarm:

$ vim ~/my.cnf
[mysqld]

default_storage_engine          = InnoDB
binlog_format                   = ROW

innodb_flush_log_at_trx_commit  = 0
innodb_flush_method             = O_DIRECT
innodb_file_per_table           = 1
innodb_autoinc_lock_mode        = 2
innodb_lock_schedule_algorithm  = FCFS # MariaDB >10.1.19 and >10.2.3 only

wsrep_on                        = ON
wsrep_provider                  = /usr/lib/galera/libgalera_smm.so
wsrep_sst_method                = mariabackup

Създайте специална мрежа от база данни в нашия Swarm, наречена "db_swarm":

$ docker network create --driver overlay db_swarm

Импортирайте нашия MySQL конфигурационен файл в Docker config, за да можем да го заредим в нашата услуга Swarm, когато го създадем по-късно:

$ cat ~/my.cnf | docker config create my-cnf -

Създайте първата Bootstrap услуга на Galera с "gcomm://" като адрес на клъстера, наречен "galera0". Това е преходна услуга само за процес на стартиране. Ще изтрием тази услуга, след като стартираме 3 други услуги на Galera:

$ docker service create \
--name galera0 \
--replicas 1 \
--hostname galera0 \
--network db_swarm \
--publish 3306 \
--publish 4444 \
--publish 4567 \
--publish 4568 \
--config src=my-cnf,target=/etc/mysql/mariadb.conf.d/my.cnf \
--env MYSQL_ROOT_PASSWORD=mypassword \
--mount type=volume,src=galera0-datadir,dst=/var/lib/mysql \
mariadb:10.2 \
--wsrep_cluster_address=gcomm:// \
--wsrep_sst_auth="root:mypassword" \
--wsrep_node_address=galera0

В този момент архитектурата на нашата база данни може да бъде илюстрирана, както следва:

След това повторете следната команда 3 пъти, за да създадете 3 различни услуги на Galera. Заменете {name} съответно с galera1, galera2 и galera3:

$ docker service create \
--name {name} \
--replicas 1 \
--hostname {name} \
--network db_swarm \
--publish 3306 \
--publish 4444 \
--publish 4567 \
--publish 4568 \
--config src=my-cnf,target=/etc/mysql/mariadb.conf.d/my.cnf \
--env MYSQL_ROOT_PASSWORD=mypassword \
--mount type=volume,src={name}-datadir,dst=/var/lib/mysql \
mariadb:10.2 \
--wsrep_cluster_address=gcomm://galera0,galera1,galera2,galera3 \
--wsrep_sst_auth="root:mypassword" \
--wsrep_node_address={name}

Проверете нашите текущи услуги на Docker:

$ docker service ls 
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
wpcxye3c4e9d        galera0             replicated          1/1                 mariadb:10.2        *:30022->3306/tcp, *:30023->4444/tcp, *:30024-30025->4567-4568/tcp
jsamvxw9tqpw        galera1             replicated          1/1                 mariadb:10.2        *:30026->3306/tcp, *:30027->4444/tcp, *:30028-30029->4567-4568/tcp
otbwnb3ridg0        galera2             replicated          1/1                 mariadb:10.2        *:30030->3306/tcp, *:30031->4444/tcp, *:30032-30033->4567-4568/tcp
5jp9dpv5twy3        galera3             replicated          1/1                 mariadb:10.2        *:30034->3306/tcp, *:30035->4444/tcp, *:30036-30037->4567-4568/tcp

Нашата архитектура сега изглежда така:

Трябва да премахнем услугата Galera bootstrap Swarm, galera0, за да я спрем да работи, защото ако контейнерът се разсрочва от Docker Swarm, ще бъде стартирана нова реплика с нов нов том. Рискуваме от загуба на данни, защото --wsrep_cluster_address съдържа "galera0" в другите възли на Galera (или Swarm услуги). И така, нека го премахнем:

$ docker service rm galera0

В този момент имаме нашия клъстер Galera с три възела:

Вече сме готови да внедрим нашия MySQL експортер и Prometheus Server.

MySQL Exporter Swarm Service

Влезте в един от възлите на Galera и създайте потребител за експортиране с подходящи привилегии:

$ docker exec -it {galera1} mysql -uroot -p
Enter password:
mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporterpassword' WITH MAX_USER_CONNECTIONS 3;
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

След това създайте услугата за експортиране за всяка от услугите на Galera (заменете {name} съответно с galera1, galera2 и galera3):

$ docker service create \
--name {name}-exporter \
--network db_swarm \
--replicas 1 \
-p 9104 \
-e DATA_SOURCE_NAME="exporter:[email protected]({name}:3306)/" \
prom/mysqld-exporter:latest \
--collect.info_schema.processlist \
--collect.info_schema.innodb_metrics \
--collect.info_schema.tablestats \
--collect.info_schema.tables \
--collect.info_schema.userstats \
--collect.engine_innodb_status

В този момент нашата архитектура изглежда по следния начин с експортиращи услуги на снимката:

Prometheus Server Swarm Service

И накрая, нека разположим нашия сървър Prometheus. Подобно на внедряването на Galera, първо трябва да подготвим конфигурационния файл на Prometheus, преди да го импортираме в Swarm с помощта на Docker config команда:

$ vim ~/prometheus.yml
global:
  scrape_interval:     5s
  scrape_timeout:      3s
  evaluation_interval: 5s

# Our alerting rule files
rule_files:
  - "alert.rules"

# Scrape endpoints
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'galera'
    static_configs:
      - targets: ['galera1-exporter:9104','galera2-exporter:9104', 'galera3-exporter:9104']

От конфигурационния файл на Prometheus сме дефинирали три работни места - "prometheus" и "galera". Първата е задачата за наблюдение на самия сървър на Prometheus. Следващата е задачата да наблюдаваме нашите MySQL контейнери, наречени "galera". Ние дефинираме крайните точки на нашите MySQL експортери на порт 9104, които разкриват съвместимите с Prometheus показатели от трите възела на Galera съответно. „alert.rules“ е файлът с правила, който ще включим по-късно в следващата публикация в блога с цел предупреждение.

Импортирайте конфигурационния файл в конфигурацията на Docker, за да се използва с контейнера Prometheus по-късно:

$ cat ~/prometheus.yml | docker config create prometheus-yml -

Нека стартираме сървърния контейнер Prometheus и публикуваме порт 9090 на всички хостове на Docker за услугата уеб потребителски интерфейс на Prometheus:

$ docker service create \
--name prometheus-server \
--publish 9090:9090 \
--network db_swarm \
--replicas 1 \    
--config src=prometheus-yml,target=/etc/prometheus/prometheus.yml \
--mount type=volume,src=prometheus-data,dst=/prometheus \
prom/prometheus

Проверете с командата Docker service, че имаме 3 услуги на Galera, 3 услуги за експортиране и 1 услуга на Prometheus:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                         PORTS
jsamvxw9tqpw        galera1             replicated          1/1                 mariadb:10.2                  *:30026->3306/tcp, *:30027->4444/tcp, *:30028-30029->4567-4568/tcp
hbh1dtljn535        galera1-exporter    replicated          1/1                 prom/mysqld-exporter:latest   *:30038->9104/tcp
otbwnb3ridg0        galera2             replicated          1/1                 mariadb:10.2                  *:30030->3306/tcp, *:30031->4444/tcp, *:30032-30033->4567-4568/tcp
jq8i77ch5oi3        galera2-exporter    replicated          1/1                 prom/mysqld-exporter:latest   *:30039->9104/tcp
5jp9dpv5twy3        galera3             replicated          1/1                 mariadb:10.2                  *:30034->3306/tcp, *:30035->4444/tcp, *:30036-30037->4567-4568/tcp
10gdkm1ypkav        galera3-exporter    replicated          1/1                 prom/mysqld-exporter:latest   *:30040->9104/tcp
gv9llxrig30e        prometheus-server   replicated          1/1                 prom/prometheus:latest        *:9090->9090/tcp

Сега нашият сървър Prometheus вече работи и може да бъде достъпен директно на порт 9090 от всеки Docker възел. Отворете уеб браузър и отидете на http://192.168.55.161:9090/ за достъп до уеб потребителския интерфейс на Prometheus. Проверете състоянието на целта под Състояние -> Цели и се уверете, че всички са зелени:

В този момент нашата Swarm архитектура изглежда така:

Продължение..

Вече разполагаме с нашата база данни и стека за наблюдение, разположени в Docker. В част 2 от блога ще разгледаме различните показатели на MySQL, за да следим. Ще видим също как да конфигурираме сигналите с Prometheus.


  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. Пълен списък с набори от символи, поддържани от MariaDB

  3. Поправка:„Неизвестна таблица „локали“ в information_schema“ в MariaDB

  4. Как работи LOG10() в MariaDB

  5. Как да получите края на месеца в MariaDB