xdays

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深入 ...

Docker详解

说明 本文档来自前段时间写的一个slide,由于remark没有很好的支持嵌入到HTML中,只能把markdown搬过来了。

Docker

by 张向军


Agenda

  • 简介

  • 概念

  • 基础

  • 高级

  • 扩展


简介

  • 针对可移植的应用的简单轻量虚拟环境
  • 基于容器提供沙箱,基于cgroup和namespace做到资源的隔离
  • 快速,启动容器就是启动进程
  • 轻量,只需要应用运行的依赖
  • 容器即目录,故传输方便
  • 使用aufs或者devicemapper等技术作为存储引擎,节省空间
  • 仓库机制,可相互分享,搜索等

概念

  • cgroups

  • lxc

  • aufs

  • devicemapper

  • namespace


概念-cgroups

cgroups全称control groups,是linux内核提供的一种限制、记录和隔离进程组所使用物理资源的一种机制。在2.6.24之后的内核中都已经支持cgroups。详细的介绍请参考cgroups详解cgroups官方文档

应用场景: 进程隔离 资源统计 ...

Pelican和Github构建静态博客

缘起

最近因为要换工作了,时间比较空闲,所以打算好好整理下自己的博客。想来博客写的越来越少也挺惭愧,好多东西都只停留在笔记的草稿阶段,没有写成博客,后续慢慢整理出来。回到正题,我开博客伊始一直用wordpress(下文简称WP),有点自然不必多说,成熟稳定,功能全面,主题丰富;但是我最近渐渐在思考我真的需要它么,我的日常操作不过是当我的笔记草稿足以成型为一篇博客,我把它粘贴到WP的编辑框,选择下分类,打上标签,点击发布,仅此而已;为此还安装插件让WP支持直接在编辑器里贴markdown;所以我需要的只不过是能够渲染markdown,生成静态html即可,不需要php,也不需要数据库;此外,博客自动发布也是我需要的一个功能。

计划

首先,选择静态博客生成器。目前jekyll的风头最大,但我没有选择他有两个原因:一是学习成本比较高,我只是想用你生成html你却让我学习那么多东西,不值得;二是我是Python党,我希望我用的工具能提升我的Python技能,嗯,这个也很重要。所以我选择用Pelican,它足够简单,拿到就可以使用。

然后,迁移。基本所有的静态博客项目都提供了导入的功能,尤其从WP这样如此流行的项目,但是 ...

Ansible状态管理

简介

就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件,叫做playbook。所有这些类似的概念的东西都是让你用一种更简单的语言(而不是用脚本)来描述你的服务应该是什么样子的,然后这些工具根据你的描述将服务器变成你希望的样子。有了这么一层抽象后,服务部署和配置就变得更加的跨平台了,也提高了可复用性。但请注意,playbook不是万能的,因为playbook底层是在用模块来完成任务,因为模块有限,所以很多时候还是需要写shell脚本(ansible提供了script模块)来完成。

提前说明下要使用ansible的状态管理你需要学习哪些东西:

  • YAML语法,playbook用到的语法很少,这部分学习成本很低;
  • playbook的基本指令,这是基础;
  • 模块的用法,这种重点;
  • jinja2语法,无论是在playbook还是在template里都支持jinja2语法,这是另一个重要的基础,关于jina2的语法不在本文范围内,具体参考官方文档

概念

  • yaml,数据交换格式,类似json和xml,但是比它们更具有可读性,通常用于作为程序的配置文件。ansible的playbook配置使用yaml格式来表达。
  • task,由模块来完成的一个单位任务,如修改文件或者启动服务
  • play,一组task的集合,ansible会自上而下执行
  • handler,task可以触发一定的事件 ...

OpenLDAP构建统一认证之管理工具

自带工具

注意: 如果服务器的ssl证书是自签名的,那么在客户端的ldap.conf文件加入一行TLS_REQCERT never,否则认证会不通过。

安装

ubuntu执行:

apt-get install -y ldap-utils

centos执行:

yum install -y openldap-clients

使用

ldapsearch

ldapsearch,搜索目录树,示例如下:

ldapsearch -v -x -H ldaps://example.com -D "cn=admin,dc=example,dc=com" -W -W -b "dc=xdays,dc=info" -LL

简单解释下选项的作用:

  • -H 指定服务器url
  • -x ...

OpenLDAP构建统一认证之安装配置

安装OpenLDAP

ubuntu

确保本机有符合FQDN的主机名,因为安装程序会根据主机名提取域来作为baseDN

apt-get install slapd

安装过程中会提示设置管理员密码

centos

yum install slapd

配置OpenLDAP

slapd.conf和cn=config

配置slapd服务有两种方式:

  • slapd.conf是传统方式,修改配置文件然后重启服务,centos默认采用这种方式。
  • cn=config是新的配置方式,称之为on-line configuration,ubuntu默认采用这种方式。

配置TLS

自签名证书

mkdir /etc/ldap/certs
openssl genrsa -out ldap.key 1024
openssl req -new -key ldap.key -out ldap.csr
openssl x509 -req ...

OpenLDAP构建统一认证之基础概念

目录服务与关系数据库

目录数据库系统和关系数据库系统都是用来保存数据的,但是他们有两个主要的不同点:

  • 数据结构,目录服务只有树形结构,不像关系数据库有复杂的数据结构。
  • 查询速度与写入速度,目录服务适合查询,不适合写入。

基本概念

在浏览LDAP相关文档时经常会遇见一些概念,下面是常见概念的简单解释:

  • DIT,目录信息树,近似相当于一个表
  • Entry,条目,也叫记录项
  • DN,是无歧义标识一个条目的名字,如"cn=alair,dc=account,dc=xdays,dc=info",相当于主键
  • 属性,一个条目可以有多个属性,常见的属性有CN,O,OU,DC等
  • ObjectClass,对象类,决定了一个条目能具备哪些属性,以及属性对应值的类型
  • Schema,Schema是对象类的集合
  • baseDN,基本DN,baseDN执行绑定查询时的根目录
  • RootDN,根目录,也就是绑定了OpenLDAProotDSE这个类的条目。
  • O,组织 ...

Docker打造开发环境

背景

我一直想要打造这样一个干净且高效的开发环境:干净指与开发隔离,不污染物理机,我已经讨厌重装系统了;高效是指自动化,我需要每次都安装一对依赖,修改一些配置文件等等繁琐的操作,而且自动化过程要快。最开始自己用virtualbox新建虚拟机然后用其自带的克隆功能复制出来;后来用vagrant配合一些配置工具能达到不错的效果,一个文件即可生成开发环境,这应该是主流了,但是这种方式有个缺点就是太慢;现在我自己用docker+supervisor摸索了一个更快的方案。

组件

  • supervisor,管理所有进程
  • sshd,可以登陆到container里,修改代码调试代码
  • app,实际跑的项目

具体运行流程如下: ​

docker -startup-> 运行supervisor ->管理(sshd,项目进程)
                  -> dump出环境变量供远程ssh使用

组件配置

supervisor

supervisor的配置关键就是要让其前台运行,具体配置如下:

[inet_http_server]
port=0.0.0.0:9001
username=root
password=thinkin

[supervisord]
logfile=/tmp ...

虚拟机管理工具vagrant

简介

vagrant是一个基于业界成熟的虚拟化技术打造可配置,可重新生成和可移植的工作环境的工具,一个配置文件完成所有状态定义。

特性

  • 简单,一个配置文件搞定
  • 可通过多种方式自定义虚拟机配置,如shell脚本,ansible等
  • 网络配置,支持私有,共有网络配置
  • 目录同步,保持guest和host文件同步,默认将当前目录映射到虚拟机的/vagrant下
  • 多虚拟机支持,构建自己的集群测试环境
  • 多中虚拟技术支持,如virtualbox,vmware,AWS和docker
  • 插件机制,扩展灵活

概念

  • box就是已经制作好的虚拟机,倒入后保存在\~/vagrang.d目录下,和标准的虚拟机区别就是加入了一些为支持vagrant管理的配置,如公钥
  • Vagrantfile描述和配置要创建的虚拟机的配置

安装

sudo apt-get install vagrant

注意 最新的版本要到其官网下载

配置

添加box

vagrant box add name url

其中,name为box的名字,url为box的路径可远程可本地 ...

Zabbix监控Hadoop

基础概念

JMX

JMX就是Java Management Extentions,为Java程序提供管理功能的框架。看了几个介绍,感觉这个说明比较通俗易懂。一句话说就是JMX为你提供了一个通过特定协议管理应用程序的方案,而我们这里主要用其查询配置和监控数据的功能。

External Check

通过主动调用自定义脚本来获取监控数据,脚本的输出即为该监控项的监控值,这种方式有更强的定制化。因为下午在这里踩到了坑,走了不少弯路,所以这里要对配置方法做个特殊说明。配置监控项时选择external chek,然后在key这一栏要指定运行脚本和参数。下边说下1.8和2.0之后的版本在key配置上的不同:
* 在1.8的版本里key的格式为scriptname[arg1 arg2 ...],参数以空格,Zabbix实际执行的命令是scriptname server_hostname arg1 arg2,详见这里
* 在2.0之后的版本key的格式为scriptname[arg1, arg2 ...],参数以逗号分隔,Zabbix实际执行的命令是scriptname arg1 arg2 ...,详见 ...

IPython自动重新加载模块

问题

调试模块的时候需要不断修改代码,只有重新加载模块才可以看修改效果,而重新加载的方法有reload内置方法和重新运行解释器,这样都不是很方便,我希望修改代码能立刻生效。

解决

IPython有个autoreload扩展,只需要开启扩展并定义扩展的模式即可。

开启扩展

默认的配置位于\~/.config/ipython/profile_default/ipython_config.py,编辑该文件新增:

c.InteractiveShellApp.extensions = ['autoreload']

设定模式

编辑文件\~/.config/ipython/profile_default/ipython_config.py,新增:

c.TerminalIPythonApp.exec_lines = ['%autoreload 2']

这样即可满足需求。

Docker初识

简介

如官方文档所说,docker是一个自动将应用打包成轻量可移植自包涵的容器的引擎。开发者构建的应用可以一次构建全平台运行,包括本地开发机,生产环境,虚拟机和云等。目前处于开发阶段,不可用于生产环境。在你启动一条命令时docker会调用lcx等其他一个组建为这条命令构建一个container,包含了进程运行的所有资源。但是官方文档以说明,docker处于开发阶段目前还不能用于生产环境。

特性

  • Go语言编写
  • 基于lxc的进程级隔离,而lxc基于cgroup,轻量级
  • 通过cgroup做到文件系统,网络和资源的隔离
  • 使用aufs文件系统存储,写时复制,相同数据只保存一份,节省空间
  • 源机制,可相互分享,搜索等

概念

cgroups

cgroups全称control groups,是linux内核提供的一种限制、记录和隔离进程组所使用物理资源的一种机制。在2.6.24之后的内核中都已经支持cgroups。详细的介绍请参考cgroups详解

lxc

lxc全称是linux container,是基于cgroups和chroot等内核特性的一组工具,用于构建虚拟环境。通过一系列的命令行工具可以创建,修改,删除虚拟环境。具体用法可参考ubuntu官方文档

aufs

aufs全称是advance ...

回首2013和展望2014

回首2013

回首

2013年是我个人意义上定义的“第九年”。相比2012年今年的变动比较大,有些在预料之中也有些在意料之外,也正是由于这些变动让自己内心也发生了变化,也不确定自己会变成什么样子。不管怎样既然回首过去就该好好总结下这一年,反思下这一年发生的好的与不好的。

流水帐

  • 同往常一样,和我妈“艰难”的过了一个年
  • 长城,香山,杭州(西湖,龙井),世界公园,怀柔,朝阳公园,天坛,园博园
  • 丰杰离职
  • 和她相遇
  • 我离职
  • 入职又拍云

得失

  • 交了一个铁哥们,月月
  • 收了一个女朋友(准备说是我被她收了:D)
  • 学习能力和分析问题能力提升
  • 技术提升,熟练Python,写了几个不咋样的程序,其他方面略过
  • 离开北京

  • 和妈妈聊的少,因为压力大
  • 薪水没涨,反而稍跌
  • 北京的那个圈子
  • 健康,睡觉时间越来越晚 ...