xdays

利用mailgun搭建私有域名邮箱

起因

本着折腾中进步的原则,从切换到xdays.me这个域名之后就想折腾下邮箱。个人邮箱主要带来以下好处:

  1. 有些服务需要用企业邮箱
  2. 看上去牛逼一些

本文总结了利用mailgun和gmail来实现私有域名邮箱功能。

Mailgun

Mailgun是Rackspace面向开发者的邮件发送服务,但是它提供的功能足够我们打造属于自己的个人邮箱了。我们知道邮箱服务简单来说就两个功能,发送邮件和接收邮件。Mailgun为我们提供了SMTP server用于发送邮件和Email Route用于转发邮件到特定的邮箱以收取邮件。此外还涉及一些反垃圾邮件的机制。

Domain

注册了mailgun的账号之后,你需要添加一个domain,然后根据向导添加对应的DNS记录,等mailgun验证通过。

SMTP Server

添加了Domain之后我们的SMTP Server已经设置好了,但是我们需要添加一个和Gmail继承的账号,如下图所示,点击“Manage SMTP credentials”来管理账号

mailgun-credentials

添加完账号之后就可以登录SMTP服务器发送邮件了,[email protected]

Route

虽然mailgun没有提供POP3的服务,但是其提供了邮件路由的功能同样能达到让我们收取邮件的目的。按照下图所示添加一个邮件路由,用来将所有发给 [email protected]

mailgun-routes

到这里mailgun的部分就配置完成了

Gmail

其实Gmail的配置和添加其他免费邮箱账号没有区别。

点击 Settings ...

Kafka基础

简介

Kafka是一个分布式的,基于分区存储的,多副本提交的日志系统。其特点包括:

  1. 高吞吐
  2. 无缝扩展
  3. 消息持久化

基本概念

broker

broker是Kafka集群的一个节点,负责接收producer发来的消息和响应consumer发来的消息请求。

topic和partition

topic是Kafka组织消息的方式,可以认为是消息的类别。一个topic可以有多个partition来保存消息,消息在partition里是顺序存储的。这里注意,需要注意的是,Kafka保存数据是根据时间来决定的,而不是它是否被消费者消费。如果在数据的生命周期内,它被消费后仍然会存储在Kafka中。但如果它在生命周期内没有被消费,同样它也会在生命周期结束时被丢弃。

分布式

partition分布在所有的broker上。partition有leader和follower,partition的leader broker负责接收读写请求,而follower broker只负责从leader同步消息。当leader broker挂掉的时候,会通过Zookeeper的failover机制从follower中选举出新的leader。

producer

消息的生产者,producer根据topic的partition策略讲消息发给broker。

consumer

消息的消费者,Kafka在consumer之上引入了消费者组的概念,消费者会被被划分成一个个消费者组,属于某一个主题的消息会被分派到它的一个分区下,而该分区与订阅了该主题的消费组中的某一个消费者相对应,也就是说消息只会发送给订阅的消费者组中的一个消费者。可以把消费者组理解成消息的真正的订阅者,而它下面的消费者只是处理消息的线程池,这样做可以保证系统的扩展性和容错性。而消费者与分区的关系是,每个分区只能有一个消费者 ...

Linux Systemd笔记

背景

这是我的一篇我之前学习systemd的这个系列教程的笔记,在此记录下吧。

简介

  • 和init和upstart类似的Linux服务管理程序
  • 提供优秀框架以表示系统服务间的依赖关系
  • 并行启动服务,并通过cgroup跟踪服务进程
  • 支持对系统状态建立和恢复快照
  • 支持crontab

使用

服务状态

  • 因为启动过程太快,用户可能来不及看服务启动过程,故systemd跟踪进程的启动过程保留下来,以便后续查看。通过systemctl status能看到服务的状态以及返回的状态码。

cgroup

  • 通过cgroup来管理进程,没有继承可以脱离管理。通过两个命令来查看进程的所属cgroup,一个是ps xawf -eo pid,user,cgroup,args,一个是systemd-cgls

迁移sysv脚本

  • 如何把传统的sysv脚本迁移为systemd的配置文件。shell脚本的弊端,慢,可读性差,脆弱,不具备有序并行执行,不能监控进程。
  • 迁移需要获取的信息,服务描述,服务依赖,运行级别,启动命令
  • 字段描述
    • Unit段表示服务的通用信息,systemd不仅管理服务,还管理设备 ...

etcd基础

简介

etcd是一个分布式kv存储,与我前面介绍的Consul有些类似,底层都是基于raft协议的,它的主要用途包括为应用提供集中的配置管理和服务发现。

安装

etcd是go语言开发的,所以安装成本非常低,一般我们用systemd来管理etcd,这里我们简单过下安装过程:

curl -L  https://github.com/coreos/etcd/releases/download/v2.2.5/etcd-v2.2.5-linux-amd64.tar.gz -o etcd-v2.2.5-linux-amd64.tar.gz
tar xzvf etcd-v2.2.5-linux-amd64.tar.gz
cd etcd-v2.2.5-linux-amd64
mkdir -p ...

搭建私有pypi仓库

背景

为了对公司内部的Python库进行统一管理,但出于隐私考虑不能直接放到公共pypi服务器上,故考虑搭建私有pypi仓库。

服务端

安装

安装pypiserver

pip install pypiserver passlib

安装supervisor

apt-get install supervisor

配置

新建package存放目录

mkdir -p /opt/pypi/packages

创建用于上传package的密码

htpasswd -sc /opt/pypi/.htaccess user

新建supervisor配置文件,vim /etc/supervisor/conf.d/pypi.conf

[program:pypi]
directory=/opt/pypi/
command=pypi-server -p 8082 -P .htaccess /opt/pypi ...

Consul基础

简介

  • 服务发现,提供了DNS和HTTP两种接口
  • 健康检查,可针对服务和节点两个级别检查
  • KV存储,提供HTTP接口
  • 多数据中心支持

基础

概览

architect-of-consul

  • 通过一个WAN的Gossip池来原生支持跨数据中心的状态同步
  • 一个数据中心内部通过LAN Gossip来维持数据中心内部状态同步
  • 一个数据中心内部通过Raft协议来维护在Server模式的agent之间的leader选举和同步数据
  • Client模式下的agent负责转发RPC请求给Server模式的agent
  • 所有的agent都负责做健康检查

Raft

Raft一致性算法是Consul的核心,用于在一个数据中心内部的Server之间同步数据,关于Raft算法这里有个非常直观的演示。

Gossip

Gossip分布式通信协议是Consul的另一个核心,用于管理成员和广播消息。

Agent

Consul要在集群的所有的节点上部署一个agent,可以工作在client或者server模式。client模式agent主要职责是做健康检查,对外提供HTTP和DNS接口以及同步数据,以及向server模式的agent转发请求;server模式的agent额外的需要维护集群的状态跨数据中心通信等。

安装

consul仅有一个二进制文件,开箱即用。 从这里下载。

启动

启动Server模式的agent

consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -ui-dir /tmp ...

U盘安装CentOS7系统

需求

  • U盘安装
  • 小规模
  • 自动安装

工具

  • system-config-kickstart
  • kickstart
  • livecd-iso-to-disk

配置过程

  1. 将iso文件写入U盘sudo livecd-iso-to-disk --format --reset-mbr ./CentOS-6.4-x86_64-minimal.iso /dev/sdb
  2. 用system-config-kickstart创建ks文件,注意修改以下两点:
    • harddrive --partition=sda1 --dir=/ 这里是制定安装介质的存放目录
    • bootloader --location=mbr --driveorder=sdb,sda 指定grub的安装磁盘,如果不指定会写到U盘上去的
  3. 将ks.cfg拷贝只U盘根目录下
  4. 修改U盘上的grub引导菜单syslinux/extlinux.conf,添加内核参数ks=hd:sda1:/ks.cfg

安装

  • 设备设置U盘第一启动,启动菜单第一个即可

参考

ks.cfg ...

OpenLDAP构建统一认证之项目实战

背景

问题

登录服务器的账号分散在所有的机器上,这样就带来两个问题:

  1. 维护成本高,需要专门在playbook里定义用户权限
  2. 没有明确的权限划分
  3. 不便于和其他系统(如Google Apps)对接

需求

  1. 数据集中管理
  2. 根据用户组控制用户的登陆权限
  3. 控制用户的sudo权限,只有operation有sudo的权限
  4. 自动创建家目录
  5. Web管理界面

原则

  • 尽可能少的涉及组件,减少维护成本
  • 尽可能的不入侵系统配置,便于恢复

配置

服务端

OpenLDAP安装配置

关于OpenLDAP的安装可以参考OpenLDAP构建统一认证之安装配置

LAM安装配置

关于LAM安装配置可以参考OpenLDAP构建统一认证之管理工具

管理账号

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2 ...

VPN-PPTP客户端自动登录

安装

yum install pptp

配置

chap-secrets

vim /etc/ppp/chap-secrets

yottaa    pptp password * 

peers

vim /etc/ppp/peers/vpn-bos

pty "pptp vpn-bos.yottaa.com --nolaunchpppd" 
name yottaa-1 
remotename pptp 
require-mppe-128 
file /etc/ppp/options.pptp 

options

vim /etc/ppp/options

lock 
lcp-echo-failure 10 
lcp-echo-interval 1 

启动

pppd call vpn-bos

Keepalived安装配置

简介

Keepalived是Linux的高可用软件,其主要是高可用协议的VRRP的开元实现,此外它还提供了方便管理LVS的接口。

安装

wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz && tar xzf keepalived-1.2.7.tar.gz && cd keepalived-1.2.7 && ./configure --prefix=/usr/local/keepalived-1.2.7 && make &&     make install && cd /usr/local && ln -s keepalived-1.2.7 keepalived

配置

mv keepalived.conf ...

VPN-基于LDAP认证的OpenVPN

安装

yum install -y openvpn openvpn-auth-ldap

配置

证书

关于生成证书请参考 VPN-基于OpenVPN构建

/etc/openvpn/server.conf

port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/BJ.crt
key /etc/openvpn/easy-rsa/keys/BJ.key  # This file should be kept secret
dh /etc/openvpn ...

Zabbix监控MySQL

安装源

rpm -ivh http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm

安装包

yum install -y zabbix-agent php php-mysql ...

Zabbix代理模式

简介

Proxy模式用于监控服务器无法直接访问被监控机器的情况,如内网监控。

安装

安装源

rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm

安装proxy及依赖

yum install -y zabbix-proxy-mysql mysql-server

mysql初始化

/usr/bin/mysql_secure_installation

配置

创建数据库

CREATE DATABASE zabbix CHARACTER SET utf8;
GRANT ALL ON zabbix.* TO zabbix@'localhost' IDENTIFIED BY 'zabbixpass ...

回首2014和展望2015

回首2014

回首

今天是2015年的元宵节,虽然这个年终总结比较晚,但还是必须要写写的,因为这一年经历了太多太多了,多到我怕我忘了它有多重要。2014年是我个人意义上的“第十年”,是我有生以来记忆最深刻的两年之一(2003年底,家随着父亲的离去散了;2014年底,我在北京租了两居室把妈妈接来和我的她一起生活,家又回来了)。我自豪于我的努力和拼搏,更感恩于我拥有的一切。

流水账

  • 同往常一样,和我妈满怀希望地“艰难”的过了一个年
  • 她去了杭州
  • 西湖,太子湾公园,茅家埠,西溪湿地,中山陵,夫子庙
  • 在又拍通宵工作至第二天八点,第二次破纪录
  • 离职又拍,回北京,入职Yottaa
  • 姥姥去世
  • 去广州见家长
  • 租房子,接妈妈来北京

得失

  • 一份可以糊口的工作
  • 项目经验,在又拍做了两三个项目,在Yottaa接手了几个项目

  • 姥姥离世
  • 健康,感觉一年不如一年
  • 读书少 ...

Bind基于DLZ实现智能DNS

简介

在我看来基于Bind的只能DNS方案主要包括两个部分:Geolocation和Dynamic Record。国内的业界对智能DNS的定位也无非这两点,但是我所理解的智能DNS是建立在这两条基础上的智能调度系统,比如我有三个负载能力不同的数据中心,DNS可以根据数据中心的metrics(这里可能包括带宽,服务能力等)实现流量的调度,限于个人水平个人未在这个方向有所实践,这个话题留作以后讨论,所以本文只针对前两个问题。由于Bind本身的配置可运维性比较差,这就引出本文主要讨论的DLZ。

原理

DLZ实际上就是扩展了Bind,将Zonefle的内容放到外部数据库里,然后给Bind配置查询语句从数据库里查询记录。当修改数据库里的记录信息的时候,无需重启Bind,下次客户请求时直接就能返回新的记录了。另外,DLZ本身不支持缓存,所以需要自己根据实际情况解决查询的问题。

安装

注意: 这里我以CentOS7上安装dlz-mysql模块为例。

安装依赖

yum install mariadb-devel gcc wget patch make

下载源码

Bind9.8之前的版本需要打patch,具体可参考DLZ官方文档,Bind9.8之后(包括9.8)的版本已经集成DLZ:

wget ftp://ftp.isc ...

Puppet之API操作

背景

最近在做一个自动部署实例的项目,大致流程是首先调用AWS的API来生成实例,然后用Puppet来部署相关服务。但是由于AWS的EIP是可回收的,也就是说新起的实例可能会被分配到一个之前已经使用过EIP,由于证书名称是根据EIP来的,就会导致有对应的证书名称已经在Puppet上记录了,这样就会导致Puppet这个环节失败。鉴于如此,需要在给实例绑定上EIP之后远程清除下Puppet上对应的证书,这样就用到了Puppet的API操作。

基础

Puppet支持RESTful的API:master端主要涉及catalog,certificate,report, resource, file, node, status,和fact;agent端主要涉及fact和run。关于这些资源的详细操作参考这里

关于API的另一方面就是安全方面,Puppet用一个单独的文件(文件名由rest_authconfig)来配置API的ACL,具体ACL的语法如下:

path [~] {/path/to/resource|regex}
[environment {list of environments}]
[method {list of methods}]
[auth[enthicated] {yes|no|on|off|any ...

God进程管理

功能

优点

  • 配置即ruby代码,灵活
  • 可管理后台进程
  • 可动态加载配置
  • 可根据进程消耗资源重启进程
  • 丰富的通知功能,如邮件,campfire等
  • 支持poll和event两种检测模式

缺点

  • 配置复杂,需要ruby背景
  • 文档太少

配置

poll模式:

RAILS_ROOT = "/Users/tom/dev/gravatar2"

%w{8200 8201 8202}.each do |port| God.watch do |w| w.name = "gravatar2-mongrel-#{port}" w.start = "mongrel_rails start -c #{RAILS_ROOT} -p #{port} \ -P #{RAILS_ROOT}/log/mongrel.#{port ...

Supervisor进程管理

功能

优点

  • 配置简单
  • 管理精准
  • 进程组管理
  • RPC扩展
  • API支持
  • FastCGI进程管理
  • 事件支持(如定时任务)

缺点

  • 被管理进程必须前台运行
  • 退出后会使被监管的进程也退出

配置

[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run ...

Monit进程管理

功能

优点

  • 性能高,占用内存少
  • 邮件通知
  • HTTP界面
  • 检测系统性能参数
  • 检测文件属性
  • 检测服务状态
  • 检测文件系统
  • 检测远程主机

缺点

  • 没有API
  • 准确性
  • 配置复杂

配置

set daemon 60 # check services at 1-minute intervals 
set logfile /var/log/monit.log 
set pidfile /var/run/monit.pid 
set idfile /var/.monit.id 
set statefile /var/.monit.state 
set mailserver smtp.xdays ...

意料之外的情理之中

改变

72小时前我还和我女朋友在陪同学逛西湖,现在我在芍药居的一个合租房子里敲着这些字儿。当我拖着一个沉重的行李箱走出北京南的时候,瞬间被淹没在汹涌的人潮中,突然有一种不太好形容的(失落?密集恐惧症?反正是消极的)感觉,不再是三年前初生牛犊不怕虎,我知道自己来干嘛了,也知道会面对什么了。

为何

对于工作,每个人都有自己的衡量标准,在我看来,就是在发展和待遇间找到一个好的权衡点,不适合或者有更适合的就走,合适就留,然后踏踏实实做有价值的事情。关于生活,退居二线仍然是我希望的一种生活方式。说下离开杭州的理由:从工作上说应该毫无疑问,比double多的待遇,外企的环境,完败国内运维环境的技术;从生活上说也许很难,杭州环境优美生活节奏慢,北京环境差生活节奏快,但是要定居杭州挺难,优越的条件都建立在你有资本稳定下来,那么同样无法稳定下来,我就需要做个着眼未来的选择。综合工作和生活考虑,做出回北京这个对的决定,虽然它不一定是好的。

计划

因为拖延症,计划就成了最没用的东西,但是即便如此也不能放弃计划不是,所以简单列举下吧。

  • 去他的拖延症
  • 跑步计划,囚徒健身
  • 英语学习
  • 研发方向

    • 理论基础培训
    • linux深入 ...