MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Cách giám sát vùng chứa MySQL với Prometheus - Triển khai trên độc lập và bầy đàn::Phần một

Giám sát là một mối quan tâm đối với các thùng chứa, vì cơ sở hạ tầng là động. Các thùng chứa có thể được tạo và phá hủy thường xuyên, và là vật chất phù du. Vậy làm cách nào để theo dõi các phiên bản MySQL của bạn đang chạy trên Docker?

Như với bất kỳ thành phần phần mềm nào, có rất nhiều tùy chọn có thể được sử dụng. Chúng tôi sẽ xem Prometheus như một giải pháp được xây dựng cho cơ sở hạ tầng phân tán và hoạt động rất tốt với Docker.

Đây là một blog gồm hai phần. Trong blog phần 1 này, chúng ta sẽ đề cập đến khía cạnh triển khai của các vùng chứa MySQL của chúng ta với Prometheus và các thành phần của nó, chạy dưới dạng các vùng chứa Docker độc lập và các dịch vụ Docker Swarm. Trong phần 2, chúng ta sẽ xem xét các số liệu quan trọng cần theo dõi từ các vùng chứa MySQL của chúng tôi, cũng như tích hợp với hệ thống phân trang và thông báo.

Giới thiệu về Prometheus

Prometheus là một hệ thống theo dõi và xu hướng đầy đủ bao gồm tích hợp sẵn và hoạt động, lưu trữ, truy vấn, vẽ đồ thị và cảnh báo dựa trên dữ liệu chuỗi thời gian. Prometheus thu thập các chỉ số thông qua cơ chế kéo từ các mục tiêu đã định cấu hình trong các khoảng thời gian nhất định, đánh giá biểu thức quy tắc, hiển thị kết quả và có thể kích hoạt cảnh báo nếu một số điều kiện được quan sát là đúng. Nó hỗ trợ tất cả các chỉ số mục tiêu mà chúng tôi muốn đo lường nếu một người muốn chạy MySQL dưới dạng vùng chứa Docker. Các chỉ số đó bao gồm chỉ số máy chủ vật lý, số liệu vùng chứa Docker và số liệu máy chủ MySQL.

Hãy xem sơ đồ sau minh họa kiến ​​trúc Prometheus (lấy từ tài liệu chính thức của Prometheus):

Chúng tôi sẽ triển khai một số vùng chứa MySQL (độc lập và Docker Swarm) hoàn chỉnh với máy chủ Prometheus, trình xuất MySQL (tức là tác nhân Prometheus để hiển thị các chỉ số MySQL, sau đó có thể được máy chủ Prometheus loại bỏ) và cả Alertmanager để xử lý các cảnh báo dựa trên về các chỉ số đã thu thập.

Để biết thêm chi tiết, hãy xem tài liệu Prometheus. Trong ví dụ này, chúng tôi sẽ sử dụng các hình ảnh Docker chính thức do nhóm Prometheus cung cấp.

Docker độc lập

Triển khai MySQL Containers

Hãy chạy hai máy chủ MySQL độc lập trên Docker để đơn giản hóa hướng dẫn triển khai của chúng tôi. Một vùng chứa sẽ sử dụng MySQL 8.0 mới nhất và vùng còn lại là MySQL 5.7. Cả hai vùng chứa đều nằm trong cùng một mạng Docker có tên "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 mặc định cho một plugin xác thực mới có tên là caching_sha2_password . Để tương thích với vùng chứa Prometheus MySQL xuất khẩu, hãy sử dụng mysql_native_password được sử dụng rộng rãi plugin bất cứ khi nào chúng tôi tạo người dùng MySQL mới trên máy chủ này.

Đối với vùng chứa MySQL thứ hai đang chạy 5.7, chúng tôi thực thi như sau:

$ 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

Xác minh xem máy chủ MySQL của chúng tôi có đang chạy ổn không:

[[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

Tại thời điểm này, kiến ​​trúc của chúng tôi trông giống như sau:

Hãy bắt đầu theo dõi chúng.

Hiển thị các chỉ số Docker cho Prometheus

Docker có hỗ trợ tích hợp dưới dạng mục tiêu Prometheus, nơi chúng tôi có thể sử dụng để theo dõi số liệu thống kê của công cụ Docker. Chúng tôi chỉ cần kích hoạt nó bằng cách tạo một tệp văn bản có tên "daemon.json" bên trong máy chủ lưu trữ Docker:

$ vim /etc/docker/daemon.json

Và thêm các dòng sau:

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

Trong đó 192.168.55.161 là địa chỉ IP chính của máy chủ Docker. Sau đó, khởi động lại daemon Docker để tải thay đổi:

$ systemctl restart docker

Vì chúng tôi đã xác định --restart =Trừ khi-dừng trong lệnh chạy của vùng chứa MySQL của chúng tôi, các vùng chứa sẽ tự động được khởi động sau khi Docker đang chạy.

Triển khai MySQL Exporter

Trước khi chúng tôi tiến xa hơn, trình xuất mysqld yêu cầu người dùng MySQL được sử dụng cho mục đích giám sát. Trên vùng chứa MySQL của chúng tôi, hãy tạo người dùng giám sát:

$ 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'@'%';

Lưu ý rằng nên đặt giới hạn kết nối tối đa cho người dùng để tránh làm quá tải máy chủ với việc giám sát các mẩu tin lưu niệm dưới tải nặng. Lặp lại các câu lệnh trên vào vùng chứa thứ hai, 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'@'%';

Hãy chạy vùng chứa trình xuất mysqld có tên "mysql8-exportorter" để hiển thị các số liệu cho phiên bản MySQL 8.0 của chúng tôi như bên dưới:

$ 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

Và cũng có một vùng chứa trình xuất khác cho phiên bản MySQL 5.7 của chúng tôi:

$ 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

Chúng tôi đã bật một loạt các cờ bộ sưu tập cho vùng chứa để hiển thị các chỉ số MySQL. Bạn cũng có thể bật --collect.slave_status, --collect.slave_hosts nếu bạn có một bản sao MySQL đang chạy trên các vùng chứa.

Chúng tôi sẽ có thể truy xuất các chỉ số MySQL trực tiếp qua curl từ máy chủ Docker (cổng 32771 là cổng đã xuất bản được Docker chỉ định tự động cho container mysql80-exportorter):

$ 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

Tại thời điểm này, kiến ​​trúc của chúng tôi trông giống như sau:

Bây giờ chúng tôi đã sẵn sàng để thiết lập máy chủ Prometheus.

Triển khai máy chủ Prometheus

Đầu tiên, tạo tệp cấu hình Prometheus tại ~ / prometheus.yml và thêm các dòng sau:

$ 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']

Từ tệp cấu hình Prometheus, chúng tôi đã xác định ba công việc - "prometheus", "mysql" và "docker". Đầu tiên là công việc giám sát chính máy chủ Prometheus. Công việc tiếp theo là giám sát các vùng chứa MySQL của chúng tôi có tên "mysql". Chúng tôi xác định các điểm cuối trên các trình xuất MySQL của chúng tôi trên cổng 9104, cổng này hiển thị các số liệu tương thích với Prometheus từ các phiên bản MySQL 8.0 và 5.7 tương ứng. "Alert.rules" là tệp quy tắc mà chúng tôi sẽ đưa vào sau trong bài đăng blog tiếp theo nhằm mục đích cảnh báo.

Sau đó, chúng tôi có thể ánh xạ cấu hình với vùng chứa Prometheus. Chúng tôi cũng cần tạo một khối lượng Docker cho dữ liệu Prometheus để duy trì ổn định và cũng hiển thị cổng 9090 một cách công khai:

$ 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

Bây giờ máy chủ Prometheus của chúng tôi đã chạy và có thể được truy cập trực tiếp trên cổng 9090 của máy chủ Docker. Mở trình duyệt web và truy cập http://192.168.55.161:9090/ để truy cập giao diện người dùng web Prometheus. Xác minh trạng thái mục tiêu trong Trạng thái -> Mục tiêu và đảm bảo rằng chúng đều có màu xanh lục:

Tại thời điểm này, kiến ​​trúc vùng chứa của chúng ta trông giống như sau:

Hệ thống giám sát Prometheus cho các vùng chứa MySQL độc lập của chúng tôi hiện đã được triển khai.

Docker Swarm

Triển khai Cụm Galera 3 nút

Giả sử chúng tôi muốn triển khai Cụm Galera ba nút trong Docker Swarm, chúng tôi sẽ phải tạo 3 dịch vụ khác nhau, mỗi dịch vụ đại diện cho một nút Galera. Sử dụng cách tiếp cận này, chúng ta có thể giữ một tên máy chủ có thể phân giải tĩnh cho vùng chứa Galera của chúng ta, cùng với các vùng chứa MySQL export sẽ đi kèm với mỗi tên miền đó. Chúng tôi sẽ sử dụng hình ảnh MariaDB 10.2 do nhóm Docker duy trì để chạy cụm Galera của chúng tôi.

Trước tiên, hãy tạo tệp cấu hình MySQL để sử dụng bởi dịch vụ Swarm của chúng tôi:

$ 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

Tạo một mạng cơ sở dữ liệu chuyên dụng trong Swarm của chúng tôi có tên "db_swarm":

$ docker network create --driver overlay db_swarm

Nhập tệp cấu hình MySQL của chúng tôi vào cấu hình Docker để chúng tôi có thể tải nó vào dịch vụ Swarm khi chúng tôi tạo sau này:

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

Tạo dịch vụ khởi động Galera đầu tiên, với "gcomm://" làm địa chỉ cụm được gọi là "galera0". Đây là một dịch vụ tạm thời chỉ dành cho quá trình khởi động. Chúng tôi sẽ xóa dịch vụ này sau khi chúng tôi có 3 dịch vụ Galera khác đang chạy:

$ 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

Tại thời điểm này, kiến ​​trúc cơ sở dữ liệu của chúng tôi có thể được minh họa như sau:

Sau đó, lặp lại lệnh sau 3 lần để tạo 3 dịch vụ Galera khác nhau. Thay thế {name} bằng galera1, galera2 và galera3 tương ứng:

$ 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}

Xác minh các dịch vụ Docker hiện tại của chúng tôi:

$ 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

Kiến trúc của chúng tôi bây giờ trông giống như sau:

Chúng tôi cần xóa dịch vụ Galera bootstrap Swarm, galera0, để ngăn nó chạy bởi vì nếu vùng chứa đang được lên lịch lại bởi Docker Swarm, một bản sao mới sẽ được bắt đầu với một tập mới mới. Chúng tôi có nguy cơ mất dữ liệu vì --wsrep_cluster_address chứa "galera0" trong các nút Galera khác (hoặc dịch vụ Swarm). Vì vậy, hãy xóa nó:

$ docker service rm galera0

Tại thời điểm này, chúng ta có Cụm Galera ba nút:

Hiện chúng tôi đã sẵn sàng triển khai trình xuất MySQL và Máy chủ Prometheus của mình.

Dịch vụ Swarm của trình xuất MySQL

Đăng nhập vào một trong các nút Galera và tạo người dùng xuất khẩu với các đặc quyền thích hợp:

$ 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'@'%';

Sau đó, tạo dịch vụ xuất khẩu cho từng dịch vụ Galera (thay thế {name} bằng galera1, galera2 và galera3 tương ứng):

$ 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

Tại thời điểm này, kiến ​​trúc của chúng tôi trông giống như thế này với các dịch vụ xuất khẩu trong hình:

Dịch vụ báo động máy chủ Prometheus

Cuối cùng, hãy triển khai máy chủ Prometheus của chúng tôi. Tương tự như triển khai Galera, trước tiên chúng ta phải chuẩn bị tệp cấu hình Prometheus trước khi nhập tệp đó vào Swarm bằng lệnh cấu hình Docker:

$ 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']

Từ tệp cấu hình Prometheus, chúng tôi đã xác định ba công việc - "prometheus" và "galera". Đầu tiên là công việc giám sát chính máy chủ Prometheus. Công việc tiếp theo là giám sát các vùng chứa MySQL của chúng tôi có tên "galera". Chúng tôi xác định các điểm cuối trên các trình xuất MySQL của chúng tôi trên cổng 9104, các điểm này hiển thị các số liệu tương thích với Prometheus từ ba nút Galera tương ứng. "Alert.rules" là tệp quy tắc mà chúng tôi sẽ đưa vào sau trong bài đăng blog tiếp theo nhằm mục đích cảnh báo.

Nhập tệp cấu hình vào cấu hình Docker để được sử dụng với vùng chứa Prometheus sau này:

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

Hãy chạy vùng chứa máy chủ Prometheus và xuất bản cổng 9090 của tất cả các máy chủ Docker cho dịch vụ giao diện người dùng web 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

Xác minh bằng lệnh dịch vụ Docker rằng chúng tôi có 3 dịch vụ Galera, 3 dịch vụ xuất khẩu và 1 dịch vụ 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

Bây giờ máy chủ Prometheus của chúng tôi đã chạy và có thể được truy cập trực tiếp trên cổng 9090 từ bất kỳ nút Docker nào. Mở trình duyệt web và truy cập http://192.168.55.161:9090/ để truy cập giao diện người dùng web Prometheus. Xác minh trạng thái mục tiêu trong Trạng thái -> Mục tiêu và đảm bảo rằng chúng đều có màu xanh lục:

Tại thời điểm này, kiến ​​trúc Swarm của chúng tôi trông giống như sau:

Còn tiếp ..

Bây giờ chúng tôi đã triển khai cơ sở dữ liệu và ngăn xếp giám sát của mình trên Docker. Trong phần 2 của blog, chúng ta sẽ xem xét các số liệu MySQL khác nhau để theo dõi. Chúng tôi cũng sẽ xem cách định cấu hình cảnh báo với 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. Cách khắc phục lỗi quá thời gian chờ khóa trong MySQL

  2. Cách DEGREES () hoạt động trong MariaDB

  3. Cách tự động hóa cụm Galera bằng ClusterControl CLI

  4. Quản lý người dùng cơ sở dữ liệu:Quản lý các vai trò cho MariaDB

  5. Triển khai các cụm và cơ sở dữ liệu có sẵn cao với ClusterControl