【优化篇】使用Keepalived实现简单的GrayLog高可用

简介: 【优化篇】使用Keepalived实现简单的GrayLog高可用

在之前的文章上做了一些调整与优化 《使用Keepalived实现简单的GrayLog高可用

一、Keepalived优化

1、Keepalived设置成不抢占模式

具体地方:keepalived.conf配置文件中

1)、vrrp_script  check_graylog中注释掉#weight 50

2)、vrrp_instance VI_Graylog 添加 nopreempt true

(图片点击放大查看)

2、添加服务重启进程PID变化检测机制

#!/bin/bash
# 检测的服务名称
SERVICE_NAME="graylog"
# 获取当前服务的 PID
CURRENT_PID=`ps -ef | grep '/bin/graylog-server' | grep -v grep | awk '{print $2}'`
# 如果获取到的 PID 为空,则服务可能已经停止,返回 1
if [ -z "${CURRENT_PID}" ]; then
    exit 1
fi
# 如果上一次记录的 PID 和当前 PID 不同,则返回 1
if [ "${CURRENT_PID}" != "$(cat /var/run/${SERVICE_NAME}.pid)" ]; then
    echo "${CURRENT_PID}" > /var/run/${SERVICE_NAME}.pid
    exit 1
fi
# 记录当前 PID 到文件中
echo "${CURRENT_PID}" > /var/run/${SERVICE_NAME}.pid
# 如果上述条件都不满足,则返回 0,表示服务正常
exit 0

(图片点击放大查看)

3、状态变化时告警通知显示当前时间

master.sh backup.sh fault.sh 三个脚本均做了优化

(图片点击放大查看)

主备切换演示效果如下

1、节点1重启graylog-server服务,节点1先是Fault状态,这时节点2成为Master,待节点1重启完成后变为Backup状态

(图片点击放大查看)

(图片点击放大查看)

2、节点2停止graylog-server服务,这时节点2变为Fault状态,节点1成为Master

(图片点击放大查看)

(图片点击放大查看)

二、进程监测脚本

vim /opt/check_graylogserver_process.sh
#!/bin/bash
# 进程名称
PROCESS_NAME="graylog"
# 进程状态通过读写文件来更新计数
PROCESS_STATUS_FILE="/tmp/process_status.txt"
# 告警计数通过读写文件来更新计数
ALERT_COUNT_FILE="/tmp/alert_count.txt"
# 告警次数阈值
ALERT_THRESHOLD=3
# 钉钉机器人Webhook地址
WEBHOOK_URL_graylog="https://oapi.dingtalk.com/robot/send?access_token=87ab6ee5b3045a8e896222c7b8889d14dcb6ebf94ecacd759f1b737a7cef5408"
# 发送告警
send_alert() {
    current_time=$(date "+%Y-%m-%d %H:%M:%S")
    message="{\"msgtype\":\"text\",\"text\":{\"content\":\"Node1节点(IP:192.168.31.64)的 $PROCESS_NAME 进程未运行已超过【$ALERT_COUNT】分钟,请立即处理!\n当前时间:$current_time\"}}"
    curl -s -H "Content-Type: application/json" -d "$message" "$WEBHOOK_URL_graylog" > /dev/null
}
send_alert_tips() {
    current_time=$(date "+%Y-%m-%d %H:%M:%S")
    message="{\"msgtype\":\"text\",\"text\":{\"content\":\"Node1节点(IP:192.168.242.64)的 $PROCESS_NAME 进程未运行告警已发送三次,后续不再发送提醒,请及时关注并处理!\n当前时间:$current_time\"}}"
   curl -s -H "Content-Type: application/json" -d "$message" "$WEBHOOK_URL_graylog" > /dev/null
}
# 发送恢复告警
send_recovery_alert() {
    current_time=$(date "+%Y-%m-%d %H:%M:%S")
    message="{\"msgtype\":\"text\",\"text\":{\"content\":\"Node1节点(IP:192.168.242.64)的 $PROCESS_NAME 进程已恢复正常运行!\n恢复时间:$current_time\"}}"
    curl -s -H "Content-Type: application/json" -d "$message" "$WEBHOOK_URL_graylog" > /dev/null
}
# 检测进程是否运行
check_process() {
    # 使用ps命令结合grep命令检测进程是否存在
     process_status=$(ps -ef | grep -v grep | grep "$PROCESS_NAME" | grep "server.conf")
    # 如果进程不存在
    if [ -z "$process_status" ]; then
        echo "--------------------------------"
                echo 当前时间:`date "+%Y-%m-%d %H:%M:%S"`
        echo "进程 $PROCESS_NAME 未运行"
        # 增加告警次数
        ALERT_COUNT=$(cat $ALERT_COUNT_FILE)
        ALERT_COUNT=$((ALERT_COUNT+1))
        echo $ALERT_COUNT > $ALERT_COUNT_FILE
       if [ $ALERT_COUNT -le $ALERT_THRESHOLD ]; then
        # 发送告警
             echo "--------------------------------"
             echo 当前时间:`date "+%Y-%m-%d %H:%M:%S"`
             echo AlertCount:$ALERT_COUNT
             echo "告警次数+1,发送(进程不运行)告警"
             send_alert
             echo "--------------------------------"
        fi
        # 如果告警次数超过3次,则不再发送告警
        if [ $ALERT_COUNT -eq $ALERT_THRESHOLD ]; then
            echo "--------------------------------"
            echo 当前时间:`date "+%Y-%m-%d %H:%M:%S"`
            echo AlertCount:$ALERT_COUNT
            echo "已达到告警次数上限次数3次,后续将不再发送告警"
            send_alert_tips
            echo "--------------------------------"
        fi
        if [ $ALERT_COUNT -gt $ALERT_THRESHOLD ]; then
            echo "--------------------------------"
            echo 当前时间:`date "+%Y-%m-%d %H:%M:%S"`
            echo AlertCount:$ALERT_COUNT
            echo "已超过告警次数上限次数3次,后续将不再发送告警"
            echo "--------------------------------"
            exit 0
        fi
        # 将进程状态标志设置为未运行
        echo 0 > $PROCESS_STATUS_FILE
    else
        # 进程存在
        echo "进程 $PROCESS_NAME 在运行"
        # 获取告警故障计数
        ALERT_COUNT=$(cat $ALERT_COUNT_FILE)         
        # 如果之前有告警且进程状态为未运行,发送恢复告警
        PROCESS_STATUS=$(cat $PROCESS_STATUS_FILE)
        if [ $ALERT_COUNT -gt 0 ] && [ $PROCESS_STATUS -eq 0 ]; then
             echo "--------------------------------"
             echo 当前时间:`date "+%Y-%m-%d %H:%M:%S"`
             echo "进程已恢复运行,发送恢复告警"
             send_recovery_alert
             echo "--------------------------------"
        fi
        # 进程存在,重置告警次数
        ALERT_COUNT=0
        echo $ALERT_COUNT > /tmp/alert_count.txt
        # 将进程状态标志设置为运行中
        echo 1 > $PROCESS_STATUS_FILE
    fi
}
# 执行检测进程的函数
check_process
crontab -e 添加如下行
* * * * * /opt/check_graylogserver_process.sh >> /var/log/check_graylogserver_process.log
touch /tmp/process_status.txt
touch /tmp/alert_count.txt

(图片点击放大查看)

效果如下

1、当graylog-server进程死掉后就超过1,2,3分钟没有起来,前三分钟就每次一条告警 ,超过3分钟发送后续不再发送提醒的1条告警,后续不再发出告警

(图片点击放大查看)

2、当graylog-server进程恢复后提示恢复,就1条恢复告警

(图片点击放大查看)

当然这个脚本可以单独使用

相关文章
|
6月前
|
负载均衡 Linux 网络安全
Keepalived 实现 Kibana 的高可用
Keepalived 实现 Kibana 的高可用
|
6月前
使用Keepalived实现简单的GrayLog高可用
使用Keepalived实现简单的GrayLog高可用
68 0
|
tengine 负载均衡 应用服务中间件
Nginx+Keepalived高可用集群部署详细文档
Nginx+Keepalived高可用集群部署详细文档
|
运维 负载均衡 应用服务中间件
nginx高可用选型-keepalived
Keepalived 是一个用 C 语言编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础架构提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于众所周知且广泛使用的LVS (IPVS) 内核模块,提供第 4 层负载平衡。
231 0
nginx高可用选型-keepalived
|
负载均衡 应用服务中间件 nginx
Nginx+Keepalived 保障HA高可用
什么事应用程序的高可用 高可用性(high availability)通常用来描述一个系统经过专门的设计,从而减少停工的时间,而保持其服务的高度可用性
166 0
Nginx+Keepalived 保障HA高可用
|
负载均衡 安全 网络安全
构建Keepalived高可用集群
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器.
349 0
|
负载均衡 Ubuntu Linux
Mycat高可用方案-HAProxy+Keepalived
Mycat高可用方案-HAProxy+Keepalived
2210 0
Mycat高可用方案-HAProxy+Keepalived
|
应用服务中间件 Shell Linux
nginx通过keepalived实现高可用(主备方式)
nginx通过keepalived实现高可用(主备方式)
567 0
|
域名解析 负载均衡 应用服务中间件
|
负载均衡 JavaScript 应用服务中间件
Nginx负载均衡配置+keepalived高可用
Nginx负载均衡配置+keepalived高可用
3374 0