专栏首页Zabbix中国官方五分钟带你玩转Zabbix6.0容器化HA集群

五分钟带你玩转Zabbix6.0容器化HA集群

蔡斯 | Zabbix开源社区签约专家

  • Zabbix资深玩家,SRE高级运维,架构师。精通服务组件监控、模板制作及告警治理。
  • 擅长领域:Zabbix API定制化开发,对接企业蓝鲸,JMS保垒机等运维资产管理。

万众瞩目的Zabbix6.0 LTS发布在即,官网同步开放了Beta版支持多种部署方式供大家尝鲜。

本文分享在单机Docker环境中快速构建Zabbix容器化集群,带你走进全新的原生HA集群,你将获得如下知识:

1. 写在前面

1.1. Zabbix6.0新功能

Zabbix6.0LTS是Zabbix5.2,5.4以及Zabbix6.0 LTS中直接引入的特性的组合,主要功能:

  • 更先进的机器学习、统计分析功能、更强大的异常检测
  • 物联网监控、多数据中心监控、定时报表
  • 双因素身份验证、单点登录、用户权限精细化到UI颗粒度
  • 提供HA选项和负载均衡Zabbix UI和API,K8s和OpenShift开箱即监控、监控任何对象

1.2 部署环境约定

系统版本

环境

版本

宿主架构(Arch)

x86_64

宿主系统(System)

Ubuntu 20.04

容器系统(System)

Alpine 3.15.0

容器引擎(Docker)

20.10.12

软件版本

角色名称

版本

端口

Zabbix-Web

v6.0rc1

80

Zabbix-MySQL

v8.0.27

3006

Zabbix-Agent

v6.0rc1

10050

Zabbix-Web-Service

v6.0rc1

10053

Zabbix-Server-Master01

v6.0rc1

10051

Zabbix-Server-Master02

v6.0rc1

20051

Zabbix-Server-Master03

v6.0rc1

30051

2. Docker引擎

本章节通过Ubuntu环境(普通用户),快速安装配置Docker引擎。如你已具备此环境且端口不被占用,可直接跳至Zabbix组件部署章节。

2.1. 系统初始化

优化资源配额、替换Ubuntu源、更新系统

sudo sed -i '/^# End of file/,$d' /etc/security/limits.conf
sudo sh -c "cat >> /etc/security/limits.conf <<EOF
# End of file
root - nproc 512000
* - nproc 512000
root - nofile 512000
* - nofile 512000
EOF"
ulimit -SHn 51200
ulimit -SHu 51200
ulimit -u -n
sudo sed -i.bak 's/http:\/\/.*.ubuntu.com/http:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo apt-get update && sudo apt-get upgrade -y

2.2. 添加GPG密钥

卸载旧版本、安装依赖包、添加GPG密钥

sudo apt-get remove docker docker-engine docker.io containerd runc && sudo rm -rf /var/lib/docker && sudo rm -rf /var/lib/containerd
sudo apt-get -y install apt-transport-https ca-certificates curl gnupg software-properties-common lsb-release
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

2.3. 开启路由和内核参数

尽管有些系统默认开启包转发功能和内核参数,稳妥起见,这里再次配置加载

sudo modprobe br_netfilter
sudo sh -c 'echo "modprobe br_netfilter" >> /etc/profile'
sudo sh -c 'cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF'
sudo sysctl -p /etc/sysctl.d/docker.conf

2.4. 安装配置

添加Docker软件源、安装docker、配置镜像加速、配置免sudo

sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
sudo sh -c 'cat > /etc/docker/daemon.json<< EOF
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF'
sudo usermod -aG docker [你的用户名]
sudo systemctl daemon-reload
sudo systemctl restart docker

2.5. 验证

验证Docker镜像加速源、基本使用功能

docker info |grep "Registry Mirrors:" -A 2
docker run hello-world

3. Zabbix组件

以下介绍如何通过Docker快速创建Zabbix6.0 容器化集群的组件。

3.1. 创建子网

创建Zabbix组件虚拟子网:Zabbix-Subnet

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 Zabbix-Subnet

3.2. MySQL容器

选择MySQL8.0作为Zabbix后端数据库。

docker run --name Zabbix-MySQL -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pw" \
-e MYSQL_ROOT_PASSWORD="root_pw" \
-v /etc/localtime:/etc/localtime:ro \
-d mysql:8.0 \
--character-set-server=utf8 \
--collation-server=utf8_bin \
--default-authentication-plugin=mysql_native_password

通过检索MySQL容器日志docker logs Zabbix-MySQL | grep ready 过滤到reday相关日志,表示MySQL状态已准备就绪:

2022-01-21T09:36:12.157456Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: ‘8.0.27’

MySQL容器参数说明

参数

作用

character-set-server

MySQL默认字符集

collation-server

MySQL默认排序

default-authentication-plugin

默认用户加密规则

3.3. Adminer容器

Adminer容器是一款基于PHP编写的MySQL开源UI管理工具。

docker run --name MySQL-Adminer -t \
--restart always \
--network=Zabbix-Subnet \
-v /etc/localtime:/etc/localtime:ro \
-p 8080:8080 \
-d adminer:latest

访问测试

打开Chrome浏览器访问http://<your_hostip>:8080,输入Zabbix-MySQL作为服务器,root用户及密码MYSQL_ROOT_PASSWORD登录,不出意外如下图所示。

3.4. Zabbix-Web-Service容器

Zabbix-Web-ServiceZabbix5.4版中首次出现,基于Go编写。主要作用是定期发送巡检报告到指定邮件账户,对运维服务台、值班人员有一定帮助。

docker run --name Zabbix-Web-Service -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e ZBX_ALLOWEDIP="Zabbix-Server-Master01,Zabbix-Server-Master02,Zabbix-Server-Master03" \
-e ZBX_LISTENPORT=10053 \
-v /etc/localtime:/etc/localtime:ro \
--cap-add=SYS_ADMIN \
-d zabbix/zabbix-web-service:alpine-trunk

Zabbix-Web-Service容器参数说明

参数

作用

ZBX_ALLOWEDIP

Zabbix服务器和Zabbix代理的IP或DNS名称。

ZBX_LISTENPORT

Zabbix-Web-Service监听的端口

3.5. ZabbixServer容器

本环境通过配置监听不同端口,创建3个Zabbix Server Node节点,仅作演示HA集群用,即伪集群。

1)创建 Zabbix-Server-Master01

docker run --name Zabbix-Server-Master01 -t --restart unless-stopped --network=Zabbix-Subnet --hostname="Zabbix-Server-Master01" -e ZBX_LISTENPORT=10051 -e ZBX_NODEADDRESSPORT=10051 -e DB_SERVER_HOST="Zabbix-MySQL" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pw" -e ZBX_STARTREPORTWRITERS="2" -e ZBX_WEBSERVICEURL="http://Zabbix-Web-Service:10053/report" -e ZBX_AUTOHANODENAME=fqdn -e ZBX_AUTONODEADDRESS=fqdn -e ZBX_TIMEOUT="30" -e ZBX_UNREACHABLEPERIOD="120" -v /etc/localtime:/etc/localtime:ro --link Zabbix-Agent --link Zabbix-MySQL --link Zabbix-Web-Service -d zabbix/zabbix-server-mysql:alpine-trunk

命令换行注释:红框内的变量(4个),请务必按软件版本约定中的角色及端口对号入座。

通过docker logs -f Zabbix-Server-Master01,我们可以看到此时ZabbixServer进入HA管理模式,且此节点成了Active模式。

2)创建 Zabbix-Server-Master02 考虑到篇幅原因,创建命令修改红框内的变量即可 3)创建 Zabbix-Server-Master03 考虑到篇幅原因,创建命令修改红框内的变量即可

ZabbixServer容器参数说明

参数

作用

hostname

容器主机名

DB_SERVER_HOST

MySQL主机名

ZBX_LISTENPORT

ZbxSvr监听端口

ZBX_STARTREPORTWRITERS

ZbxWebSvr进程数

ZBX_WEBSERVICEURL

ZbxWebSvr地址

ZBX_AUTOHANODENAME

当前ZbxHA节点名

ZBX_AUTONODEADDRESS

当前ZbxHA地址

ZBX_NODEADDRESSPORT

当前ZbxHA端口

3.6. Zabbix-Agent容器

为减少篇幅,本环境创建1个Zabbix Agent作演示HA集群用。

docker run --name Zabbix-Agent -t --restart unless-stopped --network=Zabbix-Subnet -e ZBX_HOSTNAME="Zabbix server" -e ZBX_SERVER_HOST="Zabbix-Server-Master01" -e ZBX_SERVER_PORT="10051" -e ZBX_ACTIVESERVERS="Zabbix-Server-Master02:20051,Zabbix-Server-Master03:30051"  -e ZBX_PASSIVESERVERS="Zabbix-Server-Master02,Zabbix-Server-Master03" --link "Zabbix-Server-Master01" --link "Zabbix-Server-Master02" --link "Zabbix-Server-Master03" -v /etc/localtime:/etc/localtime:ro --privileged -d zabbix/zabbix-agent2:alpine-trunk

Zabbix-Agent容器参数说明

参数

作用

ZBX_HOSTNAME

ZabbixAgent主机名

ZBX_SERVER_HOST

第一个ZabbixServerIP或FQDN

ZBX_SERVER_PORT

第一个ZabbixServer的端口

ZBX_ACTIVESERVERS

主动模式下ZabbixServerIP或FQDN列表

ZBX_PASSIVESERVERS

被动模式下ZabbixServerIP或FQDN列表

3.7. Zabbix-Web容器

docker run --name Zabbix-Web -t --restart unless-stopped --network=Zabbix-Subnet -e PHP_TZ="Asia/Shanghai" -e DB_SERVER_HOST="Zabbix-MySQL" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pw" -e MYSQL_ROOT_PASSWORD="root_pw" --link Zabbix-MySQL --link Zabbix-Agent --link Zabbix-Server-Master01 --link Zabbix-Server-Master02 --link Zabbix-Server-Master03 -e ZBX_TIMEOUT="30" -e ZBX_UNREACHABLEPERIOD="120" -v /etc/localtime:/etc/localtime:ro -p 80:8080 -d zabbix/zabbix-web-nginx-mysql:alpine-trunk

通过docker logs -f Zabbix-Web | grep ready查看容器日志,出现字样如下,表示Web端正常工作。

[21-Jan-2022 16:08:22] NOTICE: ready to handle connections

3.8. 小结

通过以上操作,我们共创建了8个容器。

4. 集群体验

4.1. 集群介绍

登录Web端 打开Chrome浏览器访问http://<your_hostip>:80,默认账密:Admin/zabbix。So,现在开始我们的HA集群之旅吧~

更改Interfaces接口类型

Zabbix server主机默认使用IP模式监控且地址指向127.0.0.1。这里使用DNS名称方式,注意和红框两处信息保持一致即可。

集群列表

通过左侧导航栏,点击Reports->System information查看页面下方集群状态,其中Zabbix-Server-Master01状态为Active活跃状态,同时Runnig的Server也指向Zabbix-Server-Master01,其他节点为Standby备用状态。

4.2. 模拟故障

首先确认Zabibx server数据正常收集,证明主节点正常工作,时间点为:2021-01-20 15:27:18

手动停止docker stop Zabbix-Server-Master01,等待1min左右,仪表盘出现告警信息。

新开一个标签页,再次访问集群状态的控件,看到Zabbix-Server-Master02替代Zabbix-Server-Master01成为Active节点并上升到第1位,说明集群已完成切换。

再次点击获取Zabibx server的最新数据,时间点为:2021-01-20 15:31:08,说明新的主节点Zabbix-Server-Master02正常工作。

至此,Zabbix6.0原生HA集群”故障自动转移“功能,亲测通过!!!

4.3. 原理剖析

在Zabbix6.0 高可用集群中,一共定义了4种节点状态,定义及区别如下:

状态

说明

Active

当前活动的节点。一次只能激活一个节点

Standby

节点当前在待机模式下运行。多个节点可以具有此状态。

Stopped

之前检测到该节点,但已正常关闭。

Unreachable

之前检测到节点,但在没有关闭的情况下意外丢失。

Zabbix Agent端在HA模式下的工作方式

跟大多数HA集群一样,Agent客户端通过配置多个Server节点。当主节点不可用时,主动模式下会重试配置列表中的其他节点并询问是不是它重新接管,如不是,则会重试下一个节点直至找到。如是,则将数据推送给它。

Zabbix Web端在HA模式下的工作方式

通过模拟将HA集群中的Active节点正常关闭,前端节点会从Standby节点中选1个节点作为Active节点接管集群。

引用官方一张图,它的原理通过前端节点连接到Zabbix后端数据库,定时读取当前活动节点的地址,继续保持和该节点关系.

Zabbix6.0 HA集群设计所有节点每5秒将它们的心跳发送到Zabbix数据库后端。如果一个Active节点被正常维护而停止,其他Standby节点将在5秒后开始接管。

Zabbix Server端在HA模式下的工作方式

通过bash进入Zabbix Active容器节点,将HA Manager进程强行Kill掉。等待Fail-Over Delay指定的1min后,Zabbix Active节点进入Unreachable状态。

通过UI工具查询数据库

以上可得知,在ZabbixHA集群数据表中,其Status列对应值关系如下

状态名(Status)

状态码(Code)

Standby

0

Stopped

1

Unreachable

2

Active

3

原生HA集群设计故障转移延迟为1分钟,即备用节点将等待1分钟,让故障的活动节点更新其状态,如果在1分钟内活动节点仍然不可见,则备用节点将接管。

5.0. 文章小结

如今,许多大型公司都在积极参与数字化转型。当他们想迁移现有基础设施以使其更好、更灵活和更具成本效益时,Zabbix显然可以成为他们数字化转型的重要组成部分。

这完全得益于,Zabbix配置灵活、高度集成、监控万象的人性化特点。

文章分享自微信公众号:
Zabbix开源社区

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:Zabbix开源社区
原始发表时间:2022-02-03
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 容器运维不再重造轮子:企业级容器平台VIC

    今年的VMWorld大会从旧金山移师赌城拉斯维加斯举行。和旧金山相比,拉斯维加斯这座沙漠之城少了些科技的氛围,不过在一片休闲娱乐气氛中召开用户大会,令人十分放松...

    Henry Zhang
  • Prometheus 与容器融合升级,打造容器监控最佳方案~

    谢莹莹 腾讯云监控产品经理,硕士毕业于哈尔滨工业大学。目前主要负责腾讯云 Prometheus 监控服务和 Grafana 可视化服务的产品工作,对 to B ...

    腾讯云监控团队
  • Docker最全教程之使用 Visual Studio Code玩转Docker(二十)

    VS Code是一个年轻的编辑器,但是确实是非常犀利。通过本篇,老司机带你使用VS Code玩转Docker——相信阅读本篇之后,无论是初学者还是老手,都可以非...

    雪雁-心莱科技
  • Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)

    VS Code是一个年轻的编辑器,但是确实是非常犀利。通过本篇,老司机带你使用VS Code玩转Docker——相信阅读本篇之后,无论是初学者还是老手,都可以非...

    心莱科技雪雁
  • 回顾 Kubernetes 最近 6 个版本重点更新

    Kubernetes 项目的首次 commit 发生在 2014 年 6 月 6 日,自 2016 年 3 月 10 日加入 CNCF,到目前为止,Kubern...

    我的小碗汤
  • 一文说清楚Zabbix能做什么?6.0将实现哪些功能?创始人演讲正文

    本文整理自Zabbix创始人Alexei 在2021Zabbix中国峰会关于Zabbix6.0的演讲及3个精彩问答。

    Zabbix
  • 【五一福利】Java程序员编程学习之路资源合集

    七月半夏
  • vSphere 7融合Kubernetes,构建现代化应用的平台

    VMware 最新产品 vSphere 7 正式发布,致力于打造现代化应用平台,备受用户瞩目和期待。本文带你深入了解 vSphere 7 的原生 Kuberne...

    Henry Zhang
  • 用Docker搭建RabbitMq的普通集群和镜像集群

    普通集群:多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构、交换器结构、vhost等。消费...

    用户4268038
  • 浅谈 Kubernetes 在生产环境中的架构

    注意 本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计和实现方案的总结,内容很粗糙,同时也会不断完善。

    DevOps时代
  • Kubernetes生产架构详解

    注意 本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计和实现方案的总结,内容很粗糙,后续会不断完善。

    kubernetes中文社区
  • 再见 MacBook ,是时候用 Docker 愉快的跑一个 macOS 了!

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器...

    iMike
  • 手把手教你搭建 RabbitMQ 集群

    说到集群,小伙伴们可能第一个问题是,如果我有一个 RabbitMQ 集群,那么是不是我的消息集群中的每一个实例都保存一份呢?

    江南一点雨
  • 还在为生产环境中用什么样的 Kubernetes 架构困惑吗,或许看完这篇你的问题就迎刃而解了!

    本文只是笔者针对 Kubernetes 在生产环境运行的一些关于架构设计和实现方案的总结。

    iMike
  • 带你快速搭建Hadoop的HA集群!

    相信在看了上一篇博客《带你快速认识NamenodeHA和Yarn HA,为搭建HadoopHA集群打下基础!》后,大家一定对于如何搭建HA集群非...

    大数据梦想家
  • 保姆级教程!使用k3d实现K3s高可用!

    你是否曾经想尝试使用K3s的高可用模式?但是苦于没有3个“备用节点”,或者没有设置相同数量的虚拟机所需的时间?那么k3d这个方案也许你十分需要噢!

    CNCF

扫码关注腾讯云开发者

领取腾讯云代金券