阿里云身份管理与访问控制之信任管理: 角色扮演, 临时身份和安全令牌

本文介绍了阿里云访问控制中的角色扮演和临时身份特性。这两个特性帮助客户管理好对合作伙伴, 云服务协同应用, 以及客户应用服务的信任与访问授权, 构成了阿里云安全受控的合作生态的技术基础设施的一部分。

信任管理

云平台中的资源, 我们可以授权给信任的员工, 合作伙伴, 平台服务, 我们自己部署的应用等不同的身份来访问.

  1. 合作伙伴A来负责代运维一组Linux服务器, 除此以外不能访问其他资源; 合作伙伴B来负责维护RDB服务, 除此以外不能访问其他资源;
  2. 授权给阿里云的多媒体处理服务来处理存放在OSS中指定目录中的图片和视频, 但不能访问其他目录里中的资源.
  3. 部署在ECS中的运维工具, 能够根据负载变动情况, 自动关闭一些ECS机器, 或自动升级或启动一些ECS机器.

这些应用场景中的信任管理, 都是通过角色扮演和临时身份实现的.

角色扮演

阿里云账号中的资源分权访问, 对于员工可以使用子用户来实现. 对于不适合子用户(含子用户组)授权的情况, 采取基于角色扮演的授权方法更安全便捷.

比如, 合作伙伴帮助做运维时, 会在他们自己的主账号中管理自身的员工子用户, 我们所需要做的是创建一个(或多个)与他们的主账号绑定的角色,  并把角色与合适的访问控制策略绑定.

如上图,我们的主账号为A1,两家服务商的主账号分别为P1和P2。在我们的访问控制管理界面上,我们可以创建角色A1P11和A1P21,分别绑定了子账号P1和P2。服务商P1可以在自己的访问控制管理界面上,授予其子用户P1U1、P1U2、P1U3等扮演角色A1P11的权限;服务商P2可以在自己的访问控制管理界面上,授予其子用户P2U1、P2U2 …

Continue Reading

阿里云身份管理与资源访问控制入门 - 子账号登录

像阿里云这样的大型公有云平台, 通常都提供了很多的云计算资源, 一定规模的企业用户会有多个工作人员需要管理不同的资源, 此时如果仍然使用单一账号来进行操作, 不符合信息安全的要求. 阿里云提供了"访问控制"服务, 提供简单的用户身份管理和丰富的资源访问管理的功能, 可以创建多个用户. 用户可以属于不同的用户组, 用户或组可以赋予不同的访问控制策略, 从而帮助企业客户实施简单的账号管理和安全的访问控制.

值得一提的是, 身份与访问控制管理一般简称为IAM, 即 Identity and Access Management. 不过, 在阿里云, 它被称为 RAM, 即 Resource Access Management, 强调了以云计算资源为中心的访问控制模型. 只是这个简写通常是计算机内存的简写, 第一眼看起来让人困惑.

阿里云提供了一个5分钟左右的视频, 介绍了"访问控制"服务的简单操作, 非常易懂. 其产品概述链接为 https://www.aliyun.com/product/ram

本博文是作者在观看了上述链接中的视频简介, 开通了个人账号的"访问控制"服务, 初步实验以后所做的笔记.

引入了访问控制模型以后, 原来的账号 …

Continue Reading

异步并发程序的技术选择

异步,是相对于同步(顺序)而言的。并发,是相对于单一而言的。

异步执行,而不是同步阻塞。比如程序需要去读写文件,然后再执行一个不相关的任务。我们可以改造这个程序,把读写文件的操作变成异步的,不等它执行,就去执行下一个不相关的任务。再在程序结束前等待异步读写文件的步骤完成。这种方法,能缩短这个程序的响应时间。这种改造,适合响应实时性要求高的程序。值得注意的是,这种方法并不意味着并发多任务。如果异步执行的是IO,通常意味着异步IO库的支持;如果异步执行的是其他的本地耗时代码,则通常意味着使用使用一个线程池,此时就属于并发执行了。

操作系统创建进程、线程,都是相对耗时的操作。因此,现代语言大部分都提供了线程池,复用这些内核对象。这是进行并发程序设计时需要注意的。

程序并发执行时,如果访问共享的资源,则需要保证合理的访问顺序,从而获得预期的执行结果。锁定、互斥,是常用的控制方法。

并发执行的程序步骤,我们时常会遇到任务之间存在依赖的情况。任务之间的等待管理也是程序设计中常遇到的问题。早期经常使用 callback。近来来经常使用 Future Promise 来将互相依赖的并行任务串起来。而 …

Continue Reading

查看压缩日志文件 gunzip -c service.log.gz | less

我今天收到了一个邮件, 说我们的服务在5月2日时有一个500 Internal Server Error. 我们的日志是每天都会压缩的, 因此5月2日的日志是gz压缩格式的.

一般来说, 我会先把文件解压, 然后再用vi来打开查看, 查看完毕以后还应该删除掉. 今天在查看gzip的man page时, 发现它其实可以把解压内容输出到标准输出. 这样就省去了前面的两个手工步骤, 方便多了.

gunzip -c service.log.gz | less

-c 表示输出到 console (stdout).

然后我们就可以使用管道将日志传给less命令来查看和查找定位错误信息.

题外话:

服务的日志应该被实时发送给日志处理与分析服务. 使用类似elasticsearch和kibana这样的工具来提供一个日志存储索引及查询的平台, 对于服务数量较多的团队而言, 是十分必要的.

Continue Reading

数据库变更管理 Database Migration

代码化的数据库版本控制, 是有效管理数据库变更的利器, 这样的工具一般称为 database migration tool. 这种工具是DevOps在数据库领域的运用之必备。

Database Migration Tool的功能

一个好用的Database Migration Tool通常具有以下功能:

  1. 既支持使用我们拿手的编程语言来编写, 又支持SQL及数据库扩展的SQL语法编写, 还支持将应用开发语言编写的变更翻译成SQL格式的. 从而满足开发, 测试, 运维及数据库管理等多种角色的需要.
  2. 支持升级(upgrade)和降级(undo, downgrade).
  3. 既支持命令行执行, 又有API可以集成到自动化流程中.
  4. 既支持从零开始维护数据库的变更记录, 也支持中途转入使用该工具来管理变更.
  5. 支持预览模式, 方便变更审核.

本文接下来介绍几种常见的此类工具.

Java - Liquibase

Liquibase网址: http://www.liquibase.org/index.html

Liquibase以XML格式表达ChangeSets, 以XML, JSON, YAML, SQL等格式描述changelog.

Liquibase的商业化版本为Datical, 其团队的重心转到了Datical上, 因此Liquibase的网站看起来也比较陈旧.

Java - Flyway …

Continue Reading

How to disable macOS services

The command line tool "launchctl" can be used to manage agents and services.

I need to disable a few services in my old MacBook. That's why I am writing this post.

List services

sudo launchctl print system

The print sub-command helps us view the services with the correct name that …

Continue Reading

Javascript 函数参数的一种有趣写法

最近,我见到下面这样的Javascript函数写法:

function hello({name, title}){
  console.log(`Welcome the ${title} ${name}`)
}

// call it.
const param = { name: 'Jack', title: 'Developer', company: 'LabX'}
hello(param);

上面这种函数定义方式,相当于

function hello(params){
const {name, title} = params
//...
}

这样看起来就更容易理解了。

Continue Reading

老树新芽:在MacBook Pro上装Ubuntu Linux Desktop

老MacBook Pro随着Mac OS X的升级,越来越慢了,基本上不能用了。之前时不时听到其他人提到可以安装为Windows 或 Linux。今天总算付出行动,装上了Ubuntu Linux Desktop。

首先,怎么进入Bios?MBP (MacBook Pro)没有BIOS的说法,在重启(或启动)时,一直按option键,系统在启动时就可以选择启动设备,从而可以开始安装新的系统了。

从ubuntu官方网站上下载镜像,并根据它的说明,用一个u盘制作一个启动u盘。然后,就可以按上面的步骤进行安装了。剩下的步骤跟平时安装没有差别。

在将ubuntu ISO文件制作成启动u盘时,我用的工具是ubuntu推荐的rufus,界面简洁。

安装完成以后,我试用了一下。对于我的使用场景来说,系统的响应速度的确是快多了。

Continue Reading

SQLAlchemy中如何设置数据库连接参数

我们的Python编写的服务程序使用了SQLAlchemy访问数据库系统(MySQL). 为了满足PCI DSS安全性合规的要求, 我们需要使用TLS v1.1或TLS v1.2来加密数据库连接.

在配置好了数据库服务器端的TLS以后, 我们还需要配置数据库客户端的参数. 对于MySQL客户端来说, 最少应该配置 TLS CA的路径. 我们使用了MySQL Connector/Python作为数据库连接驱动程序, 它支持的配置参数是 ssl_ca. 我们不是直接使用MySQL Connector/Python, 而是通过SQLAlchemy来调用的, 因此我们需要寻找SQLAlchemy中的配置.

在SQLAlchemy中, 与数据库连接相关的是其Engine对象. Engine的配置可以分为两类. 第一类是对于SQLAlchemy而言的, 与底层的数据库驱动程序无关的; 第二类是特定于底层的数据库驱动程序的. 第一类主要与连接池, 字符编码等有关. 因此, 我们所需要的ssl_ca属于第二类的配置.

SQLAlchemy提供了三种方式来提供特定于数据库驱动程序的参数设置方式.

方式一: 附加于连接字符串之后.

mysql+mysqlconnector://user:password@host:port/dbname?ssl_ca=/etc/pki/ca …

Continue Reading

Ubuntu 18 网络配置 netplan 和 systemd-resolve

我所了解的网络配置命令和文件是 ifconfig /etc/network/, /etc/resolv.conf等。然而在新版的Ubuntu 18中,这些地方的配置文件上,都标准了 “Don't edit",都迁向了更新的工具。例如,使用netplan来配置dhcp客户端或静态地址、网关、特定于网络接口的dns等;使用systemd-resolve和/etc/systemd/resolv.conf来管理和配置全局性质的域名解析等。

这些新的工具,在兼容旧体系的同时,提供了更方便、更强大的功能。作为运维开发人员,我们需要不断学习。

Continue Reading

Upgrade npm in Ubuntu

在Ubuntu上安装 npm时,版本很低。

sudo apt install npm
npm --version
3.5.2

这样的版本,对很多新的应用而言,太低了。例如,当我使用 create-react-app这个应用时,就提示我说,我的npm版本太低了,建议我升级到 npm 5以上。

通过 apt 不能升级。但通过npm能。

sudo npm install -g npm

这样实际上会导致系统中存在两个npm。一个是通过 apt 安装的,在 /usr/bin/npm;另一个是 通过npm安装的,在 /usr/local/bin/npm。由于在PATH变量中,/usr/local …

Continue Reading

Use microk8s to make a kubernetes environment in Linux

注意:从 github上来看 microk8s的状态不好,有100+的issues,且其build状态为failed。暂停关于microk8s方面的任务。

The microk8s is a good entry level tool to help us get started with kubernetes.

To install it, refer to
https://microk8s.io/docs/ .

After that, when we want to access the api server, we'll need the default username and password. It …

Continue Reading

常见的标准化组织

国际标准 ISO, International Organization for Standardization, www.iso.org. 我们常见的ISO标准有 "ISO 9001 质量管理, ISO 9001:2015", "ISO/IEC 27001 信息安全管理"。在学习计算机网络时,我们会遇到的一个经典的网络模型OSI就是一个ISO标准 "ISO/IEC 7498-1"。而我们常见的编程语言C也是有ISO标准的,而且每五年更新一次:”ISO/IEC 9899:2011, ISO/IEC 9899:2011/Cor 1:2012, ISO/IEC 9899:2018"。

另一个国际标准,IEC,国际电子技术委员会,制定了一系列的电子技术等相关的标准。命名为 ISO/IEC 是ISO与IEC合作的标准 …

Continue Reading

wordpress中使用 htaccess要注意的几点

在Apache2中, 可以使用htaccess 给一个特定目录下的路径提供特定的配置.  wordpress中把rewrite 规则写入到htaccess中的来实现permanent links.

Apache2中的htaccess默认是没有激活的. 对于一个Directory, 我们需要提供 AllowOverride All来激活htaccess.

``` {.EnlighterJSRAW data-enlighter-language="null"} AllowOverride All

Other options.

wordpress后台管理在设置permalink时, 需要具有写 .htaccess文件的权限. 我们可以把wordpress目录的所有者改为apache2进程的用户.

``` {.EnlighterJSRAW data-enlighter-language="null"}
$ sudo chown www-data /var/www/wordpress/
$ cat /var/www/wordpress/.htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index …

Continue Reading

React and Redux

React for view. Redux for State. Integration React with Redux 1. map Redux actions to React event handlers as React props. 2. map Redux state to React props for rendering only. 3. When a user interacts with React UI, the handlers can 'dispatch' actions to Redux. 4. The Redux Reducers …

Continue Reading

Pandas Getting Performance

http://pandas.pydata.org/pandas-docs/version/0.24/user_guide/enhancingperf.html?highlight=performance

For intensive ndarray computing (loops): - use cython with numpy - use numba with numpy

在引入更复杂的基础设施(如k8s、多进程)等方式之前,先使用算法、语言级别的性能优化。而在执行优化之前,先应该找到瓶颈。既可以使用小代码片段和模拟数据来验证代码(或算法)的性能,或小规模数据使用profile来看,也可以往代码中加入时间开销打印输出等方式来寻找(尤其是在函数体内)。

比如,我在做MCS的统计分析时,一开始猜测是df的loop开销大,花了力气优化。但后来按步骤,先加入时间开销打印语句,找出来时间开销是在df.loc[i,j …

Continue Reading

Get started with Kubernetes - minikube + Docker on Windows 10

NOTE(Justin): 从minikube开始但又定制选项的情况下, 遇到问题很难处理. 不如从基础起步, 逐步增加内容.

Install kubectl

With chocolatey,

$ choco install kubernetes-cli
# Installed to C:\ProgramData\chocolatey\lib\kubernetes-cli\tools

References: https://kubernetes.io/docs/tasks/tools/install-kubectl/

Create a VM with docker-machine

Create virtual switch 'aexv' first. 然后使用 docker-machine 来创建一个 有docker的虚拟机. 这里需要取消proxy设置, 否则容易出现网络问题.

$ docker-machine --native-ssh create -d hyperv …

Continue Reading

Python Debugger pdb with Examples

Debugger概述

在开发环境中,使用IDE集成的Debugger(调试工具)进行Debug,能帮助我们开发人员看到代码运行时的状态,对于排查疑难问题,很有帮助。一般来说,Debugger允许我们设置断点,让代码执行到断点时暂停,以便于我们查看断点附近的状态;然后以单步执行的方式,一次只执行一条语句,以便于我们观察状态的变化;也允许我们进入到调用函数内,跟踪函数内代码执行的状态。Debugger还提供更多的调试设置选项,快速地忽略其他代码的执行或从很深的调用堆栈中跳出来,让我们可以关注问题点。

一般来说,IDE的debugger是基于命令行的debugger的。直接使用命令行,一般有两种情况:

  1. 在不能使用IDE方式时,代替IDE进行debugger。比如,在集成测试环境中,服务器没有提供GUI用户界面,不能运行开发环境IDE。这时可以使用远程debugger,或者命令行方式的debugger。
  2. 脚本化调试过程。对于某些复杂的调试场景,基于命令行debugger编写调试脚本,提高调试效率。

本文介绍的是Python的命令行debugger工具包pdb。

如何进入Debugger

假设我们有一个脚本 example.py 需要调试,

python -m pdb example.py

这样会执行到脚本的第一行代码并停顿下来。

pdb 本质上是一个Python的模块 …

Continue Reading

web app manifest

Web app manifest 是一种 Web 应用的说明文件,能让 Web 应用像本地应用一样地被添加到用户设备的桌面,便于用户查找和启动。它是一种早期标准,目前只在一部分的安卓手机上支持。

Web app manifest 是一个json格式的文件,在 html head 部分引用。

<html>
  <head>
    <link rel="manifest" href="/manifest.json">
    ...
  </head>
</html>

manifest.json 主要包括了应用的名字,图标,背景颜色等信息。具体的说明可以参考 Web Manifest

Continue Reading

如何让程序找到安装在非默认位置的动态库

在默认的源码安装模式下,动态库会被安装在 /usr/local/lib 之下。那么如何让其他程序可以加载呢?

首先,把这个位置加入到配置文件 /etc/ld.so.conf 或 /etc/ld.so.d/local_lib.conf 中。

$ sudo echo "/usr/local/lib" > /etc/ld.so.d/local_lib.conf

然后,运行 ldconfig 来更新。

比如,我们安装了 oracle client,如何让应用程序找到它提供的动态库呢?除了将它加入到 LD_LIBRARY_PATH 以外,就可以按本文提供的办法。

假设我们把它安装在了 /usr/local/instantclient_12_2,我们创建一个包含该路径的配置文件 …

Continue Reading

学习 httpd 2.4 的 authn 和 authz 机制

引子

Openstack Keystone 的 federation 是基于 httpd auth 架构而实现的。Mod_auth_shibboleth, mod_auth_openidc 是针对 SAML 和 OpenID Connect 协议而实现的httpd auth 扩展模块。因此,深入理解 http auth 机制,是运营 Keystone Federation 系统的必备技术能力。

身份认证和访问控制

验证,就是检验用户提供的身份信息,证明用户是否是其所声称的那个用户。比如,要求用户输入手机号码,然后发送验证码到用户的手机上,用户再把验证码填回到界面上,系统就可以检查手机号和验证码是否匹配。如果匹配,证明该用户就是该手机号的持有人(不考虑手机被借用或盗用的情况)。其他常见的验证方式包括,通过手机上的app扫描用户界面上的二维码;使用用户名和密码进行验证;或者使用这几种方式的组合等。

访问控制,授权,鉴权。 权限定义, 授权,将权限授予某个用户 …

Continue Reading

OpenStack Keystone如何处理长时间操作过程中的token过期问题

背景介绍

本文梳理 Keystone 的 token 过期的处理方式。Token 是有期限的,而且不能延期,过期以后,身份验证就会被拒绝。这种设计是token安全性的要求。那么,如果用户通过验证以后,所执行的服务操作费时很长,中途再次需要使用用户的已过期的token,该怎么处理?

早期版本的Keystone是不支持这种情况的,一般通过其他的设计来绕开这一局限性,比如把过期时间设置得足够长等。这实际上降低了token的安全性。比如,Horizon的用户就会遇到由于token过期而导致被log out的情况。对于那些长时间使用Horizon的用户而言,这使得Horizon比“正常”的web应用要显得繁琐一些。 在服务之间调用时,这一问题更严重。比如,当用户调用Nova API创建一个服务器时,Nova需要调用Glance服务来得到镜像,需要调用cinder来创建磁盘等等,也就是服务之间需要调用。当用户使用了合法(未过期)的token调用了Nova API,而Nova在调用后续其他服务API时,如果操作时间很长,那么用户的Token可能会过期。早期的设计中,这种请求下请求会超时失败,而且很难意识到是由于token过期导致的。

好消息是这一问题已经解决了。在现在的设计中,Keystone会区分user token和service …

Continue Reading

Galera Cluster 的局限以及它所不适应的场合

Galera Cluster 是主流的MySQL 多活多主高可用方案之一,即使在 InnoDB Cluster (Group Replication)发布以后。

Galera Cluster 是主流的MySQL 多活多主高可用方案之一,即使在 InnoDB Cluster (Group Replication)发布以后。

Galera Cluster 是主流的MySQL 多活多主高可用方案之一,即使在 InnoDB Cluster (Group Replication)发布以后。

重要的话说三遍:)

然而 Galera Cluster 所采用的技术方案,以及它所依赖的一些技术,使得它在标准的MySQL基础上有一些限制。

首先,它只支持 InnoDB系列的引擎。这对于很多应用而言不是大的问题。InnoDB是最广泛使用的MySQL 引擎, Group Replication 也是要求InnoDB。

第二,它不支持XA分布式事务协议。XA分布式事务协议,在传统的企业应用中很常用 …

Continue Reading

使用mysqldump 时,备份文件的压缩与恢复

mysqldump备份出来的文件是文本格式的,可压缩比很高,压缩后不到原来的十分之一。因此备份后应该压缩,这样传输快,存放省空间。本文介绍的方法是结合gzip,使得备份和恢复都直接使用压缩文件。

备份过程

$ mysqldump <dump options> | gzip > mydump.sql.gz

恢复过程

$ gzip -cd mydump.sql.gz | mysql <mysql options>

注意:习惯使用tar来打包和压缩文件的人,在上述的备份过程会发现tar没有合适的选项来直接打包管道输入内容,但从tar的打包压缩文件中直接解压解包恢复是可以的。

$ tar -zxf mysql.sql.tgz -O | mysql <mysql options>

注意: MySQL的备份工具和备份方法都有多种。mysqldump适合数据量较小的全量备份。如果数据量大,或者需要在备份过程中控制对服务器的IO压力等更多的控制,或需要做增量备份等,应该使用 MySQL Enterprise Backup 或 Percona …

Continue Reading

为什么 MySQL Galera Cluster 要求至少三个节点

节点数量的重要性是在发生网络故障的情况下体现出来的。在发生网络故障时,节点可能被分隔为多个互不连通的子集合,Galera Cluster 采用多数票 Quorum 的机制来选择一个票数多的子集合为其活集群,把其他的子集合作为故障节点排除在外,从而避免了数据不一致的问题。如果只有两个节点或者偶数个节点,如果发生了网络故障,那么可能分割出来的子集合节点数相同,无法通过多数票机制选出活集群。如果有三个或奇数个节点,如果发生了一次网络故障,那么割裂出来的子集合节点数肯定是一边多,一边少,从而能顺利地选出多的子集合为活集群。

上面基于节点数的多数票机制是一种简化的描述。Galera Cluster采用的多数票机制是可以给每个节点配置投票权数的。默认情况下是一个节点一票,可以设置为0到255的数字,而且这个数字是可以动态配置的。当集群发生了故障导致新的活集群内节点数量变为偶数时,可以通过动态调整投票权数,使得总票数为奇数。如果将节点的权重设置为0,则该节点作为slave存在。这是在Galera Cluster中实现类似传统的Master Slave 模式的方法。

此外, Galera Cluster 还支持一种只投票但不实际存放数据的节点类型 Arbitrator,它也有助于形成奇数票来帮助处理网络故障下的活集群选择。

上文中使用了“子集合”、“活集群”的说法,只是形象的描述。在 Galera Cluster的文档中,由网络故障 (network …

Continue Reading

Orchestrator 管理 MySQL 数据库复制环境

Orchestrator 提供了Web界面、命令行和API三种方式来管理MySQL的复制(Replication)集群。它不仅能够显示复制关系,还能改变复制关系,自动切换master到具有最新数据的slave上。如果MySQL的数据目录是单独的LVM分区,则可以与orchestrator-agent搭配,还能很方便地创建加入新的slave节点,修复故障slave节点。

Orchestrator及Orchestrator-agent是 Shlomi Noach 在booking.com, outbrain,及github.com(目前在职)期间开发的MySQL DBA工具。Orchestrator应用于管理这几家企业中上千台的MySQL实例。 目前作者的主要精力放在Orchestrator上,其相应的文档也更齐全,也提供了编译好了的二进制包、以及deb、rpm包供下载。而Orchestrator-agent则相对欠缺得多,需要自己打包。

基于Orchestrator的命令行或API,我们可以进一步集成到监控系统中,从而及时发现节点故障。也可以在Orchestrator的一些地方集成进其他的MySQL高可用重要的功能,比如如何告诉应用程序最新的master节点,或者移动vip,或者更新dns记录等。

知名的MySQL咨询公司Percona的博客上有两篇介绍它们的文章。第一篇是 Orchestrator: MySQL Replication Topology Manager ,第二篇是 Orchestrator-agent: How to recover …

Continue Reading

Selenium 执行自定义的脚本来模拟界面操作

Selenium 的 WebDriver 接口很简单,主要是查找定位 WebElement,而 WebElement 接口也很简单,主要是进一步定位子元素,以及输入、点击、读取各类属性等。那么更多的操作呢?比如鼠标的滑动,元素的拖动等等?WebDriver 上的执行脚本的方法是适应各种各样的入口。通过该方法来执行 JavaScript 代码来直接调用DOM API执行各种操作。

页面下拉加载更多内容

driver.execute_script('window.scrollBy(deltaX, deltaY)')
driver.execute_script('window.scrollTo(x, y)')

frame中的条款文档下拉到底表示已经阅读

driver.execute_script('window.frames[0].scrollBy(deltaX, deltaY)')

Continue Reading

Selenium 等待页面内的脚本执行完

最近几天使用 Selenium 做浏览器自动化时,遇到了一个由脚本等待引起的问题。这个页面展示了一个类似于“请阅读条款”的内容,而且会等待一段时间点击确认按钮才会跳转到下一个页面,如果等待的时间不够,点击确认按钮后会再次显示这个页面。这里不提这个页面功能的设计是否合理,针对该页面的情况,我们该如何处理?在Selenium中打开该页面以后,代码应该等待一段时间,然后再去点击按钮。该“等待”不是查找页面元素时的超时等待 (WebDriverWait),而是在代码中sleep一段时间。

import time

time.sleep(60)
button_element = WebDriverWait(driver, 20).until(lambda the_driver: the_driver.find_element((By.NAME, 'button-name')))

代码很简单,正确处理这个问题的关键在于要充分理解页面的功能。

Continue Reading

在 RHEL 7 上安装 Selenium Python 环境

本文介绍在RHEL上安装 Selenium Python环境,执行无图形界面的浏览器自动化任务。

虚拟的图形界面 xvfb 或 xvnc

Linux 环境下使用虚拟的显示来运行普通版本的Firefox 或 chrome 浏览器。网上一般会推荐使用 xvfb (X virtual framebuffer),比如:

  1. http://scraping.pro/use-headless-firefox-scraping-linux/
  2. https://stackoverflow.com/questions/10060417/python-firefox-headless
  3. http://tobyho.com/2015/01/09/headless-browser-testing-xvfb/

在 RHEL 6中,可以下载到xvfb。但是在 RHEL 7中,已经不能下载到该包,可能是合并到了其他包中了。由于RHEL 6中的 firefox 及更底层的软件包对于 Selenium …

Continue Reading

移动应用互相调用

除了通过系统统一定义的事件、通知、分享等接口进行交互以外,在ios和安卓系统中,通过自定义 url scheme 来进行移动应用间的互相调用。比如调用支付宝或微信进行支付,调用QQ、微信或微博进行消息的分发等。

简书上的文章 iOS系统下检查第三方APP是否安装及跳转启动APP调用Custom URL Scheme 对这一方面进行了很实用的介绍。

一些知名的应用会给合作伙伴公开其应用集成的接口,从而便于合作者以正确的格式和参数交换数据和从界面上进行跳转。

iOS 上的应用 workflow 在此基础上开发了很多实用的应用联动效率工具,很受欢迎。

Continue Reading

mod_wsgi 的编译与安装

当我们使用了Linux操作系统发行版不包含的新版本的Python,我们会面临着需要使用相应版本的mod_wsgi的问题。比如Ubuntu 14.04 LTS 版本官方软件包里Python的最高版本是 3.4,相应的mod_wsgi也是和Python 3.4 编译的。当我们使用第三方的包把Python升级到了 3.6,相应地也需要把mod_wsgi升级。

办法是使用pip安装mod_wsgi。

$ sudo apt-get install python3.6-dev apache2-dev
$ . venv/bin/activate
$ pip install mod_wsgi

或者下载mod_wsgi的代码以后,本地编译安装

$ git clone https://github.com/GrahamDumpleton/mod_wsgi
$ cd mod_wsgi; git checkout <release-tag>
$ pip install .
# or
$ python setup.py …

Continue Reading

Bash 常用快捷键

Bash有一些快捷键,便于我们快速执行一些常见的任务。

自动补全
输入前几个字符,按tab键,如果潜在的匹配多,则要按两次tab键。
放弃当前输入
ctrl - c
查找历史命令并执行
ctrl - r, 然后开始输入关键字。由于可能有多条历史命令可以匹配,如果当前显示的命令不是所需要的,可以继续按ctr -r,就会显示其他匹配记录。当然,最好在输入关键字时略做思考,输入识别度高的部分。更多讨论请参考: How to cycle through reverse-i-search in bash
emacs或vi模式

默认情况下,Bash提供emacs的快捷键来移动光标或编辑命令行,也可以切换为vi模式。对于熟悉vi的人来说,切换为vi模式后要省事得多。为了始终都在vi模式下,把 set -o vi 加到登录初始化脚本中 (.bash_rc, .profile, ...)

set -o vi

参考文档

  1. https://www …

Continue Reading

Chef 使用 remote_file 获取 https 资源时的内部证书问题

使用Chef Cookbook来实现自动化安装软件包时,软件包可能存放在一个内部的https Web服务器上,这个https服务器的证书可能是自签名的,或者是内部CA签发的。如果我们使用remote_file来下载该资源,就会遇到ssl certificate verification错误。

如果是自签名证书,可以使用knife ssl把该证书下载到信任证书目录下,

$ knife ssl fetch https://<package repository>
# check again.
$ knife ssl check https://<package repository>

如果是基于内部CA签发,则需要把内部CA的公开证书放到证书目录下。可以是统一的全局目录,也可以是用户的chef-repo目录。从自动化服务器环境的角度来说,应该统一放到第一个目录下。

/opt/chef/embedded/ssl/certs
# or,
chef-repo/.chef/trusted_certs

验证方式同上。

Continue Reading

命令行上传文件的几种方法

为了分享和分发文件,我们往往需要上传它们。本文介绍Linux环境下命令行上传文件的方法。命令行上传的好处是可以进一步开发成为脚本,集成到自动化工作流程中去,比如软件的持续测试与发布。

安装了openssh服务器后,会支持scp和sftp两种方式上传。rsync也可以基于它们来上传。这些方式适用于给用户开放了服务器远程登录和某些目录的写入权限的情况。

$ scp <local files>  <remote host>:<remote path>
# or
$ rsync <local files or directories>  <remote host>:<remote path>

另外一种方法是WebDav,它支持基于HTTP的文件读写。WebDav需要Web服务器的支持并进行相应的配置。主流的Web服务器都支持该协议。一些云存储服务商也支持此协议;主流的网上协作套件也支持此协议。作为一种可写入内容的Web协议,如果提供公网访问,安全配置就必须慎重。

$ curl -T <local file>  [auth] http(s)://<remote host>/<path>/
# or multiple files.
$ curl …

Continue Reading

2017年 Instagram 把 Python2 升级到了 Python3

Instagram是特别流行的图片和视频分享社交平台,有超过6亿的注册用户,每天有超过4亿的活跃用户。因此,它是一个特别大规模的计算平台。它的主要开发语言是Python。Instagram是世界上最大的Python用户。

像PHP一样,Python也是属于入门容易的语言。最初Instagram选择Python的原因,和其他创业公司的技术选择一样,主要是因为初始团队的技术骨干很熟悉某种技术。而且Python也是很适合快速开发的语言。快速推出功能,比运行速度快要更重要。在架构合理的情况下,运行性能的问题可以通过添加服务器来缓解。

Python的运行慢的确给Instagram带来了服务器运营成本上的增加,他们也确实想过换成其他语言。Instagram属于Facebook,公司的另外一个主流语言是PHP。在调研时,把试点模块用PHP改写后,性能并没有特别大的改善。再加上Instagram的技术团队特别喜欢(熟悉)Python。于是他们改变了态度,与其抱怨,不如积极改善。既然决定了继续留在Python阵营,那么就要跟随Python社区,使用最新版本的Python,并回报社区。全面升级到Python3成了顺理成章的事情(Python3相对于Python2有很多新的特性)。

Python2与Python3并不兼容。Instagram前后花了近一年(10个月)的时间,通过小步快跑的方式,在不影响用户的情况下完成了迁移。

迁移过程中,他们主要做了哪些工作呢?

第一阶段,约3个月时间,大规模的代码修改,以及替换掉不兼容的第三方库。

第二阶段,约2个月时间 …

Continue Reading

MongoDB replica set强制重新配置

MongoDB的replica set是一种取代了master-slave的replication的架构,具备自动failover的能力。因此,其可靠性和可管理性比master-slave更高。replica set的failover依靠少数服从多数的选举票机制来推选新的主节点。为了从术语上与master-slave进行区分,在replica set中,我们把主节点成为primary,把从节点成为secondary。

少数服从多数的机制意味着我们应该有奇数个节点。但是,我们可能会遇到只有两个节点的情况。

两个节点的情况下,我们可以将其中一个节点设置为不具备投票权的节点,只负责复制数据,以避免数据丢失的情况发生。一旦主节点不可用,我们可以手工将不具备投票权的节点重新配置为主节点。

强制重新配置,能将一个secondary的节点,强制变为master节点。

一种方法是将坏掉的那个节点从集合中删除,从而重新达到平衡。

cfg = rs.config()
cfg.members = [ cfg.members[i], cfg.members[j], ...]
rs.reconfig(cfg, {force: true})

另一种方法是调整节点的priority和votes。可以将其priority和votes都设置为0,从而使它不具备被选举权。priority是被选举权,而votes是选票。

cfg = rs.config …

Continue Reading

MySQL Replication 相关的数据库用户权限

为了建立replication,我们需要创建哪几个账号,分别赋予什么样的权限?

假设,服务器A为master,服务器B为slave。在master上需要创建一个账号 'replica_slave_user'@'slave host', 具有replication slave的权限,允许slave服务器连接到master服务器,并获得更新log。在slave上需要创建一个账号'replica_admin_user'@'admin host',具有super权限,能建立replication,启动或停止replication等;此外,还应该赋予该用户Replication Client的权限,能查看slave status等信息。

上述内容的语句如下

# on master server A
mysql> grant replication slave on *.* to 'replica_slave_user'@'slave host'
     > identified by 'complex password';

# on slave server B
mysql> grant …

Continue Reading

mysql kill a connection

从mysql端强制断开一个数据库连接的办法是使用kill命令结束该连接。 首先,使用 show processlist 列出所有的连接,然后找到匹配的连接后,执行 kill命令即可。

mysql> show processlist;
...
mysql> kill <process id>

对于一个繁忙的系统,连接数可能很大,show processlist的输出会很长,难以寻找到目标连接。 可以把输出存放到文件中,再使用shell脚本来协助处理。

Continue Reading

Python中模块的循环引用

一般来说,在Python中模块的循环引用不是什么好的代码风格。但有时候这很难避免。比如有两个模块a和b,各表达一个业务逻辑,随着业务的发展,a开始依赖于b,因此,在a中引入了模块b,且在a的代码中大量引入了b的调用;后来,业务继续发展,b中也需要调用使用a的逻辑,两个业务有交叉关联关系。消除两个模块的循环依赖优先级并不高。

在 Python 3.5 时,还支持了 relative import。该问题的提出是在 relative import circular problem, 且解决方案为 Modify IMPORT_FROM to fallback on sys.modules 。Relative import 指的是 from a import b 这种形式的模块import。

Relative import的逻辑在 __import__ 中很早就实现了,但 IMPORT_FROM …

Continue Reading

Ubuntu 14.04 中升级到 Python 3.5/3.6

Ubuntu 14.04 官方的Python版本最高到Python 3.4,但是我们的代码开发环境是 Python 3.6, 代码中存在支持模块的循环相对引用,该功能在 Python 3.5 才引入,因此我们需要升级Python。

我们可以自己下载源代码,编译该版本的Python。但更方便的办法是使用一个知名的第三方包。在Ubuntu中,这是很常见的办法,其协议是 ppa。知名的 Python3.5, 3.6 ppa源是 fkrull/deadsnakes。

sudo add-apt-repository ppa:fkrull/deadsnakes
sudo apt-get update
sudo apt-get install python3.6

or use pyenv https://askubuntu …

Continue Reading

Python 计算金额

由于浮点数的二进制转换会丢失精度,对于金额的存储与计算,一般用Decimal十进制编码类型。

有两个问题需要考虑,一是舍入规则,二是保留小数点后几位。默认情况下是四舍五入,保留两位小数。

Decimal 的 quantize 方法能处理数字保留几位小数点的问题。

price = Decimal('8.014')
price2 = price.quantize(Decimal('.00'))
# price2: 8.01
balance = Decimal('200.105')
balance2 = balance.quantize(Decimal('.00'))
# balance2: 200.11

Continue Reading

Python sqlalchemy 数据类型转换

将字符串类型的数据存放到数据库中,是一个很常见的任务。在Python数据库开发中,我们经常使用sqlalchemy定义数据模型。多数情况下,不管模型中定义的数据类型是什么,我们都可以直接将字符串赋值给各字段,然后sqlalchemy会帮我们进行转换。 有时候,我们也需要自己做类型转换。比如,我们希望获得数据记录的变动情况,就需要比较输入字符串类型的数据和从数据库中查询到的数据记录。类型不一致,就不能准确地比较。本文介绍的类型转换方法,是基于模型定义中的数据类型,以及它们与Python类型的对应关系而实现的。

数据类型是很多的。本文只介绍最常见的需要转换的类型,即日期和数值。

数据例子

数据例子包含一个sqlalchemy 数据模型定义 和 一个输入数据。我们需要把全部是字符串类型的输入数据, 根据模型进行字段类型转换。

数据模型

class Project(Base):
        __tablename__ = 'project'
        id = Column(Integer, primary_key=True)
        project_name = Column(String)
        due_date = Column(Date)
        cost = Column(Numeric(13,2 …

Continue Reading

Bootstrap v3 网格系统 学习笔记

Bootstrap v3 的网格系统是响应式(适应式)的,能方便地根据屏幕大小进行调整

Continue Reading

mysqldump 备份账户的最小权限

root虽好,但是所有任务、尤其是脚本自动化任务里面使用root,账号暴露的风险无谓增加。因此,从安全的角度出发,对于不同的管理任务,我们应该使用相应的账号,并赋予最小权限。

mysqldump备份所需要的最小权限:

SELECT
SHOW DATABASES
SHOW VIEW
EVENT
LOCK TABLES
  1. Select 是查询表、程序、数据等所需要的权限。
  2. Show databases 是查询数据库列表所需要的权限。
  3. Show view 是查询视图定义所需要的权限。
  4. event是查询事件所需权限。
  5. lock tables是为了一致性而锁表所需要的权限。
grant SELECT, SHOW DATABASES, SHOW VIEW, EVENT, LOCK TABLES on *.* to
'backup'@'backuphost'identified by 'backup password';

Continue Reading

给venv增加额外的Python包路径

问题介绍

使用venv可以建立隔离的Python环境,比如 virtualenv 或 python3 -m venv可以创建venv。 这时,如果我们需要的某个包已经安装在了系统中,但并不在我们的venv的路径下,该怎么办才能加进来呢?

在网上搜索之后,我发现,这个问题有多种解决办法。最简单的办法是使用pth机制。

案例问题描述

我们已有venv环境 ~/venv, 现在想把 /var/lib/pyfoo/dist-packages 加入到路径中。 该路径下有我们需要的包 bar。

操作步骤

首先,创建pth文件 _venv_ext.pth, 其内容如下,

$ cat _venv_ext.pth
/var/lib/pyfoo/dist-packages

然后,将该文件放到 venv的 site-packages下,

$ mv _venv_ext.pth ~/venv/lib/python …

Continue Reading

重置MySQL的root密码

介绍

MySQL 提供了可以用来重置root密码的启动选项。可以在mysql 启动的初始化阶段重新设置root密码, 也可以禁用权限管理系统后修改系统用户数据中的root密码。前一种方法的安全隐患较小,也是本文 会举例介绍的。

MySQL 5.5 ( 以及 5.6)提供了启动选项 init-file。在启动的初始化阶段,会读取并执行该文件中的 SQL语句。利用这一机制,执行设置密码的语句,就能解决我们的问题。

步骤

首先,准备init-file reset_root.sql, 内容如下。注意: 新的密码请记得使用你自己的密码,而不要直接使用下面 代码中的这个。

set password for 'mysql'@'localhost' = password('MySecretSince2017');

然后,将该文件放到mysql进程能读取的, 安全的目录

sudo mkdir /var/dbops
sudo mv reset_root …

Continue Reading

Set Time and Locale in Ubuntu Linux

服务器的时间是一个不起眼但非常重要的因素。当它是正确的时候,一切平安无事,但是当它 出现问题时,就会造成很多不便,甚至会导致一些依赖时间的应用出现数据上的问题。

本文整理一些关于查看和设置时间的命令,以及本地化locale显示设置的问题。

时间

正确而方便的时间格式,能方便查看文件的修改时间,日志记录的时间等。所谓方便的时间格式, 一方面是时区最好与用户本地时区一致,另一方面是时间格式要符合用户国家和地区的习惯。

正确的时间并不是一个看起来那么简单的问题。达成一般精度的时间是比较容易的,而要达成 非常精确的时间,则需要有效的设计与调校。

时区

Linux的时区信息存放于 /etc/timezone之中,可以直接修改该值,也可以使用系统提供的命令, 比如新版本的Ubuntu上可以通过 timedatectl来修改, 下面的命令将时区改为中国时间.

sudo timedatectl set-timezone Asia/Shanghai

时钟

时钟涉及到时间的准确性. 除了传统的date命令可以显示时间外,timedatectl命令可以显示 更丰富的时间信息

$ date
Thu Jan 12 19:32:02 CST 2017
$ timedatectl …

Continue Reading

Linux命令执行了多久?

使用time命令即可

time [time options] <command> [command options]
$ time ls -tr
[output of the command ls -tr]

real        0m0.003s
user        0m0.004s
sys 0m0.000s

References

  1. http://askubuntu.com/questions/53444/how-can-i-measure-the-execution-time-of-a-terminal-process

Continue Reading

初识开源分布式存储Ceph

数据存储是信息化建设和数字化企业的基石之一。随着软件技术的发展,高可靠 和高性能的存储不再意味着昂贵和专有系统。Ceph就是这样一款优秀的开源分布式 存储方案。

本文针对阅读了Ceph的一些文档资料,对Ceph有概念性的认识,希望通过简易的本地环境来动手尝试的同学。如果还没有了解Ceph的基本概念,请先通读一下参考资料的前两项。

安装

基本上按照Ceph官方的快速安装手册,手册地址为:

http://docs.ceph.com/docs/master/start/

上述手册对多种Linux环境提供了关键说明。本文的特点是更加具体、直观、可以一步一步 参照完成整个过程。

安装前的准备

首先,我们需要多台Linux服务器。在本文中,我使用的是本地电脑上安装的虚拟机。

我的桌面电脑是Windows,有16G内存,安装了虚拟机软件VMware或者VirtualBox后, 就可以安装Linux虚拟机,我使用的Linux版本是Ubuntu 16.04.1 LTS。如果你的电脑 内存不足,可以在云平台(比如阿里云等)上同一个VPC内创建最小规格的Linux虚拟机。

先安装第一台虚拟机, 虚拟机参数设定如下:

  1. 命名为node1.027yunwei.com …

Continue Reading

CAP Theorem

CAP 是个著名的分布式定理,它说明了在分布式环境中,当网络存在故障导致节点间互相不能通信时, 即存在网络Partition时,系统的一致性和可用性不能两全。需要注意的是,有些人将此特性表达为三个 特性只有两个能同时满足,虽然形式上正确但是没有抓住该定理看问题的角度,因为P (Partition) 不是一个系统的特性,而是一种分布式系统中可能发生的异常状态。当无网络故障时,高可用和高一致性 都可满足。

那么当网络故障出现时,系统应该选择高可用性还是高一致性呢?这要根据系统的业务特点来权衡。 当准确度比可用性更重要时,选择保证高一致性。当可用性比准确度更重要时,选择保证高可用性。很多 互联网社交服务选择保证高可用性,比如评论的数量、评论条目等,当网络存在问题时,提供旧的数据而 不是提示系统故障。这类系统的特性可概括为BASE, Basically Availability, Soft State and Eventually Consistency.

基于CAP还发展出了另外一个权衡定律PACELC,那就是网络异步复制的延迟 (Latency) 和一致性间的 权衡。该定理认为,网络完全不可用的partition状况是极少数状况,而网络延迟则是更常见的情况。 那么在存在网络延迟的情况下权衡是否需要一致性。一般强调高可用的系统,在高一致性和允许延迟上 …

Continue Reading

CARP, Common Address Redundancy Protocol

CARP is the Common Address Redundancy Protocol. Its primary purpose is to allow multiple hosts on the same network segment to share an IP address. CARP is a secure, free alternative to the Virtual Router Redundancy Protocol (VRRP) and the Hot Standby Router Protocol (HSRP).

CARP works by allowing a …

Continue Reading

High Capacity Networking

Stacking

Stacking, use multiple devices as logically one device, gaining more bandwith and more ports.堆叠来扩展端口数和带宽

设备冗余

冗余的交换机,通过stp及相关协议来选择活动路径,并避免循环。 冗余的路由器, 通过vrrp及相关的协议来选定某个路由器。vrrp既能过提供冗余设备的failover,也能过提供load balance的效果。

网络划分

Divide and Conquer 将流量分开,比如专门的网络来负责备份,数据,应用等

就像虚拟机不能比宿主物理机大一样,虚拟的网络带宽也不能比宿主物理网络大。云计算的计算节点可以通过分布式来分散 计算任务,这对于计算量大的任务是可行的 …

Continue Reading

Keystone Token revocation issues

Keystone的Token Revocation的实现方式是导致Keystone Token Validation变慢的根源。 由于所有的OpenStack API调用均需要Validate Token,这也将该问题扩大成整个OpenStack云平台的性能瓶颈之一。

在2016年7月22日的Openstack Digest, Vol 37, Issue 22中,来自Redhat的Luke Hinds提到了该问题可被利用来进行拒绝服务攻击(DoS)。 Revocation Event记录的保存时间是Token Expiration 加上Expiration Buffer。在默认配置下,其值为1.5小时。在这个时间段内, 一个合法的普通OpenStack用户可以不停地生成Token,然后revoke Token,从而生成大量的Revocation Event记录,拖慢Token Validation。

在Validate Token时对Revocation Event表的查询语句是:

Select <Column List> from Revocation_Event Order By Revoked_at

在用户不停地调用revoke Token的情况下,这样一个语句的结果是变化的,导致在数据库端和Keystone端的缓存都是会失效的。 当结果集足够大时,这一查询过程和结果数据传输过程都会变得很费时 …

Continue Reading

ITIL + DevOps: 让IT服务更有价值

ITIL的体系,流程,管理,四平八稳。 DevOps的协作,自动化,效率,充分发挥人的积极性和自动化工具的效率。

DevOps是实现ITIL描述的逻辑模型的更敏捷的方法学。

参考资料:

  1. InfoQ 明智地整合DevOps与ITIL http://www.infoq.com/cn/news/2013/05/integrate-devops-itil
  2. IBM DeveloperWorks 通过DevOps实现ITIL http://www.ibm.com/developerworks/cn/rational/d-implement-itil-devops/
  3. ITIL 与 DevOps 的对比 http://www.infoq.com/cn/news/2015/08/itil-vs-devops

Continue Reading

访问使用Kerberos验证的Web服务

本文将举例介绍如何访问使用Kerberos验证的Web服务。首先,我们将配置一个最简单的Web服务,并给该服务加上Kerberos验证。然后,我们将通过多种方式来访问该Web服务。

环境准备

本文的环境是Ubuntu 16。请参考文章 Linux虚拟机环境 来搭建虚拟机环境, 然后参考 在Ubuntu Linux上了解MIT Kerberos 来搭建基本的Kerberos环境。

实验环境清单

  1. Kerberos服务器 auth.027yunwei.com
  2. Web服务 apps.027yunwei.com
  3. 客户端环境 ubuntu.027yunwei.com

搭建Web服务

在apps.027yunwei.com上安装apache2 (httpd)服务器,并创建一个测试文件krb5_test.txt。

sudo apt install -y apache2
sudo echo 'Hello Kerberos' > /var/www/html …

Continue Reading

使用本地虚拟机搭建多台Linux服务器实验环境

很多时候,我们想通过实验来学习和尝试一些软件。向公司申请服务器环境,或者买云服务器都不如使用虚拟机来模拟多台Linux环境来得简单方便。本站上的很多实验都是需要多台Linux环境的。如果你有兴趣按某篇文章自己上手试一试,可是在搭建多台Linux虚拟机环境上遇到了问题,就可以参考本文。

Continue Reading

在Ubuntu Linux上了解MIT Kerberos

Updates on 2018.12.12

Kerberos is used in hadoop systems.

Kerberos是一种广泛使用的网络安全认证服务。在绝大部分企业内网广泛使用的Windows域,其基础的访问安全机制就是Kerberos。主流的大数据平台和Linux集群管理系统的安全机制也是基于Kerberos的。因此,Kerberos是目前最广泛使用的IT生产环境网络安全基础设施之一。

Kerberos是一种集中式的网络安全协议。Kerberos服务器(KDC)管理所有principal (主体)的密钥信息,负责验证身份并签发Ticket (安全票据)。Kerberos协议中,密码不会在网络上传输,而票据则具有时效性,通信数据也是加密的。Kerberos能有效确认安全主体 -- 用户, 机器,服务等的身份。这些措施使得Kerberos是一种强安全性的Client/Server网络计算技术。

Kerberos给人的第一感觉是比较复杂。实际上,在Linux上安装配置一个基础的Kerberos实验环境还是比较容易的。在本文中,我使用两台Ubuntu Linux虚拟机搭建了一个基础的Kerberos环境,并进行了测试验证。

搭建虚拟机环境

请参考文章 Linux虚拟机环境 来搭建虚拟机环境。在本实验中,我们将会用到其中的两台,

  1. auth.027yunwei …

Continue Reading

https的相关知识

先不管https的细节,先给网站加上https

如何给网站加上https

现在给网站加https非常简单、而且还免费。

公益组织 Lets Encrypt和Certbot提供了很简单的工具来将网站转为https的。

Let's Encrypt的地址是, https://letsencrypt.org/getting-started/ Certbot 的地址是, https://certbot.eff.org/, 我的博客网站 027yunwei.com 是运行 在ubuntu apache上,通过 https://certbot.eff.org/#ubuntutrusty-apache 可以 看到非常简单的说明。

cerbot装好以后,还应该加一个cron job,每个月去试着renew证书,certbot renew 命令 会更新快要到期的证书。

Qualys 提供了一个免费的网站 https 检测工具,比如 https://www.ssllabs …

Continue Reading

MySQL临时目录相关问题处理

MySQL临时目录空间不足会导致很多操作问题。比如主从复制出现错误而停止,查询排序无法完成等。一般来说,我们可以通过扩大临时目录所在文件系统的大小来避免问题。

MySQL的临时目录在哪里

默认情况下,MySQL根据环境变量的设置作为其临时目录。Linux中为TMPDIR,Windows中为TMPDIR, TEMP, TMP。如果未能找到,则使用系统的常见临时目录。Linux中为/tmp, /var/tmp, /usr/tmp等;在Windows中c:\Windows\Temp等。

此外,还可以在mysqld启动参数中指定临时目录。

在Linux中,

[mysqld]
tmpdir=/tmp:/var/tmp:/var/mysql/tmp

在Windows中,

[mysqld]
tmpdir=c:\\Windows\\Temp;c:\\MySQL\\Temp

请注意上面的例子中,tmpdir所设置的临时目录是可以有多个的,以路径分隔符区分。此外,该变量不能动态设置,改动以后需要重启才能生效。

在主从复制架构中 …

Continue Reading

thedevopsfactory.com 学习笔记

thedevopsfactory.com是微软公司专门介绍DevOps的网站。本文是我通过该网站学习DevOps的笔记。

DevOps七大实践领域

  1. Automated Testing 自动化测试
  2. Continuous Integration 持续集成
  3. Infrastructure as code 基础设施代码化
  4. Application Performance Management 应用性能管理
  5. Continuous Delivery 持续交付
  6. Release Management 发布管理
  7. Configuration Management 配置管理

1. 自动化测试

相比手工测试,自动化测试极大提高了发现问题的效率,也避免了手工测试的不一致性,是DevOps高速运转的基石。

自动化测试应该包括所有类型的测试,包括单元测试、压力测试、集成测试等。

自动化测试可以是每次提交都触发,也可以是某种其他的规则触发。对于后一种情况,应该通过看板管理方法尽早发现并解决测试中发现的问题。

自动化测试意味着反复构建和测试,每天几十次高覆盖多类型的测试要能有效运行而且不阻碍开发人员,意味着自动测试必须在保证质量的前提下足够快。常见的解决办法是分布式并行测试。在 持续交付实践介绍 一文中,我们有提到过某月入百万美元的网站,每次数万个测试案例全部运行完毕的执行总时间是接近五个小时 …

Continue Reading

DevOps简史

本文翻译自:

  1. Richard Rapaport http://www.ca.com/us/rewrite/articles/devops/a-short-history-of-devops.html
  2. https://dzone.com/articles/devops-20

DevOps运动是如此的广泛,以至于让人吃惊它才出现了几年而已。其实它形成自一种基本的需要,基于一种简单的这些 - 当工作是协调的、协作的时候,它就是最凑效的。因此DevOps的发展如此之快。

DevOps是从更快地响应市场变化的努力中发展而来的。这种方法用来更快地将高质量的软件更新发布到用户手上。持续交付要求所有人,从开发、测试到用户体验、产品、运营,在整个过程中通过多个反馈回路有效协作。

下面是经典的直观介绍DevOps的图形(来源: https://dzone.com/articles/devops-20, 作者 Justin Baker):

经典DevOps交集图

作者Justin Baker将上图称作为DevOps 1.0,那么DevOps 2 …

Continue Reading

Linux设置域名

本文以Ubuntu Linux 为例说明如何设置域名

Continue Reading

LDAP基本操作

本文详细说明了如何在ubuntu Linux上安装OpenLDAP服务及客户端,以及如何使用其命令行客户端工具来执行常见的目录数据新增、修改、查询等操作。您在了解了LDAP的基础概念以后,结合本文进行操作练习,能帮助加深理解,对搭建LDAP开发与测试环境,进行目录服务的集成等任务有一定帮助。

Continue Reading

持续交付实践介绍

一天超过50次的持续交付

有一家月收入百万美元的互联网公司IMVU, 每天超过50次的部署代码到生产环境。 其员工Timothy Fitz发表的 文章 介绍了他们的网站服务的持续交付过程。支撑如此高频度部署的是其成熟的 自组织团队运作和高效的自动化测试与部署系统。每一次的代码提交都会触发测试, 跑完所有测试需要大约9分钟,代码部署到所有生产服务器需要大概6分钟。这个过程中 没有手工的测试。

那么质量是如何得到保障的?得益于测试套件的丰富与彻底。
  1. 整个测试套件包括一千多个文件,约一万四千个测试案例,串行执行大概需要4小时。分散到36台服务器并行测试,在理想状态下, 最短执行时间是 4*60/36, 即大约7分钟。
  2. 大约四分之一以上的测试时间是基于Selenium的页面模拟点击测试。剩下的时间是对服务 的功能测试和对代码模块的单元测试。
  3. 每次代码提交都要求跑所有的测试,而且要求错误率不得超过百万分之一次。 一天大概70次的全面测试,差不多意味着每天会遇到一次出错的情况。

持续交付意味着唯速度论? 既是,也不是。持续交付是在满足业务、市场、 质量要求的前提之下的越快越好。

如何开始持续交付?

Timothy Fitz在2012年底发表的 持续交付之路 介绍了如何开始持续交付, 用五个短句来描述:

  1. 开发人员尽早提交代码
  2. 每次提交都触发全面测试
  3. 自动化部署代码
  4. 生产环境监控与告警
  5. 出现错误要分析根本原因 …

Continue Reading

Linux主机名称(hostname)查询

本文举例介绍了Linux中几个常用的主机名称和域名查询命令行工具

Continue Reading

几个常见的 ssh 问题

通过配置ssh alive来避免因为一段时间不使用而导致ssh连接被关闭。

Continue Reading

语义化版本管理

语义化版本管理是基于语义化版本号的版本管理规范。该规范约定了版本号的格式,升级版本号的要求等。 该规范着重强调了公开接口兼容性管理的要求,软件的公开接口需要有明确严格的文档或代码描述。 对于遵守该规范的软件包,用户根据其版本号就能知道新包是否与当前的版本兼容。这对于软件依赖包的升级管理非常重要。 因为引入不兼容的新包会导致应用出现问题。软件的模块化提供了大量可重用的软件包,极大提高了软件开发质量和效率,同时也带来了软件包依赖管理的困难。 语义化版本是简化软件包依赖管理的有效规范。

语义化版本规范约定的基本版本号格式为:

主版本号.次版本号.修订号

版本号升级的规则为:

  1. 主版本号:当新功能或修改导致接口不兼容的时候
  2. 次版本号: 当新增功能是向下兼容的时候
  3. 修订号: 当做了向下兼容的问题修复

主版本号升级后,次版本号和修订号重置为零。次版本号升级后,修订号重置为零。

在此基础上,可以再加上预备发布版本号, 比如 1.0.0-alpha.1, 1.0.0-beta.2。 预备版本号在版本依赖上的优先级低于其正式版本号, 比如1.0.0-alpha.1比 1.0.0要旧。

在此基础上,可以再加上编译信息, 比如 …

Continue Reading

如何使用man查看Linux命令的联机手册

举例说明使用man命令的几个常用选项来查找命令的联机帮助

Continue Reading

MySQL 复制 (Replication) 中如何加入新节点

在 MySQL 的复制集群 (Replication Cluster)中,我们会需要加入新节点,或者修复损坏了的节点。这一过程也叫做 provisioning a node 或 seeding a node。如果 master 上的binlog保留了全部的操作,在数据量不大,或者对master slave的数据复制时间要求不高的情况下,可以直接让新节点从master复制。否则,我们需要先从master或某个已有的slave上备份出数据,并导入到新节点中,然后再建立复制关系。这一过程对于新的 Group Replication 依然适用,只是它的master slave角色是集群自己管理的,而不是手工设置的。

针对不同的情况,对于已有数据的导出导入可以采用物理文件的方式,也可以采用逻辑语句的方式。采用物理文件的方式效率更高,适合已有数据量特别大的情况,需要使用企业版本的工具比如 MySQL Enterprise Backup,或者 Percona 的免费的备份工具 XtraBackup,或者LVM的磁盘快照(可以参考 MySQL …

Continue Reading

使用rsync同步代码

举例说明如何使用rsync来同步代码

Continue Reading