作者文章归档:seraphln

作为一个RD对运维工作的一些思考


我一直认为做一个『高效』的程序员,是每一个从业者最应该秉持的追求。什么是『高效』?

良好的编码风格

我一直认为,代码就好比文章。读一份符合规范的源代码就好像看到一篇书法大家的作品一样赏心悦目,有时甚至都能从一些细节中揣摩到很多高超的技巧,让自己的水平也能在不经意间得到提升。 反之,如果这份源代码写的一塌糊涂,对于读代码的人来说就是一种折磨,甚至在读完之后都不知道对方要表达什么。

什么是好的代码风格

现在的程序员要比上世纪的前辈们幸运很多了,因为前辈们通过自己的不断摸索,已经制定了一套相对完善的代码规范,

===== 插入代码规范例子

遵循这些规范我们就能书写出一份相对很不错的代码了。

如...

Read more

记录由于redis启动失败导致Harbor服务崩溃的问题


背景

最近服务运行在k8s集群,为了省事儿,也把Harbor以及Harbor需要用到的组件也放到了k8s中。在最近的一次上线中发现节点不能更新镜像了。查看pod的状态时,发现Harbor需要用到的Redis服务的master节点状态异常(Error or Crash)。查看日志,发现有相应的报错信息:

Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

原来是因为Redis在将aof文件...

Read more

记录非root用户使用docker时提示没有权限的问题


背景

之前部署的K8S环境在root用户下,这样的部署方式虽然用起来没有什么问题,但是直接使用root权限操作线上机器也依然存在着安全隐患。因此决定使用非root用户(比如work用户)来进行日常升级操作。 对于K8S和Helm来说,从root用户迁移到work用户下比较简单,只需要将 /root/.kube/config 拷贝到/home/work/.kube/config即可。 但是当使用work用户操作docker时会报错,报错信息为:

permission denied

错误原因

Docker报错的原因是这样: 在Linux中,Docker使用了一个Unix Domain Soc...

Read more

k8s同步pod的时区


背景

最近在开发时发现由于RD在打镜像时没有注意时区问题,有一些镜像的时区不是东八区,导致业务逻辑出现异常(登录token失效、数据库创建时间不正常)。因此需要同步k8s pod的时区。

解决办法

有2个办法可以解决这个问题:

  1. 修改打镜像的Dockerfile,正确处理时区问题
  2. 部署应用时,单独读取主机的“/etc/localtime”文件,即创建pod时同步时区。

方案1的好处是,不需要修改集群的配置,一劳永逸的解决问题。但是缺点是需要修改Dockerfile,需要重新打镜像。

方案2的好处是,不需要重新打镜像,pod直接读取宿主机的时区。但是缺点是每个pod都要设置。(老的pod...

Read more

使用Python Coverage获取测试覆盖率


Coverage

当我们完成测试用例的编写之后,需要知道测试用例对整个代码的测试覆盖情况。此时可以使用Coverage工具运行测试用例并统计扫描结果。 在Python中,使用Coverage.py作为Coverage工具。Coverage可以执行测试用例,并生成HTML或者XML格式的报告。

安装

在控制台执行python -m coverage,如果有类似输出:

Code coverage for Python. Use 'coverage help' for help.

说明已经安装过。如果没有安装的话,可以执行: pip install coverage

就可以完成coverag...

Read more

编码前的思考


项目需求背景

PM针对于一个项目产品提出了数据报表平台的需求,而你作为RD要对这个数据报表平台进行开发。

作为一个RD,在编码之前,你应该首先有如下的思考:

确认需求内容

定义系统的输入输出

在这个例子中,应该是报表数据的来源是哪些,已有的数据是否已经满足所有的需求内容。 输出就应该是满足所有数据统计报表需要的统计信息。

定义接口

接口是跟前端页面交互的API。接口风格可以是restful,也可以是rpc。 接口的测试用例需要经过评审。

从用户角度去思考这个需求应该满足的条件,包含不限于:交互流程、响应时间

不仅仅是完成功能,还要站在用户的角度去思考已经做完的功能是否可用、是否好用、是否...

Read more

那个熟悉的罗马不见了


一转眼,这个赛季的意甲又要结束了。罗马在经历了一个赛季的动荡之后,最终排名第六,无缘下赛季的欧冠联赛。然而,相比于无缘欧冠,大师兄的离队对于我来说,是一段青春的结束,只能剩下追忆了。

第一次与罗马结缘还是在01年的夏天,当时站在一堆球衣前犹豫好久不知道买哪个。最后还是小伙伴推荐说买罗马的吧,刚拿了冠军,特别厉害。从那个夏天开始,我最喜欢的球队这个问题有了一个新的答案,就是罗马队。虽然它不是第一个答案,却是到目前为止的唯一一个。如果不出意外,也应该是最后一个了。这么多年来,经历了老森西对罗马的爱,也经历了因为拮据不得不卖掉葵花的伤感;见证了村长的一人一城,也等到了大师兄的最后一场比赛。曾经...

Read more

使用Python的unittest框架编写测试用例


unittest是Python语言中的xUnit测试框架实现。也是在开发中最常用的用来写单元测试的框架。本文将介绍一下什么是unittest以及如何使用unittest开发单元测试。

找到需要测试的目标

要写测试用例,首先需要知道我们要测试的目标是什么,在本文中,我们以一个简单的乘法函数作为待测试对象,这个函数的实现如下:

def multiply(x, y):
    """
    将2个给定的参数相乘,并返回结果

    Args:
        :param x: 乘法算子x
        :param y: 乘法算子y
    Returns:
        x * y...

Read more

搭建主从复制的PostgreSQL集群


背景

由于项目需要使用PostgreSQL作为持久化数据库,但是在公司内部并没有一个稳定公共的PostgreSQL数据库集群服务来用,因此需要自己搭建一套高可用的PostgreSQL服务。 在这里将搭建的过程记录下来,方便后续查阅。

安装

资源

操作系统

本文中安装Postgres数据库的操作系统为CentOS7.2

机器和IP地址

本文是在2台CentOS7.2的机器上部署主从复制的PostgreSQL,这2台机器的IP为:

主节点: 192.168.0.2
复制节点: 192.168.0.3

数据库用户名和密码

user: xxx
password: xxx

数据目录

/data/p...

Read more

搭建基于spiped代理的加密Redis Master/Slave服务


背景

由于业务的需求,线上的Redis服务需要部署到公网上。考虑到数据的敏感性,因此不希望数据在公网上是明文传输的。

所以需要引入SSL/TLS来加密传输的数据,从而保证数据在一定程度上的安全性。

鉴于目前的Redis并没有官方支持的ssl/tls通信功能。所以只能通过SSL代理来实现。在这里选择了Spiped作为SSL的代理工具。

Spiped的项目地址是:https://github.com/Tarsnap/spiped

官方地址是:http://www.tarsnap.com/spiped.html

部署

Redis2台机器,IP、端口分别为:

1. 192.168.1.100:3...

Read more