搭建基于Nginx+Keepalived的高可用web集群并实现监控告警

目录

  • 搭建相关服务器
    • DNS服务器配置
    • WEB服务器配置
      • 配置静态IP
      • 编译安装nginx
    • 负载均衡器配置
      • lb1
      • lb2
      • 高可用配置
    • NFS服务器配置
      • 配置静态IP
      • 安装软件包
      • 新建共享目录
      • web服务器挂载
    • 监控服务器配置
      • 安装node-exporter
      • 编写prometheus.yml
      • 安装alertmanager和钉钉插件
        • 获取机器人webhook
        • 编写alertmanager
        • 设置告警文件
      • 安装grafana
      • 进行压力测试

搭建相关服务器

规划一下IP地址和集群架构图,关闭所有SELINUX和防火墙

# 关闭SELINUX
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
# 关闭防火墙
service firewalld stop
systemctl disable firewalld

在这里插入图片描述

web1192.168.40.21后端web
web2192.168.40.22后端web
web3192.168.40.23后端web
lb1192.168.40.31负载均衡器1
lb2192.168.40.32负载均衡器2
dns、prometheus192.168.40.137DNS服务器、监控服务器
nfs192.168.40.138NFS服务器

DNS服务器配置

安装bind软件包

yum install bind* -y

启动named进程

[root@elk-node2 selinux]# service named start
Redirecting to /bin/systemctl start named.service
[root@elk-node2 selinux]# ps aux | grep named
named     44018  0.8  3.2 391060 60084 ?        Ssl  15:15   0:00 /usr/sbin/named -u named -c /etc/named.conf
root      44038  0.0  0.0 112824   980 pts/0    S+   15:15   0:00 grep --color=auto named

修改/etc/resolv.conf文件,添加一行,将域名服务器设置为本机

nameserver 127.0.0.1

测试。解析成功

[root@elk-node2 selinux]#  nslookup 
> www.qq.com
Server:         127.0.0.1
Address:        127.0.0.1#53Non-authoritative answer:
www.qq.com      canonical name = ins-r23tsuuf.ias.tencent-cloud.net.
Name:   ins-r23tsuuf.ias.tencent-cloud.net
Address: 121.14.77.221
Name:   ins-r23tsuuf.ias.tencent-cloud.net
Address: 121.14.77.201
Name:   ins-r23tsuuf.ias.tencent-cloud.net
Address: 240e:97c:2f:3003::77
Name:   ins-r23tsuuf.ias.tencent-cloud.net
Address: 240e:97c:2f:3003::6a

利用这台机器做域名服务器,方便其它机器能够访问,修改/etc/named.conf

listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
allow-query     { any; };

重启服务

service named restart

这样其它的机器就可以利用192.168.40.137这台机器做域名解析了

WEB服务器配置

配置静态IP

进入/etc/sysconfig/network-scripts/目录

修改ifcfg-ens33文件,保证能互相通信

web1IP配置

BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.40.21
PREFIX=24
GATEWAY=192.168.40.2
DNS1=114.114.114.114                       

web2IP配置

BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.40.22
PREFIX=24
GATEWAY=192.168.40.2
DNS1=114.114.114.114    

web3IP配置

BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.40.23
PREFIX=24
GATEWAY=192.168.40.2
DNS1=114.114.114.114    

编译安装nginx

编译安装nginx可以看我这篇博客 Nginx的安装启动和停止

安装好之后浏览器访问成功即可。

负载均衡器配置

使用nginx做负载均衡

lb1

配置静态IP

BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.40.31
PREFIX=24
GATEWAY=192.168.40.2
DNS1=114.114.114.114

修改安装目录下的nginx.conf文件,添加如下

七层负载—>upstream在http块里,基于http协议进行转发

http {……upstream lb1{ # 后端真实的IP地址,在http块里ip_hash; # 使用ip_hash算法或least_conn;最小连接# 权重 192.168.40.21 weight=5;server 192.168.40.21;;server 192.168.40.22;server 192.168.40.23;}server {listen       80;……location / {#root   html; 注释掉,因为只是做代理,不是直接访问#index  index.html index.htm;proxy_pass http://lb1; # 代理转发    }

四层负载—>stream块与http块同级,基于IP+端口进行转发

stream {upstream lb1{}server {listen 80; # 基于80端口转发proxy_pass lb1;}upstream dns_servers {least_conn;server 192.168.40.21:53;server 192.168.40.22:53;server 192.168.40.23:53;     }server {listen 53 udp; # 基于53端口转发proxy_pass dns_servers;}
}

重新加载nginx

nginx -s reload

默认使用轮询算法,可以查看效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

lb2

配置静态IP

BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.40.32
PREFIX=24
GATEWAY=192.168.40.2
DNS1=114.114.114.114

修改安装目录下的nginx.conf文件,添加如下

七层负载—>upstream在http块里,基于http协议进行转发

http {……upstream lb2{ # 后端真实的IP地址,在http块里ip_hash; # 使用ip_hash算法或least_conn;最小连接# 权重 192.168.40.21 weight=5;server 192.168.40.21;;server 192.168.40.22;server 192.168.40.23;}server {listen       80;……location / {#root   html; 注释掉,因为只是做代理,不是直接访问#index  index.html index.htm;proxy_pass http://lb2; # 代理转发    }

重新加载nginx

nginx -s reload

问题:后端的服务器不知道真正访问的IP地址,只知道负载均衡器的IP地址,如何解决?

参考文章

       使用变量 $remote_addr 获取客户端的 IP 地址赋值给X-Real-IP 字段,然后重载一下

nginx -s reload

在这里插入图片描述

所有后端服务器修改日志,获取该字段的值
在这里插入图片描述

查看是否获取客户端真实IP

在这里插入图片描述

问题:四层负载和七层负载有什么区别?

参考文章

  1. 四层负载均衡(Layer 4 Load Balancing): 四层负载均衡是在传输层(即网络层)上进行负载均衡的一种方式。在四层负载均衡中,负载均衡设备根据源IP地址、目标IP地址、源端口号、目标端口号等信息来转发请求到相应的服务器。它基本上只关注网络连接的基本属性,并且不了解请求的内容和协议。

    四层负载均衡的优点是速度快、效率高,适合于处理大量网络连接的情况,例如 TCP 和 UDP 协议。但它对请求内容的理解有限,无法针对具体应用的特定需求进行定制化的转发策略。

  2. 七层负载均衡(Layer 7 Load Balancing): 七层负载均衡是在应用层上进行负载均衡的一种方式。在七层负载均衡中,负载均衡设备能够深入到应用层协议(如 HTTP、HTTPS)来理解请求的内容和特征,根据请求的 URL、请求头、会话信息等因素来智能地转发请求。

    七层负载均衡可以实现更加灵活和定制化的转发策略。例如,可以根据域名、URL路径、请求头中的特定信息等来将请求分发给不同的后端服务器。这对于处理 Web 应用程序、API 服务等具有特定路由规则和需求的情况非常有用。

四层负载均衡主要基于传输层的网络连接属性进行转发,适合于高并发和大规模的网络连接场景;而七层负载均衡则在应用层上对请求进行深入理解,适合于根据请求内容和特征进行智能转发的场景。在实际应用中,根据具体的需求和应用类型,可以选择合适的负载均衡方式或结合两者来实现更好的性能和可伸缩性。

高可用配置

使用keepalived实现高可用

       两台负载均衡器都安装keepalived,它们之间的通信是通过VRRP协议进行,VRRP协议介绍 参考文章

yum install keepalived

单VIP配置

       进入配置文件所在目录/etc/keepalived/,编辑配置文件keepalived.conf,启动一个vrrp实例

lb1配置

vrrp_instance VI_1 {    #启动一个实例state MASTER	    #角色为masterinterface ens33     #网卡接口virtual_router_id 150#路由idpriority 100        #优先级advert_int 1        #宣告信息 间隔1sauthentication {    #认证信息auth_type PASSauth_pass 1111}virtual_ipaddress { #虚拟IP,对外提供服务192.168.40.51}
}

lb2配置

vrrp_instance VI_1 {state BACKUP #角色为backupinterface ens33virtual_router_id 150priority 50  #优先级比master要低advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.51}
}

启动keepalived,就可以在优先级高的那一台负载均衡器看到vip了

service keepalived start

双VIP配置

       进入配置文件所在目录/etc/keepalived/,编辑配置文件keepalived.conf,启动两个vrrp对外提供服务,提高使用率

lb1配置

vrrp_instance VI_1 {    #启动一个实例state MASTER       #角色为masterinterface ens33     #网卡接口virtual_router_id 150#路由idpriority 100        #优先级advert_int 1        #宣告信息authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.51 # 对外提供的IP}
}
vrrp_instance VI_2 {   #启动第二个实例state BACKUP      #角色为backupinterface ens33     #网卡接口virtual_router_id 160#路由idpriority 50         #优先级advert_int 1        #宣告信息authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.52 # 对外提供的IP}
}

lb2配置

vrrp_instance VI_1 {state BACKUP  #角色为backupinterface ens33virtual_router_id 150priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.51}
}
vrrp_instance VI_2 {state MASTER  #角色为masterinterface ens33virtual_router_id 160priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.52}
}

重新启动keepalived,就可以在两台负载均衡器都看到vip了

service keepalived start

       编写脚本check_nginx.sh,监控Nginx是否运行,如果Nginx挂了,那么keepalived开启没有意义,占用资源,需要及时调整主备状态

#!/bin/bash
if [[ $(netstat -anplut| grep nginx|wc -l) -eq 1 ]];thenexit 0
elseexit 1# 关闭keepalivedservice keepalived stop
fi

授予权限

chmod +x check_nginx.sh 

       脚本没有执行成功,查看/var/log/messages日志出现了问题,原来是脚本名字和括号之间没有空格……

在这里插入图片描述

加入脚本后的lb1配置

! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 外部脚本执行位置,使用绝对路径
interval 1
weight -60 # 修改后权重的优先值要小于backup
}vrrp_instance VI_1 {    #启动一个实例state MASTERinterface ens33     #网卡接口virtual_router_id 150#路由idpriority 100        #优先级advert_int 1        #宣告信息authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.51}
track_script { # 脚本名要有空格
chk_nginx # 调用脚本
}}vrrp_instance VI_2 {    #启动一个实例state BACKUPinterface ens33     #网卡接口virtual_router_id 170#路由idpriority 50         #优先级advert_int 1        #宣告信息authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.52}
}

lb2的配置同lb1,只要将脚本执行的代码放置lb2的master部分即可

       进行nginx测试,发现双vip能够在nginx关闭的状态同时关闭keepalived并进行vip漂移

       notify的用法(也可以实现keepalived关闭的效果) 参考文章

notify的用法:notify_master:当前节点成为master时,通知脚本执行任务(一般用于启动某服务,比如nginx,haproxy等)notify_backup:当前节点成为backup时,通知脚本执行任务(一般用于关闭某服务,比如nginx,haproxy等)notify_fault:当前节点出现故障,执行的任务; 例:当成为master时启动haproxy,当成为backup时关闭haproxynotify_master "/etc/keepalived/start_haproxy.sh start"notify_backup "/etc/keepalived/start_haproxy.sh stop"

问题:什么是脑裂现象,可能出现的原因有哪些?

       脑裂现象指的是主备服务器之间的通信故障,导致两个节点同时认为自己是主节点而发生竞争的情况,原因如下

  1. 网络分区:在使用keepalived的集群中,如果网络发生分区,导致主节点与备份节点之间的通信中断,可能会导致脑裂现象的发生。
  2. 虚拟路由id不一致:虚拟路由id用于唯一标识主备节点,如果虚拟路由ID设置不一致,不同节点之间将产生冲突,可能导致节点同时宣布自己是活跃节点,从而引发脑裂现象。
  3. 认证密码不一样:当认证密码不一致时,节点之间的通信将受阻,可能导致节点无法正常进行状态同步和故障切换,从而引发脑裂现象的发生。
  4. 节点运行状态不同步:当主节点和备份节点之间的状态同步过程中出现错误或延迟,导致节点状态不一致,可能会引发脑裂现象。
  5. 信号丢失:keepalived使用心跳机制检测节点状态,如果由于网络延迟或其他原因导致心跳信号丢失,可能会误判节点状态,从而引发脑裂现象。

问题:keepalived的三个进程?

  1. Keepalived 主进程:负责加载并解析 Keepalived 配置文件,创建和管理 VRRP 实例,并监控实例状态。它还处理与其他 Keepalived 进程之间的通信。
  2. Keepalived VRRP 进程:这是负责实现虚拟路由冗余协议功能的进程。每个启动的 VRRP 实例都会有一个对应的 VRRP 进程。它负责定期发送 VRRP 通告消息,监听其他节点发送的通告消息,并根据配置的优先级进行故障转移。
  3. Keepalived Check Script 进程:这个进程用于执行用户定义的健康检查脚本。通过此进程,可以执行自定义的脚本来检测服务器的健康状态,并根据脚本的返回结果来更改 VRRP 实例的状态或触发故障转移。

NFS服务器配置

       使用nfs,让后端服务器到nfs服务器里获取数据,将nfs的服务器挂载到web服务器上,保证数据一致性

配置静态IP

BOOTPROTO="none"
IPADDR=192.168.40.138
GATEWAY=192.168.40.2
DNS2=114.114.114.114
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"       

安装软件包

yum -y install rpcbind nfs-utils


启动服务,先启动rpc服务,再启动nfs服务

# 启动rpc服务
[root@nfs ~]# service rpcbind start
Redirecting to /bin/systemctl start rpcbind.service
[root@nfs ~]# systemctl enable rpcbind
# 启动nfs服务
[root@nfs ~]# service nfs-server start
Redirecting to /bin/systemctl start nfs-server.service
[root@nfs ~]# systemctl enable nfs-server

新建共享目录

新建/data/share/,自己写一个index.html查看效果

mkdir -p /data/share/

编辑配置文件vim /etc/exports

/data/share/ 192.168.40.0/24(rw,no_root_squash,all_squash,sync)

其中:

  • /data/share/:共享文件目录
  • 192.168.40.0/24:表示接受来自以 192.168.40.0 开头的IP地址范围的请求。
  • (rw):指定允许对目录进行读写操作。
  • no_root_squash:指定不对root用户进行权限限制。它意味着在客户端上以root用户身份访问时,在服务器上也将以root用户身份进行访问。
  • all_squash:指定将所有用户映射为匿名用户。它意味着在客户端上以任何用户身份访问时,在服务器上都将以匿名用户身份进行访问。
  • sync:指定文件系统同步方式。sync 表示在写入操作完成之前,将数据同步到磁盘上。保障数据的一致性和可靠性,但可能会对性能产生影响。

重新加载nfs,让配置文件生效

systemctl reload nfs
exportfs -rv

web服务器挂载

       3台web服务器只需要安装rpcbind服务即可,无需安装nfs或开启nfs服务。

yum install rpcbind -y

web服务器端查看nfs服务器共享目录

[root@web1 ~]# showmount -e 192.168.40.138
Export list for 192.168.40.138:
/data/share 192.168.40.0/24
[root@web2 ~]# showmount -e 192.168.40.138
Export list for 192.168.40.138:
/data/share 192.168.40.0/24
[root@web3 ~]# showmount -e 192.168.40.138
Export list for 192.168.40.138:
/data/share 192.168.40.0/24

进行挂载,挂载到Nginx网页目录下

[root@web1 ~]# mount 192.168.40.138:/data/share /usr/local/shengxia/html
[root@web2 ~]# mount 192.168.40.138:/data/share /usr/local/shengxia/html
[root@web3 ~]# mount 192.168.40.138:/data/share /usr/local/shengxia/html

设置开机自动挂载nfs文件系统

vim /etc/rc.local
# 将这行直接接入/etc/rc.local文件末尾
mount -t nfs 192.168.40.138:/data/share /usr/local/shengxia/html

同时给/etc/rc.d/rc.local可执行权限

chmod /etc/rc.d/rc.local

看到这个效果就表示成功了
在这里插入图片描述

监控服务器配置

       下载prometheus和exporter进行监控,安装可以看我这篇博客
Prometheus、Grafana、cAdvisor的介绍、安装和使用

安装node-exporter

       prometheus安装好之后,在每个服务器都安装node-exporter,监控服务器状态 下载

       除了本机192.168.40.137以外,所有的服务器都下载,演示一个案例。其他服务器相同操作

解压文件

[root@web1 exporter]# ls
node_exporter-1.5.0.linux-amd64.tar.gz
[root@web1 exporter]# tar xf node_exporter-1.5.0.linux-amd64.tar.gz 
[root@web1 exporter]# ls
node_exporter-1.5.0.linux-amd64  node_exporter-1.5.0.linux-amd64.tar.gz

新建目录

[root@web1 exporter]# mkdir -p /node_exporter

复制node_exporter下的文件到指定的目录

[root@web1 exporter]# cp node_exporter-1.5.0.linux-amd64/* /node_exporter

/root/.bashrc文件下修改PATH环境变量,将这行加到文件末尾,刷新一下

PATH=/node_exporter/:$PATH
source /root/.bashrc

放到后台启动运行

[root@web1 exporter]# nohup node_exporter --web.listen-address 192.168.40.21:8899 &

出现这个页面即成功

在这里插入图片描述

编写prometheus.yml

scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: "prometheus"# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ["192.168.40.137:9090"]- job_name: "nfs"static_configs:- targets: ["192.168.40.138:8899"]- job_name: "lb1"static_configs:- targets: ["192.168.40.31:8899"]- job_name: "lb2"static_configs:- targets: ["192.168.40.32:8899"]- job_name: "web1"static_configs:- targets: ["192.168.40.21:8899"]- job_name: "web2"static_configs:- targets: ["192.168.40.22:8899"]- job_name: "web3"static_configs:- targets: ["192.168.40.23:8899"]

重新启动prometheus

[root@dns-prom prometheus]# service prometheus restart

看到这个页面就表示监控成功了

在这里插入图片描述

安装alertmanager和钉钉插件

下载

[root@dns-prom prometheus]# wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
[root@dns-prom prometheus]# wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz

解压

[root@dns-prom prometheus]# tar xf alertmanager-0.23.0-rc.0.linux-amd64.tar.gz 
[root@dns-prom prometheus]# mv alertmanager-0.23.0-rc.0.linux-amd64 alertmanager
[root@dns-prom prometheus]# tar xf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz 
[root@dns-prom prometheus]# mv prometheus-webhook-dingtalk-1.4.0.linux-amd64 prometheus-webhook-dingtalk

获取机器人webhook

在这里插入图片描述

获取允许访问的IP,使用curl ifconfig.me可以获得

[root@dns-prom alertmanager]# curl ifconfig.me
222.244.215.17

在这里插入图片描述

修改钉钉告警模板

#位置:/lianxi/prometheus/prometheus-webhook-dingtalk/contrib/templates/legacy/template.tmpl
[root@dns-prom legacy]# cat template.tmpl
{{ define "ding.link.title" }}{{ template "legacy.title" . }}{{ end }}
{{ define "ding.link.content" }}
{{ if gt (len .Alerts.Firing) 0 -}}
告警列表:
{{ template "__text_alert_list" .Alerts.Firing }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}
恢复列表:
{{ template "__text_resolve_list" .Alerts.Resolved }}
{{- end }}
{{- end }}

修改cofig,yml文件,添加机器人的webhook的token,指定模板文件

[root@dns-prom prometheus-webhook-dingtalk]# cat config.yml 
templates:- /lianxi/prometheus/prometheus-webhook-dingtalk/contrib/templates/legacy/template.tmpl # 模板路径targets:webhook2:url: https://oapi.dingtalk.com/robot/send?access_token=你自己的token

prometheus-webhook-dingtalk注册成服务

[root@dns-prom system]# pwd
/usr/lib/systemd/system
[root@dns-prom system]# cat webhook-dingtalk
[Unit]
Description=prometheus-webhook-dingtalk
Documentation=https://github.com/timonwong/prometheus-webhook-dingtalk
After=network.target[Service]
ExecStart=/lianxi/prometheus/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk  --config.file=/lianxi/prometheus/prometheus-webhook-dingtalk/config.yml
Restart=on-failure[Install]
WantedBy=multi-user.target

加载服务

[root@dns-prom system]# systemctl daemon-reload

启动服务

[root@dns-prom system]# service webhook-dingtalk start
Redirecting to /bin/systemctl start webhook-dingtalk.service

编写alertmanager

修改alertmanager.yml文件

global:resolve_timeout: 5mroute: # 告警路由配置,定义如何处理和发送告警receiver: webhookgroup_wait: 30sgroup_interval: 1mrepeat_interval: 4hgroup_by: [alertname]routes:- receiver: webhookgroup_wait: 10sreceivers: # 告警接收者配置,定义如何处理和发送告警
- name: webhook webhook_configs:### 注意注意,我在dingtalk的配置文件里用的是webhook2,要对上- url: http://192.168.40.137:8060/dingtalk/webhook2/send  # 告警 Webhook URLsend_resolved: true # 是否发送已解决的告警。如果设置为 true,则在告警解决时发送通知

alertmanager注册成服务

[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target[Service]
ExecStart=/lianxi/prometheus/alertmanager/alertmanager --config.file=/lianxi/prometheus/alertmanager/alertmanager.yml 
Restart=on-failure[Install]
WantedBy=multi-user.target

加载服务

[root@dns-prom system]# systemctl daemon-reload

查看

在这里插入图片描述

设置告警文件

在prometheus目录下新建一个rules.yml文件的告警规则

[root@dns-prom prometheus]# pwd
/lianxi/prometheus/prometheus
[root@dns-prom prometheus]# cat rules.yml 
groups:- name: host_monitoringrules:- alert: 内存报警expr: netdata_system_ram_MiB_average{chart="system.ram",dimension="free",family="ram"} < 800for: 2mlabels:team: nodeannotations:Alert_type: 内存报警Server: '{{$labels.instance}}'explain: "内存使用量超过90%,目前剩余量为:{{ $value }}M"- alert: CPU报警expr: netdata_system_cpu_percentage_average{chart="system.cpu",dimension="idle",family="cpu"} < 20for: 2mlabels:team: nodeannotations:Alert_type: CPU报警Server: '{{$labels.instance}}'explain: "CPU使用量超过80%,目前剩余量为:{{ $value }}"- alert: 磁盘报警expr: netdata_disk_space_GiB_average{chart="disk_space._",dimension="avail",family="/"} < 4for: 2mlabels:team: nodeannotations:Alert_type: 磁盘报警Server: '{{$labels.instance}}'explain: "磁盘使用量超过90%,目前剩余量为:{{ $value }}G"- alert: 服务告警expr: up == 0for: 2mlabels:team: nodeannotations:Alert_type: 服务报警Server: '{{$labels.instance}}'explain: "netdata服务已关闭"

修改prometheus.yml文件,与alertmanager进行关联

alerting:alertmanagers:- static_configs:- targets: ["192.168.40.137:9093"]# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "/lianxi/prometheus/prometheus/rules.yml" # 告警模板路径# - "first_rules.yml"# - "second_rules.yml"

重启prometheus服务

[root@dns-prom prometheus]# service prometheus restart

可以看到监控数据了

在这里插入图片描述

模拟服务器宕机,关闭web1,提示告警

在这里插入图片描述

钉钉收到告警

在这里插入图片描述

安装grafana

从Grafana官网下载Grafana软件包,并按照官方文档进行安装

root@dns-prom grafana]# yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-9.5.1-1.x86_64.rpm

启动grafana

[root@dns-prom grafana]# service grafana-server restart
Restarting grafana-server (via systemctl):                 [  确定  ]

具体的操作过程可以看这篇文档 Prometheus、Grafana、cAdvisor的介绍、安装和使用

选择一个好的模板就可以进行出图展示啦

在这里插入图片描述

在这里插入图片描述

进行压力测试

安装ab软件,模拟请求

yum install ab -y

不断模拟请求,了解集群并发数。

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

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

相关文章

Python实战之数据挖掘详解

一、Python数据挖掘 1.1 数据挖掘是什么&#xff1f; 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中&#xff0c;通过算法&#xff0c;找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言&#xff0c;拥有丰富的数据挖掘库&#…

Nginx配置解析

server {listen 80;server_name example.com;location / {proxy_pass http://backend;}location / 是 Nginx 的一个匹配规则&#xff0c;用于匹配所有请求路径。proxy_pass 指令则用于将匹配到的请求转发给指定的后端服务器。下面是关于 location / 和 proxy_pass 的详细介绍&a…

解决嵌入式中QTableWidget双击出现空白QTableWidgetItem输入

目录 所说BUG现象解决方式1方式2全部内容 效果 今天突然想起在上个公司解决的一个BUG 嵌入式中QTableWidget一般只能看数据不能编辑&#xff0c;或者是选择 所以双击出现空白QTableWidgetItem是不允许的 所说BUG现象 解决 在空白的单元格中&#xff0c;添加不可编辑的QTableWid…

数字孪生:未来科技的新前沿

数字孪生作为一项新兴的研究方向&#xff0c;正逐渐成为科技界的焦点。它是将现实世界中的实体、系统或过程通过数字化手段进行建模、仿真和分析&#xff0c;形成与实体相对应的数字化副本。数字孪生的发展为我们带来了无限的想象空间&#xff0c;以及解决现实问题的新途径。 在…

Zabbix监控安装grafana并配置图形操作

第三阶段基础 时 间&#xff1a;2023年7月20日 参加人&#xff1a;全班人员 内 容&#xff1a; Zabbix监控安装grafana 目录 安装并配置grafana 一、安装Grafana 二、下载安装插件 三、配置grafana 四、Web访问并配置&#xff1a; 安装并配置grafana 一、安装Graf…

【团队协作开发】将Gitee项目导入到本地IDEA中出现根目录不完整的问题解决(已解决)

前言&#xff1a;在团队协作开发过程中&#xff0c;通常我们的Gitee完整项目中会包含很多内容&#xff1a;后端代码、前端代码、项目结构图、项目文档等一系列资产。 将Gitee项目导入到本地IDEA中&#xff0c;通常会出现根目录不完整的问题。这是因为项目里面包含了后端代码、前…

基于Java+SpringBoot+vue前后端分离甘肃非物质文化网站设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

DAY51:动态规划(十五)买卖股票最佳时机Ⅲ+买卖股票最佳时期Ⅳ

文章目录 123.买卖股票最佳时机Ⅲ&#xff08;注意初始化&#xff09;思路DP数组含义递推公式初始化遍历顺序最开始的写法&#xff1a;初始化全部写成0debug测试&#xff1a;解答错误&#xff0c;第0天实际上是对应prices[0]和dp[0] 完整版总结 188.买卖股票最佳时机Ⅳ思路DP数…

09.计算机网络——套接字编程

文章目录 网络字节序socket编程socket 常见APIsockaddr结构 UDP编程创建socket绑定socketsendto发送数据recvform接收数据关闭socket TCP编程创建socket绑定socketlisten监听套接字accept服务端接收连接套接字connect客户端连接套接字send发送数据recv接收数据关闭socket 工具n…

【flink】ColumnarRowData

列式存储 在调试flink读取parquet文件时&#xff0c;读出来的数据是ColumnarRowData&#xff0c;由于parquet是列式存储的文件格式&#xff0c;所以需要用一种列式存储的表示方式&#xff0c;ColumnarRowData就是用来表示列式存储的一行数据&#xff0c;它包含多个数组的数据结…

从电商指标洞察到运营归因,只需几句话?AI 数智助理准备好了!

Lily 是名入职不久的电商运营助理&#xff0c;最近她想要根据 2022 年的客单价情况&#xff0c;分析品牌 A 在不同电商渠道的用户行为和表现&#xff0c;并提供一些有价值的洞察和建议给客户。然而在向技术人员提报表需求后&#xff0c;技术人员以需求排满为借口拒绝了。 Lily …

5分钟,结合 LangChain 搭建自己的生成式智能问答系统

伴随大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;的涌现&#xff0c;人们发现生成式人工智能在非常多领域具有重要意义&#xff0c;如图像生成&#xff0c;书写文稿&#xff0c;信息搜索等。随着 LLM 场景的多样化&#xff0c;大家希望 LLM 能在垂直…

记一次容器环境下出现 Address not available

作者&#xff1a;郑明泉、余凯 困惑的源地址 pod 创建后一段时间一直是正常运行&#xff0c;突然有一天发现没有新的连接创建了&#xff0c;业务上是通过 pod A 访问 svc B 的 svc name 的方式&#xff0c;进入 pod 手动去 wget 一下&#xff0c;发现报错了 Address not avai…

jar 更新 jar包内的 class,以及如何修改class

一、提取Jar 内文件 #提取jar内的配置文件jar -xvf a.jar META-INF\plugin.xml-已解压: META-INF/plugin.xml#提取jar内的class文件&#xff0c; 提示&#xff1a;反编译为java文件&#xff0c;修改后再使用javac xxx.java编译为class&#xff0c;jar -xvf a.jar io.config.**…

单例模式类设计|什么是饿汉模式和懒汉模式

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量干货博客汇总https://blog.csdn.net/yu_cblog/c…

在Vue-Element中引入jQuery的方法

一、在终端窗口执行安装命令 npm install jquery --save执行完后&#xff0c;npm会自动在package.json中加上jquery 二、在main.js中引入&#xff08;或者在需要使用的页面中引入即可&#xff09; import $ from jquery三、使用jquery

【Ansible 自动化配置管理实践】01、Ansible 快速入门

目录 一、Ansible 快速入门 1.1 什么是 Ansible ​1.2 Ansible 主要功能 1.3 Ansible 的特点 1.4 Ansible 基础架构 二、Ansible 安装与配置 2.1 Ansible 安装 2.2 确认安装 三、Ansible 配置解读 3.1 Ansible 配置路径 3.2 Ansible 主配置文件 3.3 Ansi…

Spring系列一:spring的安装与使用

文章目录 &#x1f49e; 官方资料&#x1f34a;Spring5下载&#x1f34a;文档介绍 &#x1f49e;Spring5&#x1f34a;内容介绍&#x1f34a;重要概念 &#x1f49e;快速入门&#x1f34a;Spring操作演示&#x1f34a;类加载路径&#x1f34a;Debug配置&#x1f34a;Spring容器…

《Docker资源限制和调度策略:性能优化与资源管理,打造高效稳定的容器环境》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【Nodejs】Puppeteer\爬虫实践

puppeteer 文档:puppeteer.js中文文档|puppeteerjs中文网|puppeteer爬虫教程 Puppeteer本身依赖6.4以上的Node&#xff0c;但是为了异步超级好用的async/await&#xff0c;推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高&#xff0c;c…