目录
zabbix 组件监控概述
为了监控很多中间件,以 zabbix-agent 的 cenos-4.0.7 的官方镜像为基础,叠加做一系列修改,用于监控 docker 版的中间件:redis 4.0.9 、Zookeeper 3.4.6、Solr 8.4.1、openresy 1.15.8.1、Mongodb 3.2.22,ActiveMQ 5.10.2、Memcached 1.5.15、tomcat 8.5.51(支持同时监控多个 docker 容器实例)和非 docker 版的中间件:mysql5.6 、oracle11gR2 。
安装 docker-ce
从本地或者其它虚拟机拷贝廖磊制作的 docker-18.09.6
这个安装文件夹到目标机器 root 下(不建议采用原始的 yum 方式安装 docker , 容易在各种不同环境下产生不同的结果),然后运行安装脚本即可。
cd docker-18.09.6
./setup.sh --install
原基础镜像
我们把官方镜像 docker pull zabbix/zabbix-agent:centos-4.0.7
拉到公司的 harbor 仓库,同时取了一个新的 LABEL ,名称为 develop-harbor.geostar.com.cn/3rd/zabbix/zabbix-agent:centos-4.0-latest ,后续我们就是以这个镜像为基础来制作自己的 zabbix-agent 镜像。
新镜像
-
编译镜像:
本人使用 openstack 上的 172.16.101.19 这台机器作为制作镜像的机器(
请各位不要使用这台机器
)把整个 data 文件夹下的内容载并拷贝到用来制作新镜像的机器的 /data 目录下(如果不存在目录请自行新建),作为我们制作镜像的目录
cd /data/zabbix-agent/ ./build.sh
这个shell脚本会停止、
删除
主机上的所有运行的 docker 容器,然后编译我们自己的develop-harbor.geostar.com.cn/3rd/zabbix/zabbix-agent:4.0.7-modify
镜像,请慎重
使用这个脚本。 -
上传镜像
编译通过的镜像经过测试后可以上传到我们的 harbor 镜像仓库存储起来,用于提供给别人使用。
docker login develop-harbor.geostar.com.cn # 登录 harbor ,需要输入用户名/密码 docker push develop-harbor.geostar.com.cn/3rd/zabbix/zabbix-agent:4.0.7-modify # 推送镜像 docker logout develop-harbor.geostar.com.cn # 登出 harbor
-
启动容器镜像:
docker run --name zabbix-agent -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock --restart always -e ZBX_HOSTNAME="172.16.101.19_test123" -e ZBX_SERVER_HOST="172.16.102.253" -e ZBX_AGENT_HOST="1.2.3.4" -e SOLR_PORT="2222" -e ORACLE_PORT="1234" -e ORACLE_INSTANCE_NAME="myinstance" -p 10050:10050 -d develop-harbor.geostar.com.cn/3rd/zabbix/zabbix-agent:4.0.7-modify
参数说明:
ZBX_HOSTNAME
是 zabbix-server 界面添加的主机名,必须保持严格一致,ZBX_SERVER_HOST
是 zabbix-server 服务器ip,ZBX_AGENT_HOST
是 agent 所在宿主 ip ,SOLR_PORT
是 solr 的应用端口(如果用默认的端口 8983 则不用传),ORACLE_PORT
是 oralce 实例端口(如果用默认的端口 1521 则不用传),ORACLE_INSTANCE_NAME
是 oralce 实例名称。ps:如果是用 yum 安装的 docker-ce ,那么需要添加 -v /usr/lib64/libltdl.so.7:/usr/lib64/libltdl.so.7 的启动参数。
下面的具体组件监控都需要运行 zabbix-agent 容器来监控
。
zookeeper 服务安装
拉取镜像
docker pull zookeeper:3.4
运行 zookeeper
docker run --name zookeeper --restart always -p 2181:2181 -p 2888:2888 -p 3888:3888 -d zookeeper:3.4
注意:zookeeper 内嵌 jetty 容器,会占用 8080 端口,所以这里不做端口映射,如果需要在同一台机器上监控 tomcat ,且使用 8080 ,注意两者避免端口冲突。
zookeeper 监控
启动我们自制的 zabbix-agent 容器,在 zabbix 主机管理页面关联Template App Zookeeper 模版,修改宏 {$ZOO_IP}
为当前 zookeeper 服务器 ip ,zookeeper 端口号默认为2181,如果当前服务端口已做修改,也需要修改宏 {$ZOO_PORT}
为 zookeeper 服务的端口号
OpenResty 服务安装
拉取镜像
docker pull openresty/openresty:1.15.8.1-4-alpine-fat-nosse42
运行镜像
docker run --name openresty --restart always -p 80:80 -v /root/nginx:/etc/nginx/conf.d -d openresty/openresty:1.15.8.1-4-alpine-fat-nosse42
进入容器
docker exec -it openresty bash
编辑 nginx 配置
vi /etc/nginx/conf.d/default.conf
注:配置文件加入stub_status配置并暴露/basic_status endpoint
location = /basic_status {
stub_status on;
access_log off;
}
配置如下图:
浏览器测试能否取得监控数据: http://ip:port/basic_status
有如上数据返回则配置已经生效
OpenResty 监控
zabbix 主机管理页面关联 Template App Nginx 模版即可获得监控数据
mongodb 服务安装
拉取 mongodb 镜像
docker pull mongo:3.2
运行 mongodb
docker run --name mongo --restart always -p 27017:27017 -d mongo:3.2
mongodb 监控
zabbix 主机管理页面关联 Template MongoDB 模版即可获得监控数据。
redis 服务安装
redis 拉取
docker pull redis:4.0.9
redis 运行
docker run -d --privileged=true -p 6379:6379 -v /root/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis:4.0.9 redis-server /usr/local/etc/redis/redis.conf
注:redis 配置文件预先放入 /root/redis/conf/ 目录下,不然无法正常挂载。
redis 监控
zabbix 主机管理页面关联 Template App Redis 模版即可获得监控数据。
solr 服务安装
solr 镜像拉取
docker pull solr:8.4.1
solr 容器启动
docker run --name solr_demo -d -p 8983:8983 -p 10053:10053 --privileged=true -e ENABLE_REMOTE_JMX_OPTS=true -e RMI_PORT=10053 -e SOLR_OPTS="-Djava.rmi.server.hostname=${solr_server_ip}" solr:8.4.1 solr-demo
${solr_server_ip}
是 solr 主机的 ip,请按照实际替换。这样会从 8983 端口启动 solr,并启动一个 demo 为名字的 core。
solr 监控
注意:solr 的监控使用的是 jmx 的远程连接监控,所以 solr 容器启动的时候需要开启对应的环境变量才能监控到数据!
zabbix 主机管理页面关联 Template App Solr 模版即可获得监控数据。添加主机的时候记住需要添加 jmx 接口,ip 为监控目标主机的ip,端口为 10053 。
这样就能看到普通监控项和发现类型的监控项(根据 solr 的 core 来分类展示)
Mysql5.6 服务安装
卸载 mariadb
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
下载 mysql 的 repo 源
yum install -y wget
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
通过 rpm 安装
rpm -ivh mysql-community-release-el7-5.noarch.rpm
安装 mysql 并授权
yum install -y mysql-server
chown -R mysql:mysql /var/lib/mysql
启动 mysql
service mysqld start
mysql 客户端用 root 用户连接登录 mysql:
mysql -uroot
重置 mysql 密码
use mysql;
update user set password=password('root') where user='root';
flush privileges;
mysql 监控
给 zabbix 用户授权所有 ip 可以访问的权限:
mysql -uroot -proot
GRANT ALL ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'zabbix';
flush privileges;
SELECT User, Host, Password FROM mysql.user; //这一句检测是否授权成功
quit;
zabbix 主机管理页面关联 Template App MySQL 模版即可获得监控数据。
oracle 服务安装
详见丁浩提供的 Oracle_DB_R2 安装手册.pdf
oracle 安装包:
http://172.16.20.10/Oracle/DateBase/11g_R2/11.2.0.4.0/oracleDB-p13390677-112040-linux-x86_64.tar.xz
rsp 文件为:
http://172.16.20.10/Oracle/DateBase/db_install_112040.rsp
已测试在 centos7.6 环境下正常安装对应 openstack 镜像为
centos7.6.1810_base-kvm-50g-none
oracle 监控
查看机器是否能正常启动oracle监听,lsnrctl status
查看oracle监听启动状态
上图中oracle监听就没有正常启动,可以按下面两步修改配置来启动监听,vi /etc/hosts
修改/etc/hosts文件,把 <![HOSTIP]>
修改为这台 oracle 机器的 ip
登录oracle库:
su - oracle # 切换到oracle用户
进入 oracle_home
cd /home/oracle/database/db_home/bin
启动监听
./lsnrctl start
sqlplus /nolog # 不连接任何数据库
conn /as sysdba # 用sysdba登陆
startup 启动实例
select instance_name from v$instance; #查看实例
创建用户,在当前SQL>下执行以下语句:
SQL>CREATE USER ZABBIX IDENTIFIED BY ZABBIX DEFAULT TABLESPACE SYSTEM TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK;
SQL>GRANT ALTER SESSION TO zabbix;
GRANT CREATE SESSION TO zabbix;
GRANT CONNECT TO zabbix;
ALTER USER zabbix DEFAULT ROLE ALL;
GRANT SELECT ON V_$INSTANCE TO zabbix;
GRANT SELECT ON DBA_USERS TO zabbix;
GRANT SELECT ON V_$LOG_HISTORY TO zabbix;
GRANT SELECT ON V_$LOG TO zabbix;
GRANT SELECT ON V_$PARAMETER TO zabbix;
GRANT SELECT ON SYS.DBA_AUDIT_SESSION TO zabbix;
GRANT SELECT ON V_$LOCK TO zabbix;
GRANT SELECT ON DBA_REGISTRY TO zabbix;
GRANT SELECT ON V_$LIBRARYCACHE TO zabbix;
GRANT SELECT ON V_$SYSSTAT TO zabbix;
GRANT SELECT ON V_$PARAMETER TO zabbix;
GRANT SELECT ON V_$LATCH TO zabbix;
GRANT SELECT ON V_$PGASTAT TO zabbix;
GRANT SELECT ON V_$SGASTAT TO zabbix;
GRANT SELECT ON V_$LIBRARYCACHE TO zabbix;
GRANT SELECT ON V_$PROCESS TO zabbix;
GRANT SELECT ON DBA_DATA_FILES TO zabbix;
GRANT SELECT ON DBA_TEMP_FILES TO zabbix;
GRANT SELECT ON DBA_FREE_SPACE TO zabbix;
GRANT SELECT ON V_$SYSTEM_EVENT TO zabbix;
GRANT SELECT ON V_$locked_object TO zabbix;
GRANT SELECT ON dba_objects TO zabbix;
GRANT SELECT ON dba_tablespaces TO zabbix;
GRANT SELECT ON V_$SESSION TO zabbix;
注意:如果是 oracle11g 的数据库版本,还需要执行下面的语句开放 ACL 的访问控制,否则在监控的过程中有部份内容无法正常显示(例于数据库版本,数据库文件大小等),而且 orabbix 的日志显示中也会有错误提示。
SQL> exec dbms_network_acl_admin.create_acl(acl=> 'resolve.xml',description=> 'resolveacl',principal =>'ZABBIX', is_grant => true, privilege =>'resolve');
SQL> exec dbms_network_acl_admin.assign_acl(acl => 'resolve.xml', host =>'*');
SQL> commit;
SQL>exit;
注意:如果是之前 zabbix2.4 升级到 4.0,需要使用新的 orabbix 包,下载地址为:http://172.16.20.10/Zabbix/orabbix/orabbix-20200103.tar.gz
如果启动报 acl 错误:
需要删除原来的 acl 重新 create 一次:
SQL> exec dbms_network_acl_admin.drop_acl ( acl => 'resolve.xml');
SQL> exec dbms_network_acl_admin.create_acl(acl=> 'resolve.xml',description=> 'resolveacl',principal =>'ZABBIX', is_grant => true, privilege =>'resolve');
SQL> exec dbms_network_acl_admin.assign_acl(acl => 'resolve.xml', host =>'*');
SQL> commit;
SQL>exit;
zabbix 主机管理页面关联 Template_Oracle 模版并设置主机名称为 myinstance(与ORACLE_INSTANCE_NAME 这个 zabbix-agent 启动用到的环境变量设置一致)即可获得监控数据。
tomcat 服务安装
拉取 tomcat 镜像
docker pull develop-harbor.geostar.com.cn/base/apache-tomcat:8.5.51-8u231
启动 tomcat 多实例
docker run -p 8088:8080 -p 10057:10057 --name tomcat-test1 -l JMX_MONITOR_UUID=bc47dcd484724fb48fe81bc9f0e3d802 -l JMX_PORT=10057 -d develop-harbor.geostar.com.cn/base/apache-tomcat:8.5.51-8u231
docker run -p 8089:8080 -p 10058:10058 --name tomcat-test2 -l JMX_MONITOR_UUID=bc47dcd484724fb48fe81bc9f0e3d803 -l JMX_PORT=10058 -d develop-harbor.geostar.com.cn/base/apache-tomcat:8.5.51-8u231
注意:这里启动了 2 个 tomcat 容器实例,第一个容器内部 8080 映射到外部为 8088,jmx使用 10057 端口,第一个容器内部 8080 映射到外部为8089,jmx 使用 10058 端口。
进入每个tomcat容器实例内部(以tomcat-test1为例子)
docker exec -it tomcat-test1 bash
配置 jmx 监听
vi /srv/tomcat8/bin/catalina.sh
加入以下配置
CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10057 -Dcom.sun.management.jmxremote.rmi.port=10057 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.16.101.245"
其中-Djava.rmi.server.hostname=配置为当前服务器 ip,请自行修改,
-Dcom.sun.management.jmxremote.port=10057
-Dcom.sun.management.jmxremote.rmi.port=10057
这两个 jmx 的端口需要与容器启动时候用的 jmx 端口保持一致。
退出 tomcat 容器,重启 tomcat 容器
exit
docker restart tomcat-test1
测试 jmx 能否获取到数据,打开 jdk 目录下面的 jconsole 工具,输入 jmx 远程连接 ip 和 jmx 连接端口
点连接后正常连接就证明 jmx 已正常启用
tomcat 监控
zabbix 主机管理页面关联 Templates App Tomcat 模版即可获得多个 tomcat 的 docker 实例的监控数据
监控到的数据
activemq 服务安装
拉取镜像
docker pull develop-harbor.geostar.com.cn/geosmarter/rmohr/activemq:5.10.2
运行 activemq 镜像
docker run --name activemq --restart always -p 61616:61616 -p 8161:8161 -p 10054:10054 -e ACTIVEMQ_RMI_SERVER_HOSTNAME=${activemq_ip} -d develop-harbor.geostar.com.cn/geosmarter/rmohr/activemq:5.10.2
注:对外暴露的 10054 端口为 jmx 端口, ${activemq_ip}
为当前 activemq 服务器 ip
进入 activemq 容器内部修改配置,注意这里要用 root 用户登录进来
docker exec -itu root activemq bash
activemq 容器内安装 vim 编辑器
apt-get update
apt-get install -y vim
进入 activemq 的 bin 目录
cd /opt/apache-activemq-5.10.2/bin
修改 activemq 文件配置
vim activemq
找到 ACTIVEMQ_SUNJMX_START 配置,加入以下配置
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=/opt/apache-activemq-5.10.2/conf/jmx.password"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=/opt/apache-activemq-5.10.2/conf/jmx.access"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Djava.rmi.server.hostname=$ACTIVEMQ_RMI_SERVER_HOSTNAME -Dcom.sun.management.jmxremote.port=10054 -Dcom.sun.management.jmxremote.rmi.port=10054 -Dcom.sun.management.jmxremote.ssl=false "
保存并退出编辑器,修改文件权限
chmod 400 /opt/apache-activemq-5.10.2/conf/jmx.access
chmod 400 /opt/apache-activemq-5.10.2/conf/jmx.password
注:如果要修改 jmx 的权限、账号、密码请修改 /opt/apache-activemq-5.10.2/conf/ 目录下的 jmx.access 和 jmx.password,具体可参考 https://activemq.apache.org/jmx ,这里我们直接采用的默认账号密码
退出 activemq 容器,重启 activemq 容器
exit
docker restart activemq
测试 jmx 能否获取到数据,打开 jdk 目录下面的 jconsole,输入 jmx 远程连接 ip 和端口,activemq 配置了 jmx 账号和密码,需要输入默认的账号密码 admin/activemq,jmx 的端口约定为 10054
点连接后正常连接就证明 jmx 已正常启用
activemq 监控
zabbix 主机管理页面关联 Template JMX ActiveMQ 模版并设置 JMX 端口为 10054 宏{$JMX_USERNAME}
= admin,宏{$JMX_PASSWORD}
= activemq即可获得监控数据
memcached 服务安装
拉取 memcached
docker pull develop-harbor.geostar.com.cn/geosmarter/memcached:1.5.15
运行 memcached
docker run --name memcached --restart always -p 11211:11211 -d develop-harbor.geostar.com.cn/geosmarter/memcached:1.5.15
memcached 监控
在 zabbix 主机管理页面关联 Template App memcached 模版,并且设置宏 {$MEMCACHED_SERVER}
=当前 memcached ip 地址,宏 {$MEMCACHED_PORT}
= 11211,即可获得监控数据