git push origin codeannotation ssh: connect to host bitbucket.org port 22: Connection timed out fatal: Could not read from remote repository.

$ git push origin codeannotation
ssh: connect to host bitbucket.org port 22: Connection timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

 

完美解决办法   windows  linux  找到.ssh目录

我做了下面提到的事情,它开始工作了。

 vim ~/.ssh/config

添加这些行并保存。

Host bitbucket.org
Hostname  altssh.bitbucket.org
Port  443

 

 

令人困惑的strtotime

经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…

这不, 刚刚就有人在微博上又问我:

鸟哥,今天是2018-07-31 执行代码:

  1. date(“Y-m-d”,strtotime(“-1 month”))

怎么输出是2018-07-01?

好的吧, 虽然这个问题看起来很迷惑, 但从内部逻辑上来说呢, 其实是”对”的, 你先别着急哈, 让我慢慢讲:

我们来模拟下date内部的对于这种事情的处理逻辑:

  • 1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.
  • 2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1

是不是逻辑很”清晰”呢? 我们也可以手动验证第二个步骤, 比如:

  1. var_dump(date(“Y-m-d”, strtotime(“2017-06-31”)));
  2. //输出2017-07-01

也就是说, 只要涉及到大小月的最后一天, 都可能会有这个迷惑, 我们也可以很轻松的验证类似的其他月份, 印证这个结论:

  1. var_dump(date(“Y-m-d”, strtotime(“-1 month”, strtotime(“2017-03-31”))));
  2. //输出2017-03-03
  3. var_dump(date(“Y-m-d”, strtotime(“+1 month”, strtotime(“2017-08-31”))));
  4. //输出2017-10-01
  5. var_dump(date(“Y-m-d”, strtotime(“next month”, strtotime(“2017-01-31”))));
  6. //输出2017-03-03
  7. var_dump(date(“Y-m-d”, strtotime(“last month”, strtotime(“2017-03-31”))));
  8. //输出2017-03-03

那怎么办呢?

从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让date自动”规范化”:

  1. var_dump(date(“Y-m-d”, strtotime(“last day of -1 month”, strtotime(“2017-03-31”))));
  2. //输出2017-02-28
  3. var_dump(date(“Y-m-d”, strtotime(“first day of +1 month”, strtotime(“2017-08-31”))));
  4. ////输出2017-09-01
  5. var_dump(date(“Y-m-d”, strtotime(“first day of next month”, strtotime(“2017-01-31”))));
  6. ////输出2017-02-01
  7. var_dump(date(“Y-m-d”, strtotime(“last day of last month”, strtotime(“2017-03-31”))));
  8. ////输出2017-02-28

那如果是5.3之前的版本(还有人用么?), 你可以使用mktime之类的, 把所有的日子忽略掉, 比如都限定为每月1号就可以了, 只不过就不如直接用first day来的更加优雅.

现在, 搞清楚了内部原理, 是不是就不慌了? 🙂

替代crontab,统一定时任务管理系统cronsun简介

摘 要

cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 近似。是为了解决多台 Linux  机器上 crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行)。支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用方便,是替换 crontab 一个不错的选择。

替代crontab,统一定时任务管理系统cronsun简介

 

一、背景

crontab 是 Linux 系统里面最简单易用的定时任务管理工具,相信绝大多数开发和运维都用到过。在咱们公司,很多业务系统的定时任务都是通过 crontab 来定义的,时间长了后会发现存在很多问题:

  • 大量的 crontab 任务散布在各台服务器,带来了很高的维护成本
  • 任务没有按时执行,甚至失败了很久才发现,需要重试或排查
  • crontab 分散在很多集群上,需要一台一台去看日志分析,头都大了
  • crontab 存在单点问题,对于不能重复执行的定时任务很伤脑筋
  • 我 X,crontab 被误删了,没备份?尼玛!
  • 我 Q,服务器要迁移,crontab 上的历史任务都是什么鬼?问了一圈居然都不知道

因此,我们非常需要一个集中管理定时任务系统,相信这也是的饱受 crontab 煎熬的运维或开发的心声。

二、选择

我们部门的开发人力一直都非常紧张,所以靠自己开发一套完善的定时任务管理系统不太现实。因此,希望找一个开源的系统来快速满足需求。

期间,我在网上看了不少相关文章,比如 http://ju.outofmemory.cn/entry/221885

发现这些系统对于我们的实际场景来说都过于臃肿,不太合适。偶然在 github 找了一个基于 Go 语言开源的定时任务集中管理系统—gocron,发现非常轻量,于是试用了一段时间。

不过最终我还是放弃了,因为 gocron 存在单点问题,项目地址:https://github.com/ouqiang/gocron

期间和作者有过一段时间的交流,提了不少改善建议,在和 gocron 作者交流期间,他针对我提到的单点问题,推荐了另一个开源项目:cronsun,也就是本文介绍的主角,通过试用,发现非常契合我们当前的使用场景,介绍如下:

cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 近似。是为了解决多台 Linux  机器上 crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行)。支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用方便,是替换 crontab 一个不错的选择。

Github 地址:https://github.com/shunfei/cronsun

cronsun 的部署架构如下:替代crontab,统一定时任务管理系统cronsun简介

三、部署

本文主要介绍功能,这里就简单写下关键步骤:

1、安装 MongoDB,强烈建议使用集群模式

2、安装 Etcd3,强烈建议使用集群模式

3、部署 cronsun

①、下载 cronsun:https://github.com/shunfei/cronsun/releases  (选择最新版本即可)

②、解压后修改 conf 目录下的配置文件:db.json 和 etcd.json,分别修改 MongoDB 和 etcd 的实际地址。

③、启动 web:./cronweb -conf conf/base.json (若要后台运行则使用 nohup)

④、启动 node:./cronnode -conf conf/base.json (若要后台运行则使用 nohup)

⑤、访问前台:http://x.x.x.x:7079/ui/

4、部署鉴权组件 aProxy,cronsun 在鉴权方面做的非常粗糙,所以这里用到了 cronsun 团队开发的 aProxy 鉴权组件,实现的原理为基于 Go 语言,反向代理了后端 WEB,从而实现域名和页面地址的访问控制,介绍地址:https://www.cnblogs.com/QLeelulu/p/aproxy.html

我们这边是要用到生产环境,所以在部署上会着重考虑到可用性和可靠性,这里贴一下我们这边的部署架构图,供参考:
替代crontab,统一定时任务管理系统cronsun简介

Ps:目前新版本已支持历史日志定期清理。

这里,Etcd 和 MongoDB 复用了 5 台服务器(后续会继续复用其他公共组件),其中 MongoDB 采用分片+副本集的模式。

四、功能

部署完成后,访问前台就能看到 UI 比较简陋 cronsun 管理 WEB 了:
替代crontab,统一定时任务管理系统cronsun简介

Ps:右上方选择熟悉的语言之后,基本就可以按照页面标签进行任务添加操作了。

1、添加节点

cronsun 基于 etcd 实现了自动发现和注册的功能,所以添加节点非常简单,直接将 cronnode 和 conf 拷贝到客户端服务器启动之后,就能在前台->节点页面看到该服务器了,当然节点和 Etcd 以及 MongoDB 之间的网络必须畅通。替代crontab,统一定时任务管理系统cronsun简介

2、节点分组

添加了所需的节点服务器之后,我们可以将节点进行分组,从而方便定时任务的添加:替代crontab,统一定时任务管理系统cronsun简介

3、添加任务

节点和分组都搞定之后,我们就可以开始添加定时任务了。定时任务填写的信息略微复杂,不过按照提示还是可以轻松搞定的:替代crontab,统一定时任务管理系统cronsun简介

上图我简单的标注了一些需要特别说明的地方,其他的选项大家看中文描述都能自行搞定。当然,还有一点要说明的是,任务脚本必须要有执行权限,否则任务会执行失败。

4、任务列表

添加完成任务之后,在任务标签页就能看到所有添加的定时任务以及执行情况了,这里可以使用分组过滤或节点过滤来筛选关心的任务。替代crontab,统一定时任务管理系统cronsun简介

每一个任务的右侧有 3 个小按钮:

①、成功/失败:显示最近一个任务的执行是成功还是失败,点击后可以查看到任务详情,包括任务输出数据:替代crontab,统一定时任务管理系统cronsun简介

②、latest 按钮:点击后查看改任务的近期执行情况

③、刷新符号按钮:点击后可以弹出立即执行功能,方便调试任务替代crontab,统一定时任务管理系统cronsun简介

五、小结

通过一段时间的灰度试用,可以确定 cronsun 在中小型规模场景下,是 crontab 的一个比较好的替代品,它能够帮助运维人员脱离 crontab 难管理、难运维的苦海。

当然,作为一款开源产品,cronsun 很多功能细节还有很大的提升空间,目前我也和 cronsun 团队长期保持联系,将生产环境使用过程中遇到的一些问题和建议一一反馈,相信这款产品能够继续打磨优化,更加完善、完美。

六、问题及更新【持续】

问题记录:

1、告警配置

首先要清楚 cronsun 的告警是由 cronweb 发出的,而不是 cronnode(但是 cronnode 的 mail.json 也必须 Enable:true,否则还是无法发出告警)。

其次,编辑 cronweb 和 cronnode 的配置文件:mail.json,如下内容

Ps:LocalName 建议留空,HttpAPI 模式未使用到,这里省略之,请自行测试。

最后启动 cronweb 即可实现邮件告警。

当然, 还需要在 web 上的单向任务界面开启告警才行,如下图所示:替代crontab,统一定时任务管理系统cronsun简介

Ps:cronweb 的 mail.json 配置中必须将 Enable 填为 true 才可以看到上图的告警开关按钮,否则不显示。

2、更新记录

详见 github 版本发布页面:https://github.com/shunfei/cronsun/releases

重要功能更新:

①、已支持脚本参数;

②、已支持历史日志定期清理;

③、3.1 版本开始使用 UUID 作为节点唯一标识。

 

 

https://zhangge.net/5129.html