Infra Management/Zabbix

zabbix7.4 & agent2로 docker 모니터링, mysql, postgresql 모니터링 방법 정리

bluebamus 2025. 7. 30.

- github 저장소 : https://github.com/bluebamus/database-pgdog-postgresql-mysql

- 레거시 환경에서 구축 실패 로그를 기록함

- agent2를 이용하여 성공적으로 연동한 케이스를 부가적으로 각 항목의 하단에 추가함

 

- 스크립트 사용 및 직접 설치가 아닌 아닌, Dockerfile 및 docker-compose를 사용하는 경우의 프로젝트 트리

.
├── config
│   ├── mysql
│   │   └── backup
│   ├── pgdog
│   └── postgresql
│       └── backup
├── data
│   ├── mysql
│   │   ├── #innodb_redo
│   │   ├── #innodb_temp
│   │   ├── mysql
│   │   ├── performance_schema
│   │   └── sys
│   └── postgresql  [error opening dir]
└── logs
    ├── mysql
    └── postgresql

 

1. docker 모니터링 설정 - 직접 설치 / 실패함

   1.1. 클라이언트 호스트의 docker.sock 파일에 권한 할당

      - 클라이언트 호스트에 agent2가 Docker API에 접근할 수 있도록 권한을 할당해 줘야 한다.

      - docker.sock에 접근 권한을 usermod를 이용해 할당해 줘야 한다. 

      - zabbix 사용자를 Docker 그룹에 추가하여 해당 사용자가 Docker 관련 명령어를 실행할 수 있도록 권한을 할당한다.

sudo usermod -aG docker zabbix

 

   1.2. 시스템 재시작

systemctl restart zabbix-agent2

 

   1.3. 문제점

      - 2025/07/27일 기준 arm cpu 버전의 mysql에서는 zabbx-agent2가 패키지 버전 지원 문제로 설치가 안된다.

         - docker 내부에 설치시 실패함

      - agent를 설치하면 해결할 수 있다.

 

2. docker template를 호스트에 설치한다.

   - Docker by Zabbix agent 2 템플릿을 docker가 설치된 호스트에 설치한다.

 

3. docker 내부 서비스 모니터링 설정을 위한 docker-compose 업데이트

   - docker 내부 서비스는 실제 서버와 같이 agent2와 플러그인 설치 후 웹 서버에서 템플릿을 추가로 설치하는 것으로 기존과 동일한 방법으로 설치 및 설정을 한다.

 

   3.1. mysql, postgresql 모니터링 설정을 위한 docker-compose.yml 예시

      - 포트를 외부와 연결한다.

services:
  postgresql:
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    ports:
      - "5432:5432"
    networks:
      - backend-network

  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
      MYSQL_ROOT_PASSWORD: rootpassword
    ports:
      - "3306:3306"
    networks:
      - backend-network

networks:
  backend-network:
    driver: bridge

 

4. MySQL 컨테이너에 모니터링 설치하기 - 연동 실패 / 우분투 18.04 / zabbix 7.4 agent 설치 

   4.1. agent 설치하기

      - arm cpu의 경우 패키지 호환 문제로 7.4 버전의 agfent2 설치가 안된다.

      - 여러 이유로 문제가 발생하는 경우, agent를 설치하면 해결될 수 있다.

      - 레거시 시스템을 구축해야 했기에 ubuntu 18.04/mysql 5.4를 설치하였고 arm cpu였기에 agent를 설치했다.

1. 리포지토리 구성 패키지 다운로드

Ubuntu 18.04 전용 Zabbix Release 패키지 파일명은 zabbix-release_7.4-1+ubuntu18.04_all.deb이며, 다음 명령어로 다운로드합니다.
Zabbix Repository

wget https://repo.zabbix.com/zabbix/7.4/release/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.4-1+ubuntu18.04_all.deb
``` :contentReference[oaicite:2]{index=2}

## 2. 리포지토리 패키지 설치  
다운로드한 `.deb` 파일을 dpkg로 설치하여 Zabbix 공식 저장소를 `/etc/apt/sources.list.d/zabbix.list`에 등록합니다. :contentReference[oaicite:3]{index=3}  
```bash
sudo dpkg -i zabbix-release_7.4-1+ubuntu18.04_all.deb
``` :contentReference[oaicite:4]{index=4}

## 3. 패키지 인덱스 갱신  
등록된 Zabbix 저장소의 메타데이터를 가져오기 위해 APT 인덱스를 업데이트합니다. :contentReference[oaicite:5]{index=5}  
```bash
sudo apt update
``` :contentReference[oaicite:6]{index=6}

## 4. Zabbix Agent 설치  
APT 저장소에서 공식 `zabbix-agent` 패키지를 설치합니다. :contentReference[oaicite:7]{index=7}  
```bash
sudo apt install -y zabbix-agent
``` :contentReference[oaicite:8]{index=8}

 

   4.2. 템플릿 conf 복사하기

      - agent와 agent2의 큰 차이로 plugin의 기본 설치 유무가 될 수 있다.

         - agent2의 경우 /etc/zabbix/zabbix_agent2.d/plugins.d/에 기본적인 템플릿 conf 파일이 있다.

 

         - agent의 경우는 centos와 ubuntu의 설치 결과가 달랐다.

            - agent의 경우 기본적으로 설치되는 템플릿 conf가 없다.

            - ubuntu : /etc/zabbix/zabbix_agentd.conf.d

            - centos : /etc/zabbix/zabbix_agentd.d

 

      - git으로 zabbix를 clone하여 템플릿을 복사한다.

         - git command : git clone https://github.com/zabbix/zabbix

         - backup을 컨테이너 볼륨으로 설정하고 폴더를 복사했다. backup 폴더를 제외하고 참고하며 된다.

            - path : /backup/zabbix/templates/db/mysql_agent/

            - file : template_db_mysql.conf

   

      - conf 내용을 업데이트 한다.

         - 참고 사이트 : https://sbcode.net/zabbix/setup_mysql_database_monitoring/

         - 다음 항목을 복사한다. 

UserParameter=mysql.ping[*], mysqladmin -h"$1" -P"$2" ping
UserParameter=mysql.get_status_variables[*], mysql -h"$1" -P"$2" -sNX -e "show global status"
UserParameter=mysql.version[*], mysqladmin -s -h"$1" -P"$2" version
UserParameter=mysql.db.discovery[*], mysql -h"$1" -P"$2" -sN -e "show databases"
UserParameter=mysql.dbsize[*], mysql -h"$1" -P"$2" -sN -e "SELECT COALESCE(SUM(DATA_LENGTH + INDEX_LENGTH),0) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$3'"
UserParameter=mysql.replication.discovery[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"
UserParameter=mysql.slave_status[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"

 

   4.3. MySQL에 모니터링 전용 사용자 생성

      - 기본 설정

         - 계정 생성과 관련해서 local만 설정하는 경우, 외부 허용을 설정하는 경우가 있다.

         - 에이전트가 접속하는 것이면 로컬 계정으로 충분할 것이다.

            - 확인이 필요함

# 외부 접속 권한 사용자
CREATE USER 'zbx_monitor'@'%' IDENTIFIED BY '<password>';
GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'%';
FLUSH PRIVILEGES;


# 내부 접속 권한 사용자
CREATE USER 'zbx_monitor'@'localhost' IDENTIFIED BY '<password>';
GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'localhost';
FLUSH PRIVILEGES;


-- 외부 접속(모든 호스트) 권한
CREATE USER 'zbx_monitor'@'%' IDENTIFIED BY '<password>';
GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'%';

-- 내부 접속(로컬호스트) 권한
CREATE USER 'zbx_monitor'@'localhost' IDENTIFIED BY '<password>';
GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'localhost';

FLUSH PRIVILEGES;
mysql -uroot -p -e "
CREATE USER 'zbx_monitor'@'%' IDENTIFIED BY '비밀번호';
GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'%';
CREATE USER 'zbx_monitor'@'localhost' IDENTIFIED BY '비밀번호';
GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'localhost';
FLUSH PRIVILEGES;"

 

      - 복제 메트릭을 수집하려면 MariaDB Enterprise Server 10.5.8-5 이상 및 MariaDB Community Server 10.5.9 이상에서 모니터링 사용자에게 SLAVE MONITOR 권한이 설정되어 있어야 한다.

GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW,SLAVE MONITOR ON *.* TO 'zbx_monitor'@'%';

 

   4.4. docker-compose.yml에 mysql의 command 업데이트 하기

      - 스크립트를 사용해 agent를 설치하고 에이전트를 프로세스로 띄운다.

#!/bin/bash

apt update && apt install wget vim -y

cd ~/

wget https://repo.zabbix.com/zabbix/7.4/release/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.4-1+ubuntu18.04_all.deb

dpkg -i zabbix-release_7.4-1+ubuntu18.04_all.deb

apt update

apt install -y zabbix-agent

cp /backup/zabbix_agentd.conf /etc/zabbix/
cp /backup/template_db_mysql.conf /etc/zabbix/zabbix_agentd.conf.d/

su -s /bin/bash zabbix -c 'zabbix_agentd -f'

 

   4.5. .my.cnf를 생성한다.

      - /var/lib/zabbix에 .my.cnf를 만들고 계정 정보를 입력한다.

[client]
protocol=tcp
user='zbx_monitor'
password='test!'

 

   4.6. 서버에서 ping test를 한다.

zabbix_get -s 134.185.109.20 -p 10057 -k 'mysql.version["localhost","3306"]'

 

   4.7. 문제 발생 및 작업 중단

      - 컨테이너 내부에서 서비스 포트 테스트

nmap -Pn -p 10057,10058 127.0.0.1

 

      - 사실 agent2를 설치하면 더 쉽게 해결될것 같은데, 환경 문제로 설치가 불가하다. 

      - docker 모니터링을 하고 있기 때문에 서비스 모니터링은 중단한다.

      - 해결 방안으로, 차라리 Dockerfile을 만들어 zabbix-agent가 내부적으로 실행되도록 만드는 방법을 고민할 필요가 있을것 같다. supervisord를 사용하여 시작과 함께 동작하게 만드는 것이 방법일 것 같다.

 

5. percona/mysql 8.0 / zabbix 7.4 agent2로 설치하기 - docker-compose & dockerfile-mysql

   - 스크립트로 연동 테스트를 성공했으나 최종 Dockerfile로 만드는게 최선이라 생각해 다시 작업을 수행했다.

   - 테스트 결과 docker내 설치시 zabbix_agent2.conf의 ListenPort를 오리지널 서버 혹은 다른 컨테이너와 다른 포트로 설정하고 zabbix server의 호스트 생성시 agent에 설정해 줘야 한다.

   - 참고 문서 : https://www.zabbix.com/documentation/current/en/manual/guides/monitor_mysql

 

   5.1. Dockerfile

      - 오라클 클라우드 arm 서버이기 때문에 이미지는 percona/percona-server:8.0.35-aarch64를 사용하였다.

      - 문서의 내용을 그대로 따라했다. repo는 이미지의 os를 참고해 오라클 리눅스 9 기반으로 설치했다.

      - zabbix_agent2.conf는 사전에 준비하여 볼륨으로 연동했다.

         - github에서 받거나, 볼륨을 연결하여 컨테이너를 한번 실행하여 복사해 둔다.

         - Server, ListenPort, Hostname를 설정한다.

      - mysql은 초기 실행시 초기화가 필요하다. dockerfile에 추가되었다.

      - 이미지를 기반으로 커스텀 작업을 추가하는 경우, ENTRYPOINT 등으로 실행시켜야 하는 모든 프로세스를 정의 해 줘야 한다. 이 Dockerfile에는 zabbix_agent2와 mysql을 실행하며 mysql은 --user=mysql을 사용해 사용자를 변경한다.

      - 작업에서 Dockerfile의 파일 이름을 Dockerfile-mysql로 정의했다.

FROM percona/percona-server:8.0.35-aarch64

# root 사용자로 전환
USER root

# 필수 도구 설치 및 Zabbix Agent2 레포지토리 등록
RUN dnf update -y \
    && dnf install -y wget vim \
    && wget https://repo.zabbix.com/zabbix/7.4/release/oracle/9/noarch/zabbix-release-7.4-3.el9.noarch.rpm \
    && rpm -ivh zabbix-release-7.4-3.el9.noarch.rpm \
    && dnf update -y \
    && dnf install -y zabbix-agent2 \
    && rm -f zabbix-release-7.4-3.el9.noarch.rpm \
    && dnf clean all

# Zabbix 설정 파일 복사 (빌드 컨텍스트 내 backup 디렉터리에 위치)
COPY ./config/mysql/backup/zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf

RUN mkdir -p /var/lib/mysql && \
    chown -R mysql:mysql /var/lib/mysql && \
    mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql && \
    chown -R mysql:mysql /var/lib/mysql

# 컨테이너 기동 시 Zabbix Agent2를 포그라운드로 실행하고 MySQL 서버를 시작
ENTRYPOINT ["bash", "-c", "zabbix_agent2 -f & exec mysqld --user=mysql"]

 

   5.2. init.sql에 필수 사용자 생성

-- Zabbix 모니터링용 계정 생성
CREATE USER 'zbx_monitor'@'%' IDENTIFIED BY 'test!';
GRANT REPLICATION CLIENT, PROCESS, SHOW DATABASES, SHOW VIEW ON *.* TO 'zbx_monitor'@'%';

 

   5.3. docker-compose

  mysql:
    # image: percona/percona-server:8.0.35-aarch64
    build:
      context: .
      dockerfile: Dockerfile-mysql
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: test!  
      TZ: Asia/Seoul
    ports:
      - "3306:3306"
      - "10057:10057" # zabbix_agent2.conf의 ListenPort도 맞춰줘야 한다.
    volumes:
      - ./data/mysql:/var/lib/mysql # 선택
      - ./config/mysql/my.cnf:/etc/my.cnf # 선택
      - ./config/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro # 필수
      - ./config/mysql/backup:/backup # 선택
      - ./logs/mysql:/var/log/mysql # 선택
    networks:
      - db_network

 

   5.4. zabbix 서버 설정

      - 호스트를 생성한다. 호스트 네임은 zabbix_agent2.conf의 Hostname와 동일하게 맞춰준다.

      - MySQL by Zabbix agent2 템플릿을 설치하고 interface에 agent를 추가한다. 이때 컨테이너에의 zabbix_agent2.conf에 설정한 포트를 정의해준다.

      - 매크로 탭을 눌러 mysql 정보를 업데이트 한다.

         - MYSQL.DSN에 ip와 port를 입력한다. 예) tcp://111.111.111.11:3306

         - MYSQL.PASSWORD에 암호를 입력한다.

         - MYSQL.USER에 mysql에 생성한 사용자 정보를 입력한다.

 

6. PostgreSQL 컨테이너에 모니터링 설치하기

   - 참고 가이드 : https://www.zabbix.com/integrations/postgresql#postgresql_agent2

 

   6.1. debian12 버전에 agent2 설치

설치 절차
1. Zabbix 저장소 패키지 다운로드

wget https://repo.zabbix.com/zabbix/7.4/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb

– Debian12용 리포지토리 설정 파일을 가져옵니다.
Zabbix
initMAX s.r.o.
2. 저장소 패키지 설치

sudo dpkg -i zabbix-release_latest+debian12_all.deb

– /etc/apt/sources.list.d/zabbix.list 에 공식 리포지토리가 등록됩니다.
Zabbix
initMAX s.r.o.
3. 패키지 인덱스 갱신

sudo apt update

– 새로 등록된 Zabbix 저장소의 메타데이터를 가져옵니다.
Zabbix
initMAX s.r.o.
4. Zabbix-Agent2 설치

sudo apt install -y zabbix-agent2

apt install -y zabbix-agent2-plugin-postgresql

– Zabbix 공식 패키지에서 에이전트를 설치합니다.
initMAX s.r.o.
Zabbix
5. 에이전트 서비스 시작 및 자동 실행 설정

sudo systemctl start zabbix-agent2
sudo systemctl enable zabbix-agent2

 

   6.2. PostgreSQL에 모니터링 전용 사용자 생성

      - 기본 설정

         - 계정 생성과 관련해서 local만 설정하는 경우, 외부 허용을 설정하는 경우가 있다.

         - 에이전트가 접속하는 것이면 로컬 계정으로 충분할 것이다.

            - 확인이 필요함

 

         - 접속 방법

psql -U postgres -d postgres -h localhost

 

         - 10 버전 이상

CREATE USER zbx_monitor WITH PASSWORD '<PASSWORD>' INHERIT;
GRANT pg_monitor TO zbx_monitor;

 

         - 9.5 버전 이하

CREATE USER zbx_monitor WITH PASSWORD '<PASSWORD>';
GRANT SELECT ON pg_stat_database TO zbx_monitor;

-- To collect WAL metrics, the user must have a `superuser` role.
ALTER USER zbx_monitor WITH SUPERUSER;

 

         - 확인 방법

select * from pg_catalog.pg_user;

 

   6.3. pg_hba.conf 설정

      - 셋 중 하나만 설정 하면 된다.

host    all        zbx_monitor   localhost    trust
host    all        zbx_monitor   127.0.0.1/32 md5
host    all        zbx_monitor   ::1/128      scram-sha-256 # 가장 권장되는 설정 (보안성 높음)

host    all    zbx_monitor    127.0.0.1/32    scram-sha-256 # 이렇게도 가능

 

      - trust 방식은 피하는게 좋다고 한다. - 패스워드 없이 접속 가능
      - scram-sha-256을 사용하는걸 추천한다. - 가장 안전한 인증 방식
      - IP 주소를 구체적으로 지정하는게 좋다. - 127.0.0.1/32처럼 명확한 범위 설정

      - 운영체제가 localhost를 ::1(IPv6)로 먼저 해석하는 경우, IPv4 전용 레코드(127.0.0.1/32)만 정의하면 IPv6 연결이 차단될 수 있다.

      - 설정 예시

         - IPv4 전용 환경:

host all zbx_monitor 127.0.0.1/32 md5

 

         - IPv6 전용 환경:

host all zbx_monitor ::1/128 scram-sha-256

 

         - 듀얼 스택 환경:

host all zbx_monitor 127.0.0.1/32 md5
host all zbx_monitor ::1/128 scram-sha-256

 

7. postgres:17.5 / zabbix 7.4 agent2로 설치하기 - docker-compose & dockerfile-postgres

- 참고 문서 : https://www.zabbix.com/integrations/postgresql#postgresql_agent2

 

   7.1. Dockerfile

      - Dockerfile-postgresql로 저장한다.

      - mkdir -p /run/zabbix를 필수로 해줘야 한다.

FROM postgres:17.5

# 필수 도구 설치 및 Zabbix Agent2 레포지토리 등록
RUN apt update -y \
    && apt install -y wget vim \
    && wget https://repo.zabbix.com/zabbix/7.4/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb \
    && dpkg -i zabbix-release_latest+debian12_all.deb \
    && apt update -y \
    && apt install -y zabbix-agent2 zabbix-agent2-plugin-postgresql \
    && rm -f zabbix-release_latest+debian12_all.deb \
    && apt clean all

# Zabbix 설정 파일 복사 (빌드 컨텍스트 내 backup 디렉터리에 위치)
COPY ./config/postgresql/backup/zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf

RUN mkdir -p /run/zabbix

# 컨테이너 기동 시 Zabbix Agent2를 포그라운드로 실행하고 MySQL 서버를 시작
ENTRYPOINT ["bash", "-c", "zabbix_agent2 -f & exec docker-entrypoint.sh postgres"]

 

   7.2. init.sql에 필수 사용자 생성

      - 모니터링 사용자 생성

-- Zabbix 모니터링용 MySQL 계정 생성 및 권한 부여
CREATE USER zbx_monitor WITH PASSWORD 'test!' INHERIT;
GRANT pg_monitor TO zbx_monitor;

 

   7.3. pg_hba.conf 구성

      - 하단에 localhost와 127.0.0.1에 대한 구성을 해준다.

      - 자세한건 6.3 항목을 참고한다.

      - localhost는 필요시 삭제해도 무방하다.

host       all        zbx_monitor     localhost               trust
host       all        zbx_monitor     ::1/128                 scram-sha-256

 

   7.4. zabbix_agent2 설정

      - Server : zabbix server ip

      - ListenIP : 컨테이너에서 사용할 리스닝 포트 예) 10055

      - Hostname : 호스트 네임 (서버와 동일하게 설정) 

 

   7.5. docker-compose

  postgres:
    # image: postgres:17.5
    build:
      context: .
      dockerfile: Dockerfile-postgresql
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"
    container_name: postgres
    restart: always
    ports:
      - "5432:5432"
      - "10055:10055"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: test!
      POSTGRES_DB: postgres
      TZ: Asia/Seoul
    volumes:
      - ./data/postgresql:/var/lib/postgresql/data
      - ./config/postgresql/postgresql.conf:/var/lib/postgresql/data/postgresql.conf
      - ./config/postgresql/backup/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf
      - ./config/postgresql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
      - ./config/postgresql/backup:/backup
      - ./logs/postgresql:/var/log/postgresql
    networks:
      - db_network

 

   7.6. zabbix 서버 설정

      - 호스트 생성시 PostgreSQL by Zabbix agent 2 템플릿을 설치한다.

      - 호스트 생성시 2개 항목에 대한 매크로만 설정해주면 된다. 

 

- reference : 

https://blog.zabbix.com/setting-up-zabbix-agent-2-for-postgresql-monitoring-and-revealing-how-it-works/13208/

 

Setting up Zabbix Agent 2 for PostgreSQL monitoring and revealing how it works - Zabbix Blog

This article will recall the most important theses about the plugin for PostgreSQL monitoring for Zabbix Agent 2. Here…

blog.zabbix.com

 

댓글