Redis 事件通知

2018-08-03 11:50 更新

在sentinel中,如果出現(xiàn)warning以上級別的事件發(fā)生, 是可以通過如下配置進(jìn)行腳本調(diào)用的(對于該腳本redis啟動用戶需要有執(zhí)行權(quán)限):

sentinel notification-script mymaster /redis/script/notify.py

比如說,我們希望在發(fā)生這些事件的時候進(jìn)行郵件通知,那么,notify.py就是一個觸發(fā)郵件調(diào)用的東東,傳入第一個參數(shù)為事件類型,第二個參數(shù)為事件信息:

#!/bin/python

from sendmail import send_mail
import sys

event_type = sys.argv[1]
event_desc = sys.argv[2]
mail_content = event_type + ":" + event_desc

send_mail("xxxx@qq.com",
          ["xxxxx@cmbc.com.cn","xxxx@gmail.com"],
          "Redis Sentinel Event Notification Mail",
          mail_content,
          cc=["xxx@gmail.com","xxx@139.com"],
          bcc=["xxxx@qq.com"]
        )

有兩個注意事項: 1) 這個時候如果集群發(fā)生了切換會產(chǎn)生很多事件,此腳本是在每一個事件發(fā)生時調(diào)用一次,那么你將短時間收到很多封郵件,加上很多的郵件網(wǎng)關(guān)是不允許在一個短時間內(nèi)發(fā)送太多的郵件的,因此這個僅僅是一個示例,并不具備實際上的作用。 2) 一般我們會采用多個sentinel,只需在一個sentinel上配置即可,否則將同一個消息會被多個sentinel多次處理。

附sendmail模塊代碼:

import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import Encoders
from email.message import Message
import datetime

def send_mail(fromPerson,toPerson, subject="", text="",files=[], cc=[], bcc=[]):
    server = "smtp.qq.com"
    assert type(toPerson)==list
    assert type(files)==list
    assert type(cc)==list
    assert type(bcc)==list

    message = MIMEMultipart()
    message['From'] = fromPerson
    message['To'] = ', '.join(toPerson)
    message['Date'] = formatdate(localtime=True)
    message['Subject'] = subject
    message['Cc'] = ','.join(cc)
    message['Bcc'] = ','.join(bcc)
    message.attach(MIMEText(text))

    for f in files:
        part = MIMEApplication(open(f,"rb").read())
        part.add_header('Content-Disposition', 'attachment', filename=filename)
        message.attach(part)

    addresses = []
    for x in toPerson:
        addresses.append(x)
    for x in cc:
        addresses.append(x)
    for x in bcc:
        addresses.append(x)

    smtp = smtplib.SMTP_SSL(server)
    smtp.login("xxxx@qq.com","xxxx")
    smtp.sendmail(message['From'],addresses,message.as_string())
    smtp.close()

最佳實踐:采用ELK(Elastic+Logstash+Kibana)進(jìn)行日志收集告警(ElastAlert用起來不錯),不啟用這個事件通知功能。如果你的環(huán)境中沒有ELK,或者啟動一個Tcp Server進(jìn)程,notify腳本將事件通過tcp方式吐給這個server,該Server收集一批事件后再做諸如發(fā)郵件的處理。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號