简易注册中心监控NAS断电断网

本文涉及的产品
文件存储 NAS,50GB 3个月
简介: 日常使用NAS过程中,偶尔会出现家里断电或者断网的情况,NAS自带网络断开的通知功能,但需要是恢复网络链接后才会通知,而此时都恢复了,再通知也就没那么重要,还有断电情况下也是需要回家才能知道,断电保护可以使用UPS,当停电后UPS通过usb数据线会给NAS发送通知

日常使用NAS过程中,偶尔会出现家里断电或者断网的情况,NAS自带网络断开的通知功能,但需要是恢复网络链接后才会通知,而此时都恢复了,再通知也就没那么重要,还有断电情况下也是需要回家才能知道,断电保护可以使用UPS,当停电后UPS通过usb数据线会给NAS发送通知,NAS收到通知后在设定时间内关机并发送ups进入电池供电模式的通知,但这个方式需要购买ups设备,成本在300元左右。

注册中心原理

联想到注册中心等其他集群模式下的心跳连接,心跳超时则进行剔除的方式,自己便用python写了一个简单的web服务当作注册中心,再写一个定时任务每隔5秒扫描一遍最近注册时间数据,对比下来如果超时60秒以上,则认为NAS已经失去链接,立刻发送邮件/钉钉通知,当NAS重新上线连接后,定时任务扫描到注册信息会再发送已经连接的通知信息。

NAS端原理

上文已经通过python提供了一个web服务,此时只需要在NAS端任务计划中创建一个每分钟的定时任务即可,定时请求心跳接口,服务端记录请求时间。

或者在docker里启动一个定时任务,crontab命令

service cron start

*/1 * * * * curl http://ip:2580/register                            

服务端代码

启动python的命令,需要在后台运行

ps -ef|grep python

nohup python3 nas_health.py  &

nohup python3 nas_register.py  &

nas_register-类似于注册中心的概念,提供一个get接口供NAS访问

# -*- encoding: utf-8 -*-

import os

import datetime

import tornado.web



class MainHandler(tornado.web.RequestHandler):

   def get(self):

       """get请求"""

       now = datetime.datetime.now()

       out = open("nas_datetime-" + str(now.year) + '-' + str(now.month) + '-' + str(now.day), 'a')

       out.write(str(now) + '\n')

       out.close()

       self.write("")



application = tornado.web.Application([(r"/register", MainHandler)],

                                     static_path=os.path.join(os.path.dirname(__file__), "static"), )



# 读取文件中的数据

def read_txt_file(file_name):

   newFile = open(file_name)

   data = newFile.read()

   newFile.close()

   return data



if __name__ == "__main__":

   application.listen(2580)

   tornado.ioloop.IOLoop.instance().start()


nas_health-定时扫描日志文件,对比注册时间

# -*- encoding: utf-8 -*-

import datetime

import time

import smtplib

from email.mime.text import MIMEText

from email.header import Header



# 读取文件中的数据

def read_txt_file(file_name):

   newFile = open(file_name)

   data = newFile.read()

   if data == '':

       return ''

   now = ''

   for line in data.split('\n'):

       if line == '':

           break

       now = line

   newFile.close()

   return now



def loop_monitor():

   email_state = True

   while True:

       try:

           file_now = datetime.datetime.now()

           now_str = read_txt_file(

               "nas_datetime-" + str(file_now.year) + '-' + str(file_now.month) + '-' + str(file_now.day))

           if now_str == '':

               continue

           now = datetime.datetime.strptime(str(now_str), "%Y-%m-%d %H:%M:%S.%f")

           now2 = datetime.datetime.now()

           print((now2 - now).seconds)

           if (now2 - now).seconds >= 60 and email_state:

               email("心跳已经超时", "xxx@xxx.com")

               email_state = False

           if (now2 - now).seconds < 60 and email_state == False:

               email_state = True

               email("心跳已经恢复", "xxx@xxx.com")

       except Exception as e:

           print("时间错误", e)

       time.sleep(5)  # 暂停5秒



def email(text, toemail):

   sender = "xxx@xxx.com"  # 发送方的邮箱

   password = "xxxx."  # 邮箱的授权码

   receiver = toemail  # 接收方的邮箱

   data_time = time.strftime("%Y-%m-%d %H:%M:%S")

   subject = data_time + "Nas服务器心跳报警"  # title邮件标题

   words = text  # text邮件内容

   msg = MIMEText(words, 'plain', 'utf-8')  # 中文需参数‘utf-8',单字节字符不需要

   msg['Subject'] = Header(subject, 'utf-8')  # 邮件标题

   msg['from'] = sender  # 发信人地址

   msg['to'] = receiver  # 收信人地址

   smtp = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)

   smtp.connect('smtp.exmail.qq.com')

   smtp.login(sender, password)

   smtp.sendmail(sender, receiver, msg.as_string())

   smtp.quit()



if __name__ == "__main__":

   loop_monitor()


相关实践学习
基于ECS和NAS搭建个人网盘
本场景主要介绍如何基于ECS和NAS快速搭建个人网盘。
阿里云文件存储 NAS 使用教程
阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例、HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。 产品详情:https://www.aliyun.com/product/nas
目录
相关文章
|
运维 测试技术
6月27日阿里云故障说明
6月27日下午,我们在运维上的一个操作失误,导致一些客户访问阿里云官网控制台和使用部分产品功能出现问题。故障于北京时间2018年6月27日16:21左右开始,16:50分开始陆续恢复。对于这次故障,没有借口,我们不能也不该出现这样的失误!我们将认真复盘改进自动化运维技术和发布验证流程,敬畏每一行代码,敬畏每一份托付。
10702 2
|
2月前
|
Kubernetes 网络协议 Docker
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
|
3月前
|
运维 监控 容灾
双活中心数据零丢失
双活中心数据零丢失
32 5
|
数据安全/隐私保护
服务器迁移中心
服务器迁移中心
93 0
|
弹性计算 运维 网络安全
一次阿里云ECS主机上挂载文件存储NAS的排障过程记录
一次阿里云ECS主机上挂载文件存储NAS的排障过程记录
483 1
一次阿里云ECS主机上挂载文件存储NAS的排障过程记录
|
运维 监控
|
运维 文件存储
netspp nas 故障处理
处理记录
141 0
|
存储 缓存 网络安全
阿里云存储网关备份数据
阿里云存储网关备份数据一、创建云控制台网关在阿里云云存储网关控制台创建网关集群,然后继续创建云下网关。创建好网关后,就可以下载镜像和证书,为以后的安装作好准备。参考章节“线下网关安装部署”:https://help.aliyun.com/document_detail/108239.html 二、本地数据中心安装存储网关1、下载云存储性能型文件网关镜像,参考章节“线下网关安装部署”https://help.aliyun.com/document_detail/108239.html 2、参考章节“一般性问题”的安装镜像。
1336 0
阿里云存储网关备份数据
|
监控 容器 Perl
纳管集群接入日志服务
接入日志服务 在容器服务的应用目录里找到“ack-sls-log-controller” 填入合适的参数后,“创建”即可,图中红框标注处均需要填入自己集群对应的值 如果集群和vpc有专线打通 InstallParam参数可以去掉'-internet'后缀 Endpoint参数可以在{regio.
2604 0
纳管集群接入日志服务
|
弹性计算 运维 监控
使用云监控和函数计算,秒级恢复故障
### 云监控发布新feature,打通事件中心和函数服务,可以实现秒级故障恢复。 ### 试想这样一个场景: 当ecs宕机时,在几秒内实现eip自动迁移至另一个健康的ecs实例,快速故障恢复,避免损失。 ### 如何做到? 云监控之前推出了事件中心,定位于,将阿里云上发生的对用户有影响的事件,集中起来,统一展示,统一管理;同时,__可以实现在云产品异常事件发生的第一时间,对用户广
1870 0