停电后自动发送通知

 

      由于一旦公司停电需要采取一些措施, 故需要在停电后可以及时通知到相关人员, 开始还想着服务器是不是可以自带UPS供电的检测, 结果发现木有这种功能。 忽然想到停电时机房由于UPS所以可以继续工作几个小时, 而机房外的设备则都会关机, 那是不是可以通过在机房不断检测机房外的设备是否存活来指示是否停电了呢?

      既然有了方案,接下来就是实现了,因为有一些简单逻辑判断, 所以就不直接写脚本了, 而使用了node.js, 源码如下:

/************使用submail发送短信,请提前在submail申请短信服务,相关配置项Start*********************/
var projectIdPowercut = "11"; //templateId
var projectIdPoweron = "11"; //templateId
var appId = "11";
var appKey = "11";
/************使用submail发送短信,请提前在submail申请短信服务,相关配置项End**********************/
//需要定期ping的服务器,通过ping结果来判断是否已经停电
var serverAddresses = ['172.16.227.1'];
//通知短信接收人
var smsReceiver = ["131111111","181111111"];
//每10分钟检测一次
var detectPeriod = 1000 * 60 * 10;
//var detectPeriod = 1000 * 5;
var ping = require('ping');
var request = require('request');
//通过该变量保证每次停电只发送一次短信
var isAliveInlast = true;
function doPing() {
    serverAddresses.forEach(function (host) {
        ping.sys.probe(host, function (isAlive) {
            var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
            console.log(msg);
            if (!isAlive) {
                if (isAliveInlast) {
                    sendPowerCut(msg);
                }
                isAliveInlast = false;
            } else {
                if (!isAliveInlast) {
                    sendPowerOn(msg);
                }
                isAliveInlast = true;
            }
            setTimeout(doPing, detectPeriod)
        });
    });
}
function sendPowerCut(msg) {
    sendSMS(msg,projectIdPowercut);
}
function sendPowerOn(msg) {
    sendSMS(msg,projectIdPoweron);
}
function sendSMS(msg,pjId) {
    console.log("send msg:" + msg);
    var sendSmsOptions = {
        strictSSL:false,
        url: "https://api.submail.cn/message/multixsend",
        method: "post",
        json: true,
        body: {
            appid: appId,
            signature: appKey,
            project: pjId,
            multi: buildMultipleNums(),
        }
    };
    request(sendSmsOptions, function (err, response, body) {
        if (err) {
            console.log("SMS send failuer:" + err);
        } else {
            console.log("Send sunccess, response:" + body);
        }
    });
}
function buildMultipleNums() {
    return smsReceiver.map(x => {
        return {
            "to": x
        };
    });
}
doPing();

      你需要将这段脚本运行在一台有UPS供电的机器上(当然,建议使用pm2运行,做到开机自动后台启动),同时配置一台机房外的设备地址,例如可以使用一台路由器的Ip。

       发送短信使用的是submail, 直接将相关参数修改即可。

Posted in Uncategorized.

说说“X”AAS

 

      伴随着“云”服务的不断深入,软件架构领域也衍生了许多”X”AAS, 我们这里暂且做一个汇总分析。

IAAS

IAAS(Infrastructure-as-a-Service)基础设施即服务,这个是云服务厂商提供的最粗粒度的服务,消费者从云服务商的手中购买的是虚拟机,例如亚马逊的ec2,阿里云的ecs等,它极大减轻了用户在服务器硬件上的投入、后期运维的投入、以及网络环境的投入。

 

PAAS

PAAS(Plartform-as-a-Service)平台即服务,IAAS对用户可以认为只是提供了一个操作系统,但PAAS的话可以认为服务商给你提供好了web容器,也就是说程序员只需要将你的程序按照平台要求提供相应的运行环境要求并上传代码即可,PAAS服务商会自动将你的代码部署并运行。

 

CAAS

CAAS(container as a service)容器即服务,这里所说的容器为一个专有名词,指的是Docker技术中的容器,亦即Container, 在Docker技术中,Container可理解为一种很轻量级的虚机镜像,因为轻量级,所以一般会将相应的应用程序一起部署到Container中,对消费者提供的是各种Container镜像,例如mysql 的container,tomcat的container等,消费者可以忽略程序运行的基础环境准备,而仅关注与业务程序的研发。

SAAS

SAAS(Software-as-a-Service)软件即服务,SAAS是最常见的一种服务,譬如云盘、WebEx等, 可简单理解为通过浏览器即可进行接入使用的服务就是SAAS。

 

 

BAAS

BaaS(Backend as a Service)后端即服务,简而言之,就是通过云平台提供API的方式提供了许多服务,常见的有:

1. 全文检索

2. 消息推送、短信发送、邮件发送

3. 数据/文件存储

4. 后台任务

5. 在云服务上运行客户端的代码

6. 数据统计分析、日志

可以看出多数功能都是比较基础的,这也是应该的,平台也只能提供这些基础功能,把软件开发中的这些基础工作的开发时间、乃至后期运维的精力节省出来, 投入更多时间到具体业务上, 这也是软件开发团队所期望的事情。

目前这块的服务提供商业比较多,包括亚马逊、阿里云以及许多其他厂商。

FAAS

FAAS(Functions as a Service)函数即服务,这个可以按照字面意思理解,也就是说每个函数就是一个服务,当然一般也是通过http请求的方式来访问,想象一下我们一般在软件开发过程中所做的事情不就还函数调用吗? 所以采用FAAS的话,我想可能真的可以只是将函数部署到相关平台,由客户端发起函数调用、组合,应该是可以把运维人员解放出来,大家也不需要关系CPU、内存、网络之类的硬件环境了, 这其中以AWS Lambda为典型提供商,阿里云的函数计算也将计划于2016年底前推出。

       可以看出,这几个词汇从上往下,云服务的粒度是越来越细, 从早期的虚机服务,到后边的函数级的服务, 很难想象, 未来还会出现怎样的云服务。

       当然,粗或细粒度的云服务无好坏之分,需要哪个完全取决于你的应用及架构设计,不同粒度的云服务各有其应用场景, 实际情况下还是根据需要选择为好。

        这也带出了架构领域很火的一个词:Serverless, 从这几个名词看出,早期我们使用云服务厂商提供的虚机也就算是上了云,减少了我们本地发服务器,但到了现在的FAAS, 可能我们服务端连虚机都不需要了, 只需要将我们的业务函数提交到云服务平台即可,完全做到了无服务器。

Posted in Uncategorized.

科学上网新技能

       之前一直使用搬瓦工科学上网,虽然多数情况下速度不错,也还比较稳定,奈何偶尔会有IP被封的情况,必须解决这个后顾之忧。

        本来想着干脆买一个香港服务器得了,但查看了一下如果只一个人买的话价格有点高,我们都知道香港的服务器速度是最快的,退而求其次就找日本的了,目前亚马逊这些ec2服务器价格都不低,正好最近一直在使用Docker,就觉得Docker或许价格可以低一些,没想到一搜索发现有惊喜啊,首先是jelastic,可以免费使用14天,速度非常好,当然你一定要用它日本的服务器 https://app.jelastic.tsukaeru.net/

其次就是居然发现一个免费的Docker服务器:

日本樱花提供免费的docker服务,不限制用户注册地,不需要验证。

地址为:https://app.arukas.io

先注册用户,然后点击create app应用。

下面部署时候填写的img为:

lowid/ss-with-net-speeder:latest

下面的命令为:

ssserver -p 1111 -k 666666 -m aes-256-cfb

-p指的是内网的端口, -k后面是密码  -m 后面是加密方式

123

Posted in Uncategorized.

owncloud中的后台任务

      在某些时刻,一些事情我们不需要直接给予用户响应,为了提高性能, 我们会将这类事务处理放到一个后台任务中。

在owncloud中你只需要事项IJob接口或者QueueJob接口,然后通过

\OC::$server->getJobList()->add

添加即可。

        那怎样让这些Job得以执行呢, 我们需要通过Linux的crontab来进行任务调配,我们知道crontab可以指定任务的运行周期,所以owncloud目前也就没有实现自己的任务调度机制,而是每次被crontab触发的时候就会执行任务。

下边以ubuntu为例说明添加入crontab的过程:

sudo crontab -u www-data -e

通过该命令会让你选择一个文本编辑工具,选择自己熟悉的即可,然后将下边内容输入:

*/15  *  *  *  * php -f /srv/http/owncloud/cron.php

该句内容表示每15分钟运行一次cron.php (实际上cron.php内部会查询已经注册的所有job并运行)

在有些时候我们需要查询crontab的运行日志,而默认情况下ubuntu日志是关闭的,我们需要开启它:

sudo vim /etc/rsyslog.d/50-default.conf

然后将cron.*前的注释符号删除,保存

sudo  service rsyslog  restart

重启之后,即可在  /var/log/cron.log 中看到日志

 

另外一种添加的方法是    sudo vi  /etc/crontab

要添加新的crontab,只需要在文件最后增加即可。注意这里面需要指定用户名

调试

owncloud的后台任务目前我还没找到好的调试方法,我的做法是多写日志,然后在命令行中直接执行

sudo -u www-data php -f /srv/http/owncloud/cron.php

如crontab 没有成功,检测crontab 服务是否启动,

/etc/init.d/crond status

/etc/init.d/crond restart

如果没有日志生成,检查rsyslog是否启动

 

注意

一件比较奇怪的事情是如果我将这个*/15 * * * * php -f /srv/http/owncloud/cron.php存入文件放到/etc/cron.d/文件夹,貌似php代码没有真正执行,操作系统是ubuntu10, 原因未知!

 

Posted in owncloud. Tagged with .

Docker 中Hash Sum mismatch问题的解决方案

由于赵国特殊的网络原因,网络偶尔抽风就会导致我们在做apt-update时候出现Hash Sum mismatch的问题,进一步分析来看,

我们所使用的网络供应商,有些会设置一些透明缓存,以增加网络内部速度,减少出口的流量,你获取的某些文件不是源服务器上的真正文件,是从缓存中获取的,当缓存中获取的一些校验信息跟源中不一致的时候,自然提示校验失败,无法继续更新。
此问题实际上跟apt软件仓库的格式设计有关。新发布的版本的软件仓库更新比较频繁,按道理缓存中的文件应该同步更新,可惜因为多个镜像站点的有快慢,因此造成了缓存无法保证一致性。
当网络提供商足够有实力,不设至透明缓存时,这个问题是不存在的。这就是为什么有些人反馈使用无线上网卡(移动、联通的3g网络)就一切OK,一单换回长城宽带、或者宽带通就不行了。
以上就是问题出现的真正原因。
我的家中网络是宽带通,毫无疑问这种网络ISP肯定会设置透明缓存。
解决方案很简单,绕过缓存直接访问站点即可。

值得称赞的是国内好几家良心企业提供了更新源,其中速度最好的应该是阿里提供的http://mirrors.aliyun.com/

以debian为例, 访问http://mirrors.aliyun.com/help/debian 可以看到修改方法。

具体到Docker中, 我们需要修改Docker file,添加如下代码:

RUN echo 'deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\
deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib'  > /etc/apt/sources.list

另外,如果你是在阿里云服务器中,可以将域名替换为mirrors.aliyuncs.com,这样可以免公网流量。

Posted in Uncategorized.