Zabbix深入解析与实战

news2024/11/27 0:43:14

1.Zabbix

1.1.监控概述

监控是指对行为、活动或其他变动中信息的一种持续性关注,通常是为了对人达成影响、管理、指导或保护的目的

  • 监控

    • 监视主机架构状态
    • 控制,事后追责
    • 目标:早发现早处理(故障、性能、架构) 网站扩容(用数据说话)

为什么要监控

  • 对系统不间断实时监控
  • 实时反馈系统当前状态
  • 保证业务持续性运行

监控流程

  1. 数据采集

  2. 数据存储

  3. 数据分析

  4. 展示/告警

监控的内容

image-20230505142647440

image-20230505145055781

1.2.Linux有关性能的指令

image-20230509093215338

1.3.企业面试题:公司监控如何做

  • 等同于:你们公司监控了什么?

  • 单台机器

    • 业务信息:应用、程序代码是否有问题(需要与开发沟通,书写一个页面)
    • 服务信息:各种服务的进程、端口、状态、特定的信息(不同服务)
    • 系统信息:cpu、内存(swap,buffer/cache)、磁盘(io,使用率,inode)、负载、网络…
    • 硬件信息:磁盘、raid状态、温度、风扇转速
  • 网站集群监控(用户访问流程)

    • DNS解析与CDN 通过全局访问测试工具(模仿用户在全国(全球)各地访问网站)

      • 在全国各地核心城市部署一台服务器,访问源站/cdn/dns(smokeping)
      • 免费:17ce.com
      • 商业版:听云、监控宝
    • TCP三次握手-网站负载均衡监控 ss-ant

    • HTTP请求报文-监控web日志查看(状态码) 补充:加上HTTPS监控过期

    • 请求经过网站架构

      • 负载均衡(Nginx)
      • web服务器(php,tomcat…)
      • 缓存
      • 数据库
      • 存储
    • TCP四次挥手-网站负载均衡监控

    • 断开连接

1.2.概述

Zabbix 由 Alexei Vladishev 创建,目前由 Zabbix SIA 主导开发和支持。

Zabbix 是一个企业级的开源分布式监控解决方案。

Zabbix 是一款监控网络的众多参数以及服务器虚拟机应用程序服务数据库网站等的健康和完整性的软件。Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,以实现对服务器问题做出快速反应。Zabbix 基于存储的数据提供出色的报告和数据可视化功能。这使得 Zabbix 成为容量规划的理想选择。

Zabbix 支持轮询和 trapping。所有 Zabbix 报告和统计数据以及配置参数都可以通过基于 Web 的前端访问。基于 Web 的前端确保可以从任何位置评估您的网络状态和服务器的健康状况。如果配置得当,不管对于拥有少量服务器的小型组织还是拥有大量服务器的大公司来讲,Zabbix 都可以在监控 IT 基础设施方面发挥重要作用。

Linux相关指标命令

image-20230506103508282

Zabbix功能有如下:

数据收集

  • 可用性和性能检查
  • 支持 SNMP(trapping 和 polling)、IPMI、JMX、VMware监控
  • 自定义检查
  • 以自定义间隔收集所需数据
  • 由 server/proxy 和 agents 执行

灵活的阈值定义

  • 可以定义非常灵活的问题阈值,称为触发器,从后端数据库引用值

高度可配置的告警

  • 可以针对升级计划、收件人、媒体类型自定义发送通知
  • 使用宏可以使通知变得有意义和有用
  • 自动化操作包括执行远程命令

实时图形

  • 采集到的监控项值可以使用内置的绘图功能立即绘图

网络监控功能

  • Zabbix 可以跟踪网站上的模拟鼠标点击路径并检查功能和响应时间

广泛的可视化选项

  • 创建自定义图形的能力,可以将多个监控项组合成一个聚合图形
  • 网络拓扑图
  • 在仪表盘中显示幻灯片
  • 报表
  • 受监控资源的高级(业务)视图

历史数据存储

  • 存储在数据库中的数据
  • 可配置的历史(保留趋势)
  • 内置管家程序

建议的配置

  • 将受监控的设备添加为主机
  • 一旦主机被数据库添加,就会开始进行数据采集
  • 将模板应用于受监控的设备

模板的使用

  • 在模板中分组检查
  • 模板可以继承其他模板

网络发现

  • 网络设备自动发现
  • agent 自动注册
  • 发现文件系统、网络接口和 SNMP OID

便捷的 web 界面

  • 基于web的PHP前端
  • 可从任何地方访问
  • 可以通过你的方式点击(到任何页面)
  • 审计日志

Zabbix API

  • Zabbix API 为 Zabbix 提供可编程接口,用于大规模操作、第 3 方软件集成和其他用途。

权限系统

  • 安全用户认证
  • 某些用户可以被限制仅访问某些视图

全功能且易于扩展的 agent

  • 部署在被监控目标上
  • Linux 和 Windows 操作系统都适用于

二进制守护进程

  • 用 C 编写,用于提高性能和减少内存占用
  • 轻量级、便携

为复杂环境做好准备

  • 使用 Zabbix proxy 轻松实现远程监控

1.3.Zabbix架构

Server

Zabbix server 是 agents 向其报告可用性和完整性信息和统计信息的中心组件。server 是存储所有配置、统计和操作数据的中央存储库。

数据存储

Zabbix 收集的所有配置信息以及数据都存储在数据库中。

Web 界面

为了从任何地方和任何平台轻松访问,Zabbix 提供了基于 Web 的界面。该接口是 Zabbix server 的一部分,通常(但不一定)与 server 运行在同一台设备上。

Proxy

Zabbix proxy 可以代替 Zabbix server 收集性能和可用性数据。proxy 是 Zabbix 部署的可选部分;但是对于分散单个 Zabbix server 的负载非常有用。

Agent

Zabbix agent 部署在被监控目标上,以主动监控本地资源和应用程序,并将收集到的数据报告给 Zabbix server。从 Zabbix 4.4 开始,有两种类型的 agent 可用:Zabbix agent (轻量级,在许多平台上支持,用 C 编写)和 Zabbix agent 2 (非常灵活,易于使用插件扩展,用 Go 编写)。

2.使用Zabbix

2.1.配置要求

NamePlatformCPU/MemoryDatabaseMonitored hosts
SmallCentOSVirtual ApplianceMySQL InnoDB100
MediumCentOS2 CPU cores/2GBMySQL InnoDB500
LargeRedHat Enterprise Linux4 CPU cores/8GBRAID10 MySQL InnoDB or PostgreSQL>1000
Very largeRedHat Enterprise Linux8 CPU cores/16GBFast RAID10 MySQL InnoDB or PostgreSQL>10000

下表包含可用于计算 Zabbix 系统所需磁盘空间的公式:

参数 所磁盘空间的计算公式 (单位:字节)
Zabbix 配置文件 固定大。通常为 10MB 或更少。
History(历史数据)days*(items/refresh rate)243600*bytes items:监控项数量。 days:保留历史数据的天数。 refresh rate:监控项的更新间隔。 bytes:保留单个值所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
Trends(趋势数据)days*(items/3600)243600*bytes items:监控项数量。 days:保留历史数据的天数。 bytes:保留单个趋势数据所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
Events(事件数据)daysevents243600bytes events:每秒产生的事件数量。假设最糟糕的情况下,每秒产生 1 个事件。 days:保留历史数据的天数。 bytes:保留单个趋势数据所需的字节数,取决于数据库引擎,通常为 ~170 字节。

2.2.Zabbix安装

  • 使用yum和自定义配置安装

    • lnmp+zabbix-server(yum)
    • zabbix-web(源码包)
  • nginx和php环境

# yum配置
cur1 -o /etc /yum.repos.d/Centos-Base.repo http://mirrors.aliyun.com/repo/centos-7.repo
yum insta11 epe1-release.noarch -y
cur1 -o/etc/yum.pos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm


# 安装nginx先要安装epel源,或者使用nginx官方源
# 使用nginx 1.20 php7.2
yum insta11 nginx php72w-cli php72w-fpm php72w-gd php72w-mbstring php72w-bcmath php72w-xm1 php72w-ldap php72w-mysq1nd -y


# 开启服务并设置自启
[root@cloud ~]# systemctl enable nginx php-fpm.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
[root@cloud ~]# systemctl start nginx php-fpm.service 


# nginx配置
[root@cloud ~]# cat /etc/nginx/conf.d/zabbix.conf 
server {
        listen 80;
        server_name zabbix.test;
        root /code/zabbix;
        location / {
                index index.php;
        }
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}

# 配置php
# 修改组和用户
[root@cloud ~]# cat /etc/php-fpm.d/www.conf
[www]
user = nginx
group = nginx

# 准备会话保持目录
[root@cloud ~]# grep /var/lib/php/session /etc/php-fpm.d/www.conf 
php_value[session.save_path]    = /var/lib/php/session
[root@cloud ~]# mkdir -p /var/lib/php/session
[root@cloud ~]# chown nginx.nginx /var/lib/php/session
[root@cloud ~]# php-fpm -t
[13-May-2023 17:56:35] NOTICE: configuration file /etc/php-fpm.conf test is successful
[root@cloud ~]# systemctl reload php-fpm.service 


# 测试
[root@cloud ~]# mkdir -p /code/zabbix
[root@cloud ~]# chown nginx.nginx /code/zabbix
[root@cloud ~]# vim /code/zabbix/index.php
[root@cloud ~]# cat /code/zabbix/index.php
<?php
phpinfo();
?>
[root@cloud ~]# curl zabbix.test
  • 数据库配置
# 安装数据库
yum install -y mariadb-server

# 进行一些安全性设置
[root@cloud ~]# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!


# 创建所需库和用户
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;  # 授予所有权限
mysql> set global log_bin_trust_function_creators = 1;  # 允许在启用二进制日志时创建存储函数,而无需有SUPER权限
  • Zabbix服务端
# 配置yum
rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm?spm=a2c6h.25603864.0.0.251e2e2fnsDdRT
# 修改yum
baseurl=https://mirrors.aliyun.com/zabbix/zabbix//5.0/rhel/7/$basearch/

# 安装zabbix
yum install -y zabbix-server zabbix-agent2

# 导入数据
zcat /usr/share/doc/zabbix-server-mysql-5.0.34/create.sql.gz
|mysql -uzabbix -proot zabbix   # 解压缩 create.sql.gz 文件并将其内容输出到标准输出

# 配置zabbix数据库服务
grep ^DB /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=root

# zabbix默认开启功能
LogFile=/var/log/zabbix/zabbix_server.log # 日志文件位置
LogFileSize=0 # 日志文件大小,0不限制大小
PidFile=/var/run/zabbix/zabbix_server.pid # 进程 ID 文件位置
SocketDir=/var/run/zabbix # 套接字目录
DBHost=localhost 
DBName=zabbix
DBUser=zabbix
DBPassword=root
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log # SNMP Trapper 文件位置
Timeout=4 # 超时时间
AlertScriptsPath=/usr/lib/zabbix/alertscripts # 警告脚本路径
ExternalScripts=/usr/lib/zabbix/externalscripts # 外部脚本路径
LogSlowQueries=3000 # 记录慢查询的阈值
StatsAllowedIP=127.0.0.1 # 允许访问统计数据信息的IP地址

# 开启服务(默认10051端口)
systemctl start zabbix-server
  • zabbix前端页面
# 使用源码包
# 去官网下载源码包
[root@cloud nfs] tar xf zabbix-5.0.34.tar.gz 
[root@cloud zabbix-5.0.34]# mv ui/* /code/zabbix/
[root@cloud zabbix-5.0.34]# chown -R named:named /code/zabbix/
  • 安装zabbix(zabbix前端页面连接数据库与zabbix-server)
# 需要在/etc/php.ini中修改的配置
Minimum required size of PHP post is 16M (configuration option "post_max_size").
Minimum required limit on execution time of PHP scripts is 300 (configuration option "max_execution_time").
Minimum required limit on input parse time for PHP scripts is 300 (configuration option "max_input_time").
Time zone for PHP is not set (configuration parameter "date.timezone").
date.timezone = Asia/Shanghai

当你其他配置都完成后,出现这个页面就是成功了!并且配置项都可以去conf/zabbix.conf.php文件修改

image-20230514154501340

完成之后就可以登录zabbix了,默认用户名是Admin,密码是zabbix,登录后可以自己修改密码

2.3.监控主机

  • 安装zabbix-agent2
yum install -y zabbix-server zabbix-agent2
zabbix agentzabbix agent2
开发语言CGo和C
性能独立进程方式运行1个进程多线程运行,减少资源消耗占用较少tcp资源,能够承受更高并发
  • 监控流程
    1. 在客户端安装zabbix-agent2
    2. 修改配置文件 指定Server为zabbix服务端
    3. web页面配置 ----> 主机中添加主机
    4. 添加后检测
# 修改配置文件
[root@cloud code]# grep "Server" /etc/zabbix/zabbix_agent2.conf 
### Option: Server
#       Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
# Server=
Server=127.0.0.1


# agent配置
PidFile=/var/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=127.0.0.1
ServerActive=127.0.0.1    #  客户端主动模式的服务端ip地址
Hostname=Zabbix server    # 客户端主机名
Include=/etc/zabbix/zabbix_agent2.d/*.conf
ControlSocket=/tmp/agent.sock  # 指定了SSH代理的控制套接字的位置

# 启动agent
[root@cloud code]# systemctl start zabbix-agent2.service 

# 检测客户端服务端是否连通
# 安装zabbix_get命令
yum install -y zabbix-get
# 在服务端执行,如果有值则代表能获取数据
zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]"

2.4.自定义监控

以下监控项类型由Zabbix提供:

  • Zabbix agent 检查

  • SNMP agent 检查

  • SNMP traps

  • IPMI 检查

  • 简单检查

    • VMware 监控
  • 日志文件监控

  • 可计算监控项

    • 聚合计算
  • Zabbix 内部检查

  • SSH 检查

  • Telnet 检查

  • 外部检查

  • 采集器监控项

  • JMX 监控

  • ODBC 检查

  • 相关监控项

  • HTTP 检查

  • Prometheus 检查

  • 脚本监控

  • 概述

    • 定制化,监控我们所要的内容
    • 提升性能,提升zabbix性能,去掉不需要的监控项
    • zabbix自定义监控:只要能够通过命令取出来的内容,就可以做自定义监控
  • 应用场景:

    • 定制:默认的模板中没有我们要的监控项
    • 提升zabbix性能/优化:去掉/定制监控项,提升zabbix服务端的性能
  • 自定义监控流程

    • Zabbix客户端,**创建key(键值)**与调试
      • 书写监控命令/脚本
      • 调试Debug命令与脚本
      • 写入到zabbix客户端配置文件中UserParameter=key,command或脚本与调试zabbix_get
    • zabbix服务端web页面
      • 查看Web页面是否可以获取数据
      • 设置Web触发器trigger-什么时候报警
# 检查80端口是否占用
# 1.创建键值:相当于一个zabbix服务端能识别的命令,来获取zabbix客户端状态
# 内置键值key:zabbix_agent2 -p
# 自定义键值最好写在/etc/zabbix/zabbix_agent2.d/
UserParameter=nginx.alive,ss -tunlp|grep -wc 80
[root@cloud ~]# zabbix_get -s 127.0.0.1 -p 10050 -k nginx.alived
2

# 使用带参数形式
nginx.alive[*],sh nginx_stat.sh "$1" "$2"
nginx.alive[active,80],sh nginx_stat.sh "$1" "$2"
# web页面不支持参数形式,得一个个写


#Key名本身具有有限的允许字符范围,允许的字符是:0-9a-zA-Z_-.
  • 新建监控项

image-20230514222723660

  • 历史数据(history)保留时长:每个更新间隔获取到的数据,推荐设置为30d
  • 趋势数据(trend)保留时长:记录数据变化的趋势,推荐设置

1.监控项类型

image-20230515112301799

2.5.自定义触发器

  • 触发器:trigger 什么时候进行告警

  • 本质使用监控项获取的数据,与我们设置的条件进行比较,从而触发警报

  • 触发器表达式功能

image-20230515103049178

  • 触发器表达式格式
# {主机名:监控项.使用函数}判断条件
{Zabbix server:nginx.alive.last()}=0

image-20230515103547465

2.6.自定义监控故障案例

1.权限

  • 原因:zabbix客户端运行的时候zabbix用户,获取数据可能导致权限故障permission denied
  • 解决:授权sudo
zabbix_get -s 127.0.0.1 -p 10050 -k vfs.file.contents[/etc/shadow]
ZBX_NOTSUPPORTED: Cannot open file /etc/shadow: open /etc/shadow: permission denied

[root@cloud ~]# visudo
zabbix ALL=(ALL) NOPASSWD: ALL

# 很难解决源key的权限问题,但是可以自定义key解决
UserParameter=conf.shadow,sudo wc -l /etc/shadow

2.脚本执行时间

  • zabbix默认限制命令或脚本执行时间不能超过30s
  • 修改服务端和客户端Timeout选项

3.awk取列

  • 自定义监控的时候推荐使用脚本,尤其是awk
  • awk取列的时候容器出现故障 2 推荐使用 2 推荐使用 2推荐使用$2

2.7.创建模板

  1. 创建模板
  2. 创建应用集(监控项分类)
  3. 创建自定义监控项
  4. 创建触发器
  5. 创建图像
  6. 模板可以与多个机器关联,避免web页面重复操作

image-20230516091140388

创建模板成功后,就可以正常添加监控项,触发器等,监控项、触发器、图形都可以直接从其他主机上复制到模板中

image-20230516092516922

  • 主要事项
    • 先找一个主机配置监控项等,进行测试
    • 然后再进行创建模板

2.8.告警方案

  • 前端消息告警
    • 开启功能并保证前端页面开启,有报警提示时,会发出声音(不推荐)

image-20230516092955148

1.告警分类

image-20230516093412852

2.邮件报警

  1. 个人/企业邮箱
  2. 开启个人邮箱smtp功能,获取授权码
  3. 发件人:配置zabbix报警媒介类型
  4. 收件人:配置用户接收报警
  5. 配置动作
  • 配置报警媒介参数

image-20230516102827073

image-20230516104907452

image-20230516103307922

image-2023 0516103415265

  • 收件人配置
    • 对所有人员分组。权限一般以组设置
    • 创建用户时设置报警媒介

image-20230516105320128

  • 配置动作

image-20230516212500172

image-20230516212521858

3.脚本报警

image-20230516214952667

2.9.zabbix客户端

zabbix客户端
zabbix-agent2(最常用)适用于几乎所有情况,linux,Windows
SNMPSimple Network Management Protocal 简单网络管理协议 监控网络设备
JMXJava-gateway,监控java app(tomcat)。未来建议自定义监控(zabbix_agent2 + jmap/jstats)
IPMI监控硬件(物理服务器),直接使用自定义监控(ipmitool+megacli)

1.snmp监控

  • 应用:

    • 监控网络设备
    • 也支持监控可以启动SNMP设备(Linux,Windows,打印机…)
  • 使用snmp

    1. 启动设备的SNMP功能
    2. zabbix服务端进行测试,能否获取到网络设备的信息
    3. web添加主机监控项
# 1.安装snmp服务端
yum install net-snmp -y

# 2.配置snmp服务端
vim /etc/snmp/snmpd.conf
# 修改community为oldboy
com2sec notConfigUser default oldboy
# 增加一行
view systemview included

# 安装snmp命令
yum install net-snmp-utils -y
# 使用命令
snmpwalk -c oldbox -v 2c 192.168.13.1 sysUptime
-c oldbox:指定community字符串为“oldbox”。
-v 2c:指定SNMP协议版本为SNMPv2c。
192.168.13.1:指定要查询的设备的IP地址。
sysUptime:指定要查询的OID(对象标识符)。

image-20230519112826774

2.JMX监控

image-20230519121037713

  1. 安装java程序,并开启远程监控功能
  2. 安装zabbix-java-gateway服务端
  3. 配置web主机

image-20230519115858298

这个配置只能写成一行

image-20230519120719007

image-20230519121129545

  • 获取数据

    # 
    java -jar cmdline-jmxclient-0.10.3.jar - 10.0.0.7:12345
    
  • 添加主机

image-20230519121744845

image-20230519121827292

2.10.自动化监控

  • 自动发现:服务端主动
  • 自动注册:客户端主动
  • zabbix客户端主动与被动模式
  • zabbix分布式监控

1.自动发现和自动注册

共同点区别
自动发现自动添加主机并关联模板,启动主机1.客户端被动
2.使用简单
3.效率或性能较低
4.对zabbix服务端压力较大
自动注册自动添加主机并管理模板,启动主机1.客户端主动
2.配置繁琐一点
3.对zabbix服务端压力较低
4.高并发注册机器
  • 自动发现

    • 配置自动发现规则 - 发现主机

    image-20230519215442063

    image-20230519215628552

    • 配置自动发现动作 - 发现主机后关联模板等动作

    image-20230519220222942

image-20230519220314601

  • 自动注册(可与ansible结合使用)

    • 修改zabbix客户端配置文件:ServeActive=服务端ip 和Hostname=…

    image-20230520103911431

    • web页面,动作---->自动注册 autoreg

image-20230520104534739

2.zabbix-agent(取值)主动与被动

zabbix-agent主动:主动向zabbix-server汇报,52个监控,请求1次,服务端收集到所有的数据

zabbix-agent被动:等待zabbix-server索要,52个监控,请求52次,效率低,对zabbix服务压力大

image-20230520111333335

image-20230520111303279

2.11.分布式监控

  • 应用场景:有多个机房/网段/地域进行监控,分布式监控(proxy代理监控)

image-20230520111508279

  • 安装zabbix-proxy-mysql
yum install -y https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-proxy-mysql-5.0.0-1.el7.x86_64.rpm
  • 导入zabbix表结构
[root@test ~]# zcat /usr/share/doc/zabbix-proxy-mysql-5.0.0/schema.sql.gz | mysql -uzabbix -pzabbix zabbix
  • 配置zabbix-proxy
[root@test ~]# grep '^[a-Z]' /etc/zabbix/zabbix_proxy.conf
Server=192.168.19.136
ServerPort=10051
Hostname=Zabbix proxy        # 代理名字,确保服务端知道代理名称,也可使用HostnameItem
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=zabbix
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
  • 配置web代理

image-20230520114550472

  • 修改客户端指向

image-20230520115221171

image-20230520115201131

2.12.lld

低级自动发现可以自动为主机上的不同实体创建监控项、触发器和图表。比如, Zabbix可以自动监控文件系统和网络接口,并且不需要为其手工创建监控项。另外,可以基于周期性自动发现的结果来删除无用的监控实体。

  • 应用场景

    • 低级自动发现特别适合用于监控那些有规律,又有差异的监控对象
  • 系统内置的自动发现

    如果想立刻上手熟悉其它类型的自动发现,更多信息和如何实现(how-to)方面可参阅以下章节:

    • 网络接口的自动发现;
    • CPU 和 CPU 核心的自动发现;
    • SNMP OID的自动发现;
    • JMX 对象的自动发现;
    • 使用ODBC SQL 查询的自动发现;
    • Windows 服务的自动发现;
    • Zabbix 主机接口的自动发现。
  • 自动发现/自动注册----自动添加主机

  • 希望zabbix自动添加监控项:自动监控一些有关联的内容:网卡、磁盘、磁盘分区…低级自动发现(Low Level Discovery)

  • 系统模板自带的自动发现规则

image-20230520133744442

  • 系统内置自动发现键值

image-20230520133756225

[root@test zabbix]# zabbix_get -s 192.168.19.137 -p 10050 -k "net.if.discovery"
[{"{#IFNAME}":"lo"},{"{#IFNAME}":"virbr0-nic"},{"{#IFNAME}":"virbr0"},{"{#IFNAME}":"ens33"}]
# zabbix内置宏 {HOST.NAME}
# zabbix 用户定义宏 {$OLDBOY}
# zabbix低级自动发现专用宏 {#IFNAME}
  • 根据网卡名字创建对应的监控项原型:net.if.in[“{#IFNAME}”]-----> net.if.in[eth0] 然后 net.if.in[eth1]

image-20230521131256835

image-20230521132220196

1.案例:统计网卡总流量

  1. 监控项原型
  2. 流量过大 告警(触发器模型)
  3. 流量图形展示
[root@cloud ~]# zabbix_get -s 127.0.0.1 -p 10050 -k net.if.discovery|jq
[
  {
    "{#IFNAME}": "br-422bc8cc20df"
  },
  {
    "{#IFNAME}": "br-10d894dab180"
  },
  {
    "{#IFNAME}": "lo"
  },
  {
    "{#IFNAME}": "virbr0-nic"
  },
  {
    "{#IFNAME}": "virbr0"
  },
  {
    "{#IFNAME}": "ens33"
  },
  {
    "{#IFNAME}": "br-4871ddbe0355"
  },
  {
    "{#IFNAME}": "docker0"
  }
]
[root@cloud ~]# zabbix_get -s 127.0.0.1 -p 10050 -k net.if.total[ens33]
554386852

image-20230521144407310

  • 设置触发器原型

image-20230521151852864

  • 设置图形

image-20230521152949653

2.从零开始lld

  1. 获取你要的内容,磁盘分区的名字,网卡名字
  2. 根据自动发现内容,创建自动发现规则
  3. 创建监控项原型
  4. 创建触发器原型
  5. 创建图形原型
# 官方要求书写格式
# LLD宏的名称允许使用的符号有 0-9 ,A-Z , _ , .
[
    { "{#FSNAME}":"/",                           "{#FSTYPE}":"rootfs"   },
    { "{#FSNAME}":"/sys",                        "{#FSTYPE}":"sysfs"    },
    { "{#FSNAME}":"/proc",                       "{#FSTYPE}":"proc"     },
    { "{#FSNAME}":"/dev",                        "{#FSTYPE}":"devtmpfs" },
    { "{#FSNAME}":"/dev/pts",                    "{#FSTYPE}":"devpts"   },
    { "{#FSNAME}":"/lib/init/rw",                "{#FSTYPE}":"tmpfs"    },
    { "{#FSNAME}":"/dev/shm",                    "{#FSTYPE}":"tmpfs"    },
    { "{#FSNAME}":"/home",                       "{#FSTYPE}":"ext3"     },
    { "{#FSNAME}":"/tmp",                        "{#FSTYPE}":"ext3"     },
    { "{#FSNAME}":"/usr",                        "{#FSTYPE}":"ext3"     },
    { "{#FSNAME}":"/var",                        "{#FSTYPE}":"ext3"     },
    { "{#FSNAME}":"/sys/fs/fuse/connections",    "{#FSTYPE}":"fusectl"  }
]

# 书写脚本 生成格式 ==== net.if.discovery
# 1. 拿取所需端口
# 2. 输出格式
#!/bin/bash
#desc: auto discovery server port

port_list=(`netstat -tunlp|grep zabbix|awk -F'[ :]+' '$4~/^[0-9]+$/{print $4}'`)

echo '['
for port in ${port_list[*]};do
        let i++
        if [ $i -eq ${#port_list[*]} ];then
                echo -e "\t{ \"{#PORT}\":\""$port"\"}"
        else
                echo -e "\t{ \"{#PORT}\":\""$port"\"},"
        fi
done

echo ']'

# 书写配置文件
UserParameter=net.port.discovery,sh /server/scripts/net.port.sh

# 测试
[root@cloud scripts]# zabbix_get -s 127.0.0.1 -p 10050 -k net.port.discovery
[
        { "{#PORT}":"10050"},
        { "{#PORT}":"10051"}
]

  • 创建发现规则

image-20230521163504410

2.13.web场景

image-20230525160907892

image-20230525161008257

2.14.Zabbix api

  • application interface 程序接口
  • 针对zabbix进行二次开发,公司,运维管理平台 CMDB(存储与管理企业IT架构中设备的各种配置信息)(把zabbix集成成自己的运维平台)
  • zabbix api主要的接口功能:通过api接口可以代替web页面操作。增删改查
  • api接口应用场景:人脸识别,短信验证,身份证验证…
  • 使用与调用:
    • **自己写程序调用:**直接通过程序代码进行调用,需要参考对方的api接口文档
    • **官方写好的,可以直接使用(SDK一般指软件开发工具包):**通过SDK样例快速调用和使用即可
  • api接口使用流程
    • 根据zabbix用户名和密码,获取token
    • 使用token访问或调取zabbix资源
    • 官方API文档
当完成了前端的安装配置后,你就可以使用远程HTTP请求来调用API。为此,需要向位于前端目录中的 api_jsonrpc.php 文件发送 HTTP POST 请求。例如,如果你的 Zabbix 前端安装在 http://example.com/zabbix, 那么用HTTP请求来调用 apiinfo.version 方法就如下面这样:

POST http://example.com/zabbix/api_jsonrpc.php HTTP/1.1 
Content-Type: application/json-rpc 
 
{ 
 · "jsonrpc": "2.0", 
 · "method": "apiinfo.version", 
 · "id": 1, 
 · "auth": null, 
 · "params": {} 
} 
请求的 Content-Type 头部必须设置为以下值之一:application/json-rpc,application/json 或 application/jsonrequest。

# 使用curl进行请求
# postman
curl 
-X 修改请求方法
-H 修改请求信息
-d --data 上传的内容
-v 请求详细

# 获取token
在访问 Zabbix 中的任何数据之前,你需要登录并获取身份认证 token。这可以使用 user.login 方法完成。我们假设你想要以标准 Zabbix Admin 用户身份登录。那么,你的 JSON 请求将如下所示:

{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin",
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}
让我们仔细看看示例请求对象。它具有以下属性:

jsonrpc - API 使用的 JSON-RPC 协议的版本; Zabbix API 实现的 JSON-RPC 版本是2.0;
method - 被调用的 API 方法;
params - 将被传递给API方法的参数;
id - 请求的任意标识符;
auth - 用户认证 token;因为我们还没有,它被设置为 null。
如果你正确提供了凭据,API 返回的响应将包含用户身份认证 token:

{
    "jsonrpc": "2.0",
    "result": "0424bd59b807674191e7d77572075f33",
    "id": 1
}
响应对象包含以下属性:

jsonrpc - JSON-RPC 协议的版本;
result - 方法返回的数据;
id - 对应请求的标识符。

# 使用
[root@cloud scripts]# curl -X POST -H "Content-Type: application/json-rpc" -d '
> {
>     "jsonrpc": "2.0",
>     "method": "user.login",
>     "params": {
>         "user": "Admin",
>         "password": "zabbix"
>     },
>     "id": 1,
>     "auth": null
> }' http://127.0.0.1/api_jsonrpc.php
{"jsonrpc":"2.0","result":"798fdaa158f48e89ad412304009265d0","id":1}

# 可以使用jq命令去json格式数据
cat token.txt|jq ".result, .id"
.result[] #进入下一层

我们现在有一个有效的用户身份认证 token,可以用来访问 Zabbix 中的数据。例如,我们使用 host.get 方法检索所有已配置 主机 的ID,主机名和接口 :

{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": [
            "hostid",
            "host"
        ],
        "selectInterfaces": [
            "interfaceid",
            "ip"
        ]
    },
    "id": 2,
    "auth": "0424bd59b807674191e7d77572075f33"
}
请注意 auth属性现在设置为我们通过调用 user.login 方法获得的身份认证 token。
响应对象将包含有关主机的请求数据:

{
    "jsonrpc": "2.0",
    "result": [
        {
            "hostid": "10084",
            "host": "Zabbix server",
            "interfaces": [
                {
                    "interfaceid": "1",
                    "ip": "127.0.0.1"
                }
            ]
        }
    ],
    "id": 2
}

3.zabbix性能优化

  • 网站架构调整:尽量让用户的请求往前推(用户请求不要到达网站走cdn,使用缓存,消息队列)

  • 根据业务类型调整:读少写多

    • zabbix是一个写多读少的业务,优化数据库的写入性能,建议使用InnoDB或tokudb存储引擎
    • 数据库分离或数据库拆分
  • zabbix键值与监控项处理

    • 增加取值的时间
    • 使用自定义模板,控制功能全面监控,监控项少 精简监控项
    • 历史数据保留时长减少,设置为30d或7d,增加趋势存储时间365d
  • zabbix触发器

    • 尽量使用last()/diff()/nodata()
    • 避免使用需要计算max()/min()/avg()
    • 整体目标:不要让zabbix服务端进行计算/数据库进行计数,需要计算的内容放在客户端(自定义监控项)
  • zabbix服务端

    • 增加zabbix进程数量,那种进程占用大量资源,增加数量 Start…
    • 增加zabbix缓存大小,缓存各种从客户端获取数据 Cache
  • zabbix客户端

    • 使用主动模式 ServerActive
  • zabbix参数配置:缓存和进程数量

    • xxxxcache:用于zabbix服务端缓存获取的各类数据(历史数据,趋势数据)

    • poller:zabbix用于接收各类数据的进程数量

CacheSize 否 128K-64G 8M 缓存大小, 单位为字节。
用于存储主机、监控项、触发器数据的共享内存大小。

CacheUpdateFrequency 否 1-3600 60 Zabbix执行配置缓存更新的频率,以秒为单位。

HistoryCacheSize 否 128K-2G 16M 历史缓存的大小,以字节为单位。
用于存储历史数据的共享内存大小。

HistoryIndexCacheSize 否 128K-2G 4M 历史索引缓存的大小,以字节为单位。
用于索引存储在历史缓存中的历史数据的共享内存大小。
索引缓存一个监控项大约需要 100 字节。
自 Zabbix 3.0.0 版本起开始支持此参数。

TrendCacheSize 否 128K-2G 4M 趋势缓存的大小,以字节为单位。
用于存储趋势数据的共享内存大小。

ValueCacheSize 否 0,128K-64G 8M 历史值缓存的大小,以字节为单位。
用于缓存监控项历史数据请求的共享内存大小。
设置为 0 将禁用缓存(不推荐)。
当值缓存耗尽共享内存时,每 5 分钟会向服务器日志写入一条告警消息。

StartPollers 否 0-1000 5 轮询进程的初始实例数量,必须非0

StartPollersUnreachable 否 0-1000 1 不可达主机轮询器 (包括 IPMI 和 Java)1 的 pre-forked(预分配)实例数量。
如果启动了常规、IPMI 或 Java轮询器,则必须至少运行一个无法访问主机的轮询器。

StartIPMIPollers 否 0-1000 0 IPMI 轮询器的 pre-forked(预分配)实例数量

StartJavaPollers 否 0-1000 0 Java 轮询器1 的 pre-forked(预分配)实例数量

StartHTTPPollers 否 0-1000 1 HTTP 轮询器1 的 pre-forked(预分配)实例数量

StartProxyPollers 否 0-250 1 passive proxies 被动代理轮询器1 的 pre-forked(预分配)实例数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.zabbix与其他

  • zabbix收集数据,grafana显示图形

image-20230522154018235

# 安装Grafana
yum install -y https://mirrors.aliyun.com/grafana/yum/rpm/Packages/grafana-enterprise-9.5.2-1.x86_64.rpm

# 相关文件
/etc/grafana    # 配置文件目录
/etc/init.d/grafana-server
/etc/sysconfig/grafana-server # 配置文件
/usr/lib/systemd/system/grafana-server.service  # 服务管理脚本
/usr/sbin/grafana-cli # grafana管理命令
/usr/sbin/grafana-server # 服务端命令
/usr/share/grafana/public # 家目录,前端页面

# 安装zabbix插件
# 配置grafana通过api 访问zabbix
# web页面添加dashboard
# 导入模板
  • 登录相关页面ip:3000 用户名:密码:都是admin

image-20230523082241143

  • 安装检查zabbix插件

image-20230523082858745

image-20230523084143171

# 也可以命令行安装
grafana-cli plugins install alexanderzobnin-zabbix-app 版本号
  • 修改数据源

image-20230523084010887

image-20230523084604107

  • 创建图像

image-20230523093641892

image-20230523093649493

# 设置监控项时可以用正则
/.*/
  • 使用模板

模板下载地址

下载模板的JSON文件或者复制模板ID后,在Grafana中导入

image-20230523103851461

image-20230523103837848

导入之后默认是只读的,需要在设置中修改

image-20230523104414544

5.监控架设

1.详细要求

  • 所有服务器基础监控:cpu、内存、网卡、磁盘(大小/io)、网络带宽、负载…
  • cdn/dns:听云/监控宝
  • 负载均衡:(nginx lvs haproxy)
    • 端口80监控
    • keepalived服务进程监控
    • tcp11种状态数量监控(当前网站并发)
    • nginx状态监控
    • 日志 每种状态码的数量
    • https证书过期时间
  • web服务器
    • 端口80和9000监控
    • nginx状态监控
    • 访问日志状态码数量监控
    • ngin+php 监控
    • php+数据库 连接监控
    • php状态
    • tomcat多实例/单实例监控(jvm内存使用情况)
  • 数据库服务监控
    • 进程,端口
  • 存储服务
    • 共享了那些目录监控,共享目录大小监控
    • nfs,rpc服务监控
  • 备份服务器
    • rsync端口,进程监控
    • rsync守护进程模式监控
    • 是否可以数据传输
  • redis缓存
    • 端口,进程
    • 状态(命中率)

2.环境准备

主机名功能ip
lb01负载均衡
web01web服务器
db01数据库及缓存
nfs01存储
backup备份rsync服务端
m02zabbix服务器

3.实验

  1. 实现zabbix服务器监控其他所有服务器

image-20230524122103153

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1193016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OC-编译错误

明明包含了头文件&#xff0c;但是还是显示未知的类型 可能这个头文件被某个宏包住了 #if defined(__cplusplus) 在 C 代码中包含了一个 C 的头文件会显示这个错误“the util lib only be used in c”&#xff0c;此时用 #if defined(__cplusplus) #endif 包一下就行了&…

行情分析——加密货币市场大盘走势(11.10)

大饼今日继续上涨&#xff0c;正如预期&#xff0c;跌不下来&#xff0c;思路就是逢低做多。现在已经上涨到36500附近&#xff0c;目前从MACD日线来看&#xff0c;后续还要继续上涨&#xff0c;当然稳健的可以不做。昨日的策略已经达到止盈&#xff0c;也是顺利的落袋为安啦。一…

TCC分布式事务----以Hmily框架为例

插曲&#xff1a;RocketMQ的Half Message 先引入一个插曲&#xff0c;RocketMQ为什么要有Half Message 为什么不在本地事务提交之后&#xff0c;直接发一个commit消息不就行了&#xff0c;为什么还要先发一个可以撤回的、不能被消费的half message&#xff0c;再执行本地事务…

FindMy网络帮助您找到电动车

随着科技的发展&#xff0c;我们的生活变得越来越智能化。而现在&#xff0c;这项技术已经深入到了我们的出行方式中。如果你是一位电动车主&#xff0c;那么你可能会遇到一个常见的问题&#xff1a;忘记你的电动车停在了哪里。这种情况在日常生活中时有发生&#xff0c;而现在…

磁盘的分区、格式化、检验与挂载 ---- fdisk,mkfs,mount

磁盘的分区、格式化、检验与挂载 磁盘管理是非常重要的&#xff0c;当我们想要再系统里面新增一块磁盘使用时&#xff0c;应执行如下几步&#xff1a; 对磁盘进行划分&#xff0c;以建立可用的硬盘分区 &#xff08;fdisk / gdisk&#xff09;对硬盘分区进行格式化&#xff0…

【微信公众号开发】1.1 微信公众号开发课程内容介绍

一、微信公众号介绍 1、公众号类型及基本介绍 服务号、订阅号、小程序之间的关联及区别 2、编辑模式的使用 非开发者使用微信公众号的方式&#xff0c;通过微信公众号提供的平台来编辑 3、开发模式及预备知识介绍 如果我们不想使用默认的编辑模式&#xff0c;可以在具备一…

首周 Web3 开发者激励开启!数据与钱包新锐派送福利

如何在 Web3 时代汇聚更多开发者的力量&#xff0c;寻找全新的技术发展机遇和突破点&#xff1f;打造生态繁荣、高度协作的社区生态是不二路径。现在&#xff0c;一系列更为开放、活跃、包容的开发者社区活动正向大家发起邀请&#xff0c;你确定不来看看吗&#xff1f; 为了吸…

Power Automate-创建审批流

提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表&#xff0c;再点击添加新步骤 搜索审批&#xff0c;点击进入 操作里的选项区别&#xff1a; 1&#xff09;创建审批&#xff1a;创建一个审批任务 2&#xff09;等待审批&…

【Linux】 mdir命令使用

mdir 为mtools工具指令&#xff0c;模拟MS-DOS的dir指令&#xff0c;可显示MS-DOS文件系统中的目录内容。 语法 mdir [参数][目录] mdir命令 -Linux手册页 命令选项及作用 执行令 mdir--help 执行命令结果 参数 -a  显示隐藏文件。-f  不显示磁盘所剩余的可用空间。-w…

踹他GPT 之 弄个大乐透助手

11月7日凌晨的OpenAI第一次开发者大会&#xff0c;除了速度提升、服务使用费用的减少、开发者生态以外&#xff0c;最让我震撼的是&#xff0c;GPTS是ChatGPT的定制版本&#xff0c;是通过简单配置就可以完成一个使用ChatGPT、集成系统和数据服务的智能助手。比如OpenAI开发者体…

用Go实现网络流量解析和行为检测引擎

1.前言 最近有个在学校读书的迷弟问我:大德德, 有没有这么一款软件, 能够批量读取多个抓包文件,并把我想要的数据呈现出来, 比如:源IP、目的IP、源mac地址、目的mac地址等等。我说&#xff1a;“这样的软件你要认真找真能找出不少开源软件, 但毕竟没有你自己的灵魂在里面,要不…

【Python】queue模块Queue对象

Python中的queue模块是一个同步队列类&#xff0c;实现了多生产者、多消费者队列&#xff0c;适用于在多线程之间安全地传递消息或其他数据。Queue提供了所有必需的锁定语义。 queue模块有三种类型的队列&#xff08;只是队列中元素的提取顺序不同&#xff09;&#xff1a;先进…

小型洗衣机好用吗?最好用的迷你洗衣机

很多人会觉得小型洗衣机是智商税&#xff0c;没有必要专门买一个小型洗衣机来洗内衣&#xff0c;洗个内衣只需要两分钟的事情&#xff0c;需要花个几百块钱去入手一个洗衣机吗&#xff1f;然而清洗贴身衣物的并不是一件简单的事情&#xff0c;如果只是简单的搓洗&#xff0c;内…

Unity Mirror学习(一) SyncVars特性使用

官网中所说的网络对象&#xff0c;指的是挂了 NetworkIdentity组件的对象 官网中所说的玩家对象&#xff0c;指的是NetworkManager脚本上的PlayerPrefab预制体 这个概念对阅读官网文档很重要&#xff0c;我刚开始并不理解&#xff0c;走了歪路 SyncVars&#xff08;同步变量&a…

wav格式如何转mp3?

wav格式如何转mp3&#xff1f;WAV格式是一种高品质的音频文件格式&#xff0c;其采用无损压缩技术存储音频数据。通常&#xff0c;WAV文件使用PCM编码方式将声音信号转换为数字信号&#xff0c;并按照一定规则存储到文件中。这种编码方式可以确保音频数据的完整性和准确性&…

电脑硬盘数据恢复哪个好?值得考虑的 8 个硬盘恢复软件解决方案

借助硬盘恢复软件&#xff0c;任何人都可以在家中恢复丢失的文件&#xff0c;而无需任何特殊技能。事实上&#xff0c;最困难的一步是选择最佳解决方案&#xff0c;因为可用选项的数量可能有点多。幸运的是&#xff0c;这篇文章可以为您提供帮助。 8 款顶级硬盘数据恢复软件解决…

MemcachedRedis构建缓存服务器 (数据持久化,主从同步,哨兵模式)

Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、 提高可扩展性。降低数据库读的压力 Nsql的优点&#xff1a;高可扩展性&#xff0c;分布式计算&#xff0c;低成本&#xff0c;…

EMERSON艾默生变频器维修M600/M701/M702

艾默生变频器维修常见系列&#xff1a; EV1000 系列&#xff1a;体积小&#xff0c;操作简便&#xff0c;适用于塑料机械、纺织机械、烟草机械、陶瓷机械、制药机械食品机械、印刷机械、包装机械、空调等专用设备配套。 EV2000 系列&#xff1a;功率范围广&#xff0c;功能更…

【Python】数据分析案例:世界杯数据可视化 | 文末送书

文章目录 前期数据准备导入数据 分析&#xff1a;世界杯中各队赢得的比赛数分析&#xff1a;先打或后打的比赛获胜次数分析&#xff1a;世界杯中的抛硬币决策分析&#xff1a;2022年T20世界杯的最高得分者分析&#xff1a;世界杯比赛最佳球员奖分析&#xff1a;最适合先击球或追…

Android—幸运抽奖火箭发射倒计时(第六次作业)

Android—幸运抽奖&&点火发射&#xff08;第六次作业&#xff09; 创建项目 准备工作 修改按钮的颜色&#xff0c;如果不修改这行代码&#xff0c;那么后期给按钮添加background属性的时候&#xff0c;按钮并不会发生变化。 设置按钮的样式文件btn_press_blue.xml&am…