Zabbix
Zabbix版本及下载
-
Zabbix: https://www.zabbix.com/documentation/6.4/zh/manual/installation/containers
- https://github.com/zabbix/zabbix-docker
- docker compose方式部署Zabbix 7.0 LTS: https://blog.csdn.net/islandstar/article/details/140105767
- Zabbix在Docker中的应用和监控:https://www.cnblogs.com/evescn/p/12374756.html
- Zabbix6.0容器化部署(Docker-Composed):https://blog.csdn.net/Canz245630/article/details/138708050
- 模板库:https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates
- zabbix-server:Agent 向其报告可用性、系统完整性信息和统计信息的核心组件,Port:10051。
- zabbix-agent: 部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给 Zabbix server,Port:10050。
- zabbix-web:提供zabbix监控的UI界面服务(端口:80、443)
- zabbix-db:提供zabbix服务存储的数据库服务(端口:5432、3306)
- zabbix-snmptraps(可选):提供snmp管理监控的服务(端口:162)
- Zabbix-Web-Service 在Zabbix5.4版中首次出现,基于Go编写。主要作用是定期发送巡检报告到指定邮件账户。
- zabbix-proxy
- zabbix-java-gateway
- Zabbix 组件运行模式
Zabbix server 5.0 (tags: alpine-5.0-latest, ubuntu-5.0-latest, ol-5.0-latest) Zabbix server 5.0.* (tags: alpine-5.0.*, ubuntu-5.0.*, ol-5.0.*) Zabbix server 6.0 (tags: alpine-6.0-latest, ubuntu-6.0-latest, ol-6.0-latest) Zabbix server 6.0.* (tags: alpine-6.0.*, ubuntu-6.0.*, ol-6.0.*) Zabbix server 6.4 (tags: alpine-6.4-latest, ubuntu-6.4-latest, ol-6.4-latest) Zabbix server 6.4.* (tags: alpine-6.4.*, ubuntu-6.4.*, ol-6.4.*) Zabbix server 7.0 (tags: alpine-7.0-latest, ubuntu-7.0-latest, ol-7.0-latest, alpine-latest, ubuntu-latest, ol-latest, latest) Zabbix server 7.0.* (tags: alpine-7.0.*, ubuntu-7.0.*, ol-7.0.*) Zabbix server 7.2 (tags: alpine-trunk, ubuntu-trunk, ol-trunk)
ZABBIX_AGENT_IMAGE=zabbix/zabbix-agent ZABBIX_AGENT2_IMAGE=zabbix/zabbix-agent2 ZABBIX_JAVA_GATEWAY_IMAGE=zabbix/zabbix-java-gateway ZABBIX_SNMPTRAPS_IMAGE=zabbix/zabbix-snmptraps ZABBIX_WEB_SERVICE_IMAGE=zabbix/zabbix-web-service docker pull zabbix/zabbix-server-mysql:alpine-7.0-latest docker pull zabbix/zabbix-web-nginx-mysql:alpine-7.0-latest docker pull zabbix/zabbix-web-service:alpine-7.0-latest docker pull zabbix/zabbix-snmptraps:alpine-7.0-latest docker run --name some-zabbix-server-mysql -e DB_SERVER_HOST="some-mysql-server" \ -e MYSQL_USER="some-user" \ -e MYSQL_PASSWORD="some-password" \ --init -d \ zabbix/zabbix-server-mysql:alpine-6.4-latest
docker相关
- Docker容器的重启策略
no | 默认策略,在容器退出时不重启容器 |
on-failure | 在容器非正常退出时(退出状态非0),才会重启容器 |
on-failure:3 | 指定启动的次数,在容器非正常退出时重启容器,最多重启3次 |
always | 在容器退出时总是重启容器 |
unless-stopped | 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 |
-
docker run容器的退出状态码
- 0,表示正常退出
-
非0,表示异常退出(退出状态码采用chroot标准)
- 125,Docker守护进程本身的错误
- 126,容器启动后,要执行的默认命令无法调用
- 127,容器启动后,要执行的默认命令不存在
- 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
-
docker-compose版本:需要下载升级版本
docker-compose version docker-compose version 1.29.2, build unknown docker-py version: 5.0.3 CPython version: 3.12.3 OpenSSL version: OpenSSL 3.0.13 30 Jan 2024
- https://github.com/docker/compose/releases
- 2024-11-11: v2.30.3
# 一直下载失败 #curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose pip3 download docker-compose
在Ubuntu 24.04上用apt安装python3-pip,运行时提示与系统组件可能有冲突,之后用apt remove,并把python3也remove了,之后重启系统网络就无法工作,网卡一直为down状态,systemd-networkd-wait-online.service报timeout。
最终只能从github上直接下载新版本,解压到/usr/local/bin目录下就可以使用(6xMB的包,已经打包为执行文件。,自带了python支持)。
直接docker run
https://www.zabbix.com/documentation/6.4/zh/manual/installation/containers
-
创建专用于 Zabbix 组件容器的网络:
docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net
-
新建 MySQL 服务器实例:
# https://mysql.net.cn/doc/refman/8.0/en/docker-mysql-getting-started.html # # docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=debug -d mysql:8.0 # # docker run --name=mysql80new \ # --mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \ # --mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \ # -d mysql/mysql-server:8.0 # 本地创建一个与mysql容器相同ID用户,方便看目录权限 groupadd --gid 999 mysql useradd -c "docker mysql" --gid 999 --uid 999 --shell /bin/bash -m mysql # 建立mysql数据目录 mkdir -p /data/docker/zabbix/data_mysql # --restart always \ # --restart unless-stopped \ # -e TZ=Asia/Shanghai \ docker run --name mysql8.0-zabbix -t \ -p 23306:3306 \ --restart unless-stopped \ --network zabbix-net \ -v /etc/timezone:/etc/timezone:ro \ -v /etc/localtime:/etc/localtime:ro \ -v /data/docker/zabbix/data_mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=debug \ -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix_pwd" \ -e MYSQL_ROOT_PASSWORD="root_pwd" \ -d mysql:8.0 \ --character-set-server=utf8 --collation-server=utf8_bin \ --default-authentication-plugin=mysql_native_password # 进入mysql主机,查看mysql中的用户和DB docker exec -it mysql-server /bin/bash mysql -uroot -p # docker信息格式化输出 docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
-
启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例
# -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \ # -e TZ=Asia/Shanghai \ docker run --name zabbix-server-mysql -t \ --restart unless-stopped \ --network zabbix-net \ -v /etc/timezone:/etc/timezone:ro \ -v /etc/localtime:/etc/localtime:ro \ -e DB_SERVER_HOST="mysql8.0-zabbix" \ -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix_pwd" \ -e MYSQL_ROOT_PASSWORD="root_pwd" \ -p 20051:10051 \ -d zabbix/zabbix-server-mysql:alpine-7.0-latest
初次运行zabbix-server,会自动从create.sql.gz(4.1MB,160万行)中导入初始化数据到mysql中,需要几分钟时间,这期间访问zabbix-web会提示没有可选配置。导入完成后才会启动服务进程,以及网络端口侦听,这时再去启动zabbix-web容器。
进入zabbix-server容器,可以看到初始化的进程:
PID USER TIME COMMAND 1 zabbix 0:00 {docker-entrypoi} /bin/bash /usr/bin/docker-entrypoint.sh /usr/sbin/zabbix_serve 22 zabbix 0:00 gzip -cd /usr/share/doc/zabbix-server-mysql/create.sql.gz 23 zabbix 0:07 mysql --silent --skip-column-names --default-character-set=utf8mb4 -h mysql-serv 24 zabbix 0:00 /bin/bash 44 zabbix 0:00 ps aux
-
启动 Zabbix Web 界面,并将其关联到已创建的 MySQL server 和 Zabbix server 实例
# -e TZ=Asia/Shanghai \ docker run --name zabbix-web-nginx-mysql -t \ --restart unless-stopped \ --network zabbix-net \ -v /etc/timezone:/etc/timezone:ro \ -v /etc/localtime:/etc/localtime:ro \ -e ZBX_SERVER_HOST="zabbix-server-mysql" \ -e DB_SERVER_HOST="mysql8.0-zabbix" \ -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix_pwd" \ -e MYSQL_ROOT_PASSWORD="root_pwd" \ -p 28080:8080 \ -d zabbix/zabbix-web-nginx-mysql:alpine-7.0-latest # 默认用户名是Admin,密码zabbix。
安装zabbix-agent
在被监控主机安装zabbix-agent。
-
Ubuntu 24.04
# Install Zabbix repository wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest+ubuntu24.04_all.deb dpkg -i zabbix-release_latest+ubuntu24.04_all.deb apt-get update # Install Zabbix agent apt install zabbix-agent # Start Zabbix agent process # Start Zabbix agent process and make it start at system boot. systemctl restart zabbix-agent systemctl enable zabbix-agent
-
CentOS7
# Install Zabbix repository rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/7/x86_64/zabbix-release-latest.el7.noarch.rpm yum clean all # Install Zabbix agent yum install zabbix-agent # Start Zabbix agent process # Start Zabbix agent process and make it start at system boot. systemctl restart zabbix-agent systemctl enable zabbix-agent
-
agent配置文件:
/etc/zabbix/ ├── zabbix_agentd.conf └── zabbix_agentd.d
-
需要修改项:
# 改为zabbix-server IP地址或网段,否则采集时会拒绝连接 # Server=127.0.0.1 Server=172.16.238.0/24,172.16.239.0/24,172.20.240.0/24 # ListenPort=10050,agent的侦听端口,改成你规划的端口 ListenPort=20050 # 主动上报的地址、端口,配置成docker容器对外映射的端口 # ServerActive=127.0.0.1 ServerActive=127.0.0.1:20051 # 主动上报时的主机名,与zabbix中添加的主机名称保持一致 # Hostname=Zabbix server Hostname=tubuntu-3-2 # 以root身份运行,便于采集特定指标,不一定需要-待定 # 需要修改zabbix-agent.service,以root用户启动 # https://www.zabbix.com/documentation/5.0/zh/manual/appendix/install/run_agent_as_root AllowRoot=1
docker-compose方式
从 https://github.com/zabbix/zabbix-docker 下载docker-compose配置,根据需要项调整。
docker-compose/ ├── .env # 环境参数,指定数据目录、运行版本信息 ├── .env.def # 备份默认配置 ├── compose.yaml -> docker-compose_v3_alpine_mysql_latest.yaml # ln到主文件 ├── compose_databases.yaml # 数据库配置 ├── compose_zabbix_components.yaml # zabbix组件定义文件 ├── docker-compose_v3_alpine_mysql_latest.yaml # 主compose文件 └── env_vars # 容器环境参数、密码配置 ├── .MYSQL_PASSWORD ├── .MYSQL_ROOT_PASSWORD ├── .MYSQL_ROOT_USER ├── .MYSQL_USER ├── .POSTGRES_PASSWORD ├── .POSTGRES_USER ├── .env_agent ├── .env_db_mysql ├── .env_db_mysql_proxy ├── .env_db_pgsql ├── .env_java ├── .env_prx ├── .env_prx_mysql ├── .env_prx_sqlite3 ├── .env_snmptraps ├── .env_srv ├── .env_web ├── .env_web_service ├── chrome_dp.json └── mysql_init └── init_proxy_db.sql
docker-compose up -d [+] Running 7/7 ✔ Network docker-compose_database Creat... 0.1s ✔ Network docker-compose_backend Create... 0.1s ✔ Network docker-compose_frontend Creat... 0.2s ✔ Network docker-compose_tools_frontend Created 0.2s ✔ Container docker-compose-mysql-server-1 Started 0.7s ✔ Container docker-compose-zabbix-web-nginx-mysql-1 Started 1.9s ✔ Container docker-compose-zabbix-server-1 Started 2.5s docker-compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS docker-compose-mysql-server-1 mysql:8.0 "docker-entrypoint.s…" mysql-server 37 seconds ago Up 36 seconds docker-compose-zabbix-server-1 zabbix/zabbix-server-mysql:alpine-7.0-latest "/usr/bin/docker-ent…" zabbix-server 36 seconds ago Up 35 seconds 0.0.0.0:20051->10051/tcp docker-compose-zabbix-web-nginx-mysql-1 zabbix/zabbix-web-nginx-mysql:alpine-7.0-latest "docker-entrypoint.sh" zabbix-web-nginx-mysql 36 seconds ago Up 35 seconds (healthy) 0.0.0.0:20080->8080/tcp, 0.0.0.0:20443->8443/tcp docker-compose images CONTAINER REPOSITORY TAG IMAGE ID SIZE docker-compose-mysql-server-1 mysql 8.0 9f4b39935f20 590MB docker-compose-zabbix-server-1 zabbix/zabbix-server-mysql alpine-7.0-latest aa80bfaed00e 138MB docker-compose-zabbix-web-nginx-mysql-1 zabbix/zabbix-web-nginx-mysql alpine-7.0-latest 7e5d8d917c40 300MB
- zabbix自动发现规则批量监控主机的TCP监听端口:https://blog.csdn.net/qq_31725371/article/details/97838266
Zabbix Web监测
- Web 监控:https://www.zabbix.com/documentation/7.2/zh/manual/web_monitoring
- 支持的宏:https://www.zabbix.com/documentation/7.2/zh/manual/appendix/macros/supported_by_location
在Web监测方面,Zabbix提供了一套完整的监控功能,可以检查网站的可用性、性能和正确性。
- 配置Web监控场景
在Zabbix中,要进行Web监控,首先需要定义一个Web场景。Web场景由一个或多个HTTP请求组成,这些请求称为步骤。
Zabbix服务器会按照预设的顺序执行这些步骤,如果监控任务由代理执行,则步骤由代理执行。
Web场景可以应用于主机或模板,这意味着可以在模板级别创建Web场景,然后一次性应用于多个主机。
- 创建Web场景
在Zabbix界面中,选择配置->主机->选择主机->单击Web监测->创建Web监测。
在场景选项卡中添加名称和应用集,然后在步骤选项卡中添加监控页面。
在步骤选项卡中,单击添加按钮,依次添加名称、URL、超时时间等选项,然后单击添加。
- 配置步骤
每个步骤可以配置如下参数:
- 名称:步骤的唯一名称。
- URL:用于连接和检索数据的URL。
- 超时时间:Zabbix处理URL的时间限制。
- 所需字符串:检索到的内容(HTML)必须匹配的预定义字符串。
- 所需状态代码:预期的HTTP状态代码列表。
- 监控数据展示与告警通知
Zabbix会自动收集相关的Web检测数据,主要包括访问速度、响应时间、下载速度和状态码。用户可以在监控->Web检测中查看这些数据。此外,还可以配置触发器和动作来发送报警信息。
- 实战案例
以下是一个实战案例,展示了如何使用Zabbix进行Web页面的监控和告警配置:
配置Web页面检测:选择一台能上外网的被监控主机,依次执行:配置->主机->Zabbix server->Web监测,然后创建Web场景和添加检测页面。
创建触发器:配置->主机->所选主机->触发器->创建触发器,填写名称和表达式,设置触发器条件。
Web监控数据展示:监控->Web检测,查看收集到的Web检测数据。
配置告警通知:配置Action等相关动作,来发送报警信息内容。
通过以上步骤,可以实现对Web页面的有效监控,及时发现并处理潜在的问题,确保网站的稳定运行。
zabbix数据量
- zabbix管理六之数据有效期设置: https://blog.51cto.com/732233048/1640170
趋势存储数据和历史存储数据详解:
案例:
100台服务器,每台服务器有30个监控项,每个监控项60秒刷新一次,需要多大的硬盘呢?
zabbix基本都是通过web配置,这些配置数据也是存放到数据库里的,但是它对硬盘容量的要求基本可以忽略不计,zabbix对硬盘的决定性因素有4个,如下:
- 1. 每秒处理的数据量
这边的每秒只是一个平均值,例如我有3000个监控项,每60秒刷新一次,那么平均每秒有50(3000/60)个数据要处理。就是说每秒有50条数据要插入MySQL
- 2. 历史记录保存时间(历史存储数据)
zabbix对每个监控项的值都要记录下来,这些记录一般保留几周,具体看你的配置了。每个值都需要暂用硬盘空间。
假如一个数据你要保留30天,而且每秒有50个值要保留,那我们一共有129,600,000(30天*24小时*3600秒)*50个值,一条记录多大,由你的数据库引擎和你存储的数据类型来决定(浮点型,×××,字符型等等),一般来说一条记录需要占用50个字节(一个大概值),在这个案例中129,600,000个记录大约需要(129600000*50字节)6.5G的硬盘空间
简单来说:历史存储数据,每60秒刷新一次(具体看你配置),主要作用就是某一刻的数据,当前所有监控项的值以及触发报警值都是从历史存储数据里获取的,具有时效性,过了这一时刻,这些数据基本上就没有什么用了,所有我们可以把有效期设置的短一点
- 3. 趋势数据保存时间(趋势存储数据)
什么是趋势数据呢?当你查看一周或者一月的图表,图表上看到的MAX/MIN/AVG/COUNT都是取自趋势数据,趋势数据一小时获取一次,一般情况下,趋势数据一条记录大概占用128字节,如果我们想保存5年趋势数据,3000个监控线需要2.4GB(3000个*24小时*356天*128字节)每年,5年一共16.8G
- 4. 事件记录保存时间
报警、警告、恢复等等事情,一个事件大概占用130个字节,一般情况下不会太多,除非运维做的太糟糕,或者运维要求太严格,把阀值调的很低。假如这个运维今年本命年,既没拜佛有没烧香,更别说给服务器贴灵符,于是这一年每秒钟就有一个事件发生,那么事件这一年占用的数据空间为:1年*365天*24小时*3600秒*130字节大概为4.1G空间。
- 5. 数据库空间计算公式
zabbix配置:固定大小,一般<10MB
历史数据:天数*(监控项总数/刷新频率)*24小时*3600秒*50字节
趋势数据:天数*(监控项总数/3600)*24小时*3600秒*128字节
事件数据:天数*事件个数(大概值)*24小时*3600秒*130字节
6. 谈心
看到这里,大家都心里有数据了,数据库硬盘空间=配置文件大小+历史记录+趋势记录+事件记录。虽然这个硬盘会不停的增长,但是总有一天会停止增长,空间一直保持不变,为什么?看完了这篇还问为什么的话,你从头再看一次。
Zabbix几个历史表
- 作者:super_pcm
- 链接:https://www.jianshu.com/p/9f770d248f7f
- 来源:简书
# zcat db_zabbix.20250428_145101.dump.gz |grep ^INSERT|awk '{print $3}'|sort|uniq -c|sort -nr 85369696 `history_uint` 34716360 `history` 7833537 `trends_uint` 3330258 `trends` 56263 `event_tag` 32465 `item_tag` 32437 `valuemap_mapping` 27446 `events` 26330 `item_preproc` 23725 `items` 18353 `history_str` 13569 `functions`
* history: 浮点历史数据表,与items表相关联。 * history_uint:长整型历史数据表,与items表相关联 * history_str: 字符串的历史数据表。 * history_text: 长文本历史数据表,支持255字符以上的文本,与items表相关联。 * history_log: 历史日志表,与items表相关联。 * trends:趋势表,浮点型,每个小时统计数 * trends_uint:趋势长整型表,每个小时,与items表相关联。
这几个历史表里面,通常最占用空间的是 history_uint 表,因为我们大多数的监控项的值都是整型。
假设我们的zabbix有1000个监控项目是整型的,每分钟采集一次,历史数据保留10天。那么这个表10天的数据量有 602410*1000=14400000 ,1440万行的数据。
很明显这个表太大了,实际情况下一个监控系统监控项目远超1000项,有些item的采集频率可能更高,数据量超过1亿行也很常见。
同理,trends_uint表的数据量也不会太小。按照上面的计算,该表10天的数据量大概为24万行。当然历史趋势数据我们通常会保留更久,默认会保留90天,也就是大概216万行。
所以,zabbix监控的性能瓶颈就是在于mysql。想办法把历史表的数据量降低,否则你的监控系统也需要大量的资源了。当然,你也可以考虑用promethues.