Sep 28
如何让history不记住你的执行记录,我们来看一下流程。

1. 通过history 命令查看命令列表
点击在新窗口中浏览此图片

2. 执行uptime ,然后通过history 查看记录
点击在新窗口中浏览此图片

3.通过history 可以查看到刚执行的uptime记录,下面让history 不记录执行的命令,如何操作呢。通过 ls命令前边加空格再次执行。
点击在新窗口中浏览此图片

4. 再次查看history记录,!!没有看到刚执行过的ls命令记录(欺骗成功)。
点击在新窗口中浏览此图片

5. 如果执行的命令前边加空格,默认history命令是不会记录历史的,如何才能让history命令记录加空格的命令呢? 我们可以修改系统的HISTONTROL环境变量来实现,详细看以下。

默认值

HISTONTROL=ignoreboth
改为
HISTCONTROL=ignoredups
再次执行空格加命令
点击在新窗口中浏览此图片
Tags:
Sep 26
作者:研究僧
clip0.02版本:http://blog.puppeter.com/read.php?71
文章地址:http://blog.puppeter.com/read.php?4
Github:https://github.com/puppeter/clip/tree/master/clip.0.01

名字由来
IP数字不容易记忆,所以聪明的人类发明了DNS。DNS把不容易记忆的数字,改为容易记忆的一串有规则的域名,域名又可以解析相应的IP,基于此思路,我们开发了近似DNS的名字服务系统。而在公司内部希望通过名字服务系统在cmdb基础之上把不同的业务(cpu、内存、磁盘和网卡)夹在一起,对于上层可以实现资源互补,对于下层可以方便核算业务成本。所以我们将这名字服务系统命名为“Clip”(夹子)。



什么是Clip
Clip是一款自动化运维工具,适用于海量服务器的管理场景,可以降低系统误操作风险,提高工作效率等。Clip将传统的IP管理纬度替换为String管理纬度,管理方式的改变使海量运维时更加的便捷、可靠与高效。



Clip架构
Clip是C/S架构,它将IP对应String关系保存在Server端,Client端可以下载SDK,通过SDK遍历Server端的String对应IP的关系,并在本地对获取的IP模块关系进行重新的组织与编排。另外,在此基础上Clip还提供了远程命令、文件拷贝、IP组织树遍历、历史命令查看、IP对应String关系正反解析与导入等功能。为海量服务器运维保驾护航,奠定基础。下面来详细介绍以下Clip这款自动换运维工具。

首先,传统服务器管理方式与String管理方式的相比,String管理方式的3点优势:
1) 传统为IP管理方式,IP由4组无意义的数字组成,比较难记忆。与传统方式相比String可以见名识意,方便记忆;
2)  管理海量服务时,IP相似经常会导致运营故障,譬如A模块(10.131.24.37 )和B模块(10.117.24.37) ,后两位数字一致,惯性的认为两个B模块就是A模块,发送配置导致线上故障。通过string管理方式可以很方便的规避此问题;
3) String 可以解析1个IP,也可以解析一组IP ,根据IP也可以反解析String对应关系,这让我们管理一组服务更加的方便。

我们再来看一下String的组成。String由(idc-product-modules-group) 4段组成,了解cmdb的同学会发现它与cmdb的结构很像,4级模块定位一个服务,但是随着业务的发展,笔者觉得4级服务已经无法定位到一个服务,譬如,在一台服务器上混合部署不同的业务模块,这里4级只能定位到服务的IP级别,而无法精确定位到真正的服务,所以Clip在此基础上增加了一级(idc-product-modules-group-port),port端口,通过5段定位一个服务,这也是Clip优势,灵活变换来定位一组服务,满足业务需求。

再来举一个实际的例子,上海机房,A模块使用80端口提供服务,目前有100多个机器 ,B模块使用8080端口提供服务,目前有100多个机器,由于业务流量下降,为了节约资源目前想将两个模块200台机器资源合并,但功能不合并 。我们可将两个服务表示到不通的String中,如A模块(sh-weixin-friend-a-80), B模块(sh-weixin-friend-b-8080),通过String就很容易的将两个服务分别开,并部署在相同的服务器上提供服务了。
刚介绍到Clip 为C/S架构 ,String对应的IP关系保存在server服务器中,Client 通过Clip的SDK获取IP ,其优势3点:
1) IP与String建议一次关系后,所有的的服务器上通过SDK都可以调用到。
2)SDK在解析IP的基础上提供了其他丰富的功能,如扫描服务器,远程命令,远程拷贝等。
3)Clip 提供简单清晰的API与SDK代码结构与文档,当Clip不能满足我们需求时,可以通过文档很容易的扩展Clip 满足自己的需求。

接着我们来看Clip SDK,目前SDK共有8个子命令:
点击在新窗口中浏览此图片
各SDK子命令功能如下:

scan:用于对String对应的IP进行端口存活状态扫描;
cstring: 用于对String对应IP解析,与IP对应String关系的解析;
ssh:用于对String对应IP,远程执行系统命令;
scp:用于对String对应IP,远程拷贝文件;
tree: 遍历String下的子节点;
history:显示历史执行过的命令;
import: 导入IP对应String关系;
lt: 从本地获取IP关系进行管理;
help: 显示Clip子命令。




传统方式vs clip管理方式
传统方式:
在 A 模块的100台服务器上,执行uptime命令,具体的操作步骤如下:
1) 找到要同步的A模块ip列表;
2) 编写脚本与ip列表中的服务器建立连接;
3) 连接服务器时输入账号密码;
4) 账号密码认证成功后拷贝文件;
5) 在每个IP重复以上步骤。

Clip 方式:
1)建立A模块ip列表与string对应关系,譬如为tj-qzone-qzoneini-access6;
2)clip ssh   -p 密码  root@tj-qzone-qzoneini-access6  “执行命令”,以下为结构。
点击在新窗口中浏览此图片



Clip Server安装
1)  安装Apache\PHP和MySQL

# yum install httpd  php msyql mysql-server

点击在新窗口中浏览此图片
2) 安装Clip WEB接口程序。(注: Clip WEB程序由Doitphp框架开发)
2.1) mkdir -p /data/webroot/  (创建http虚拟主机发布目录)
2.2)

wget  http://blog.puppeter.com/download/clip/clip_web.tar.gz

2.3)

tar -xvzf clip_web.tar.gz -C (Apache程序发布目录/data/webroot/)

2.4) 配置httpd.conf ,追加虚拟主机配置信息。

NameVirtualHost *:80
ServerAdmin wds@tencent.com
DocumentRoot /data/webroot/clip_server/
ServerName clip.puppeter.com
ErrorLog logs/clip.puppeter.com-error_log
CustomLog logs/clip.puppeter.com-access_log common


2.5) 启动httpd。
3)service mysqld start 启动Mysql
3.1)

wget http://blog.puppeter.com/download/clip/clip_db.tar.gz 下载表结构

3.2 ) mysql -u root -p  进入mysql,导入表结构

mysql-> create databases clip 创建clip库
mysql-> mysql -u root -p clip < clip.sql 导入数据表。
SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘newpass’); 设置mysql密码
FLUSH PRIVILEGES; 刷新mysql配置

4 ) 设置Clip WEB连接mysql
1) 编辑 /data/webroot/clip_server/application/config/clip.ini.php

Clip SDK安装
Cllip SDK 由Python开发,以下为Clip依赖环境安装过程:
1) 下载安装Python  (注:目前支持Python 2.6.*  和 2.7.*版本)  && expect

# yum install python expect

点击在新窗口中浏览此图片
# python源码安装,推荐2.6.6(下载页面:https://www.python.org/download/releases/2.6.6/)
2)  下载Clip SDK

# wget  http://blog.puppeter.com/download/clip/clip_latest.tar.gz

3) 安装Cllip SDK

# tar -xvzf  clip_p1.0.tar.gz -C /usr/local/servcers (注:指定安装目录)

4) 设置Clip。 编辑 clip/conf/clip.ini 文件,变更server_ip选项为Clip_webIP
点击在新窗口中浏览此图片
5) 导入环境变量

export PATH=$PATH:/usr/local/services/clip/ (安装路径)

或者

echo ‘export PATH=$PATH:/usr/local/services/clip/ ‘ >> /etc/profile && source /etc/profile

5) 执行Cllip命令 (见截图)
点击在新窗口中浏览此图片


Clip SDK使用
Clip SDK 功能用于获取Server上的IP关系,并在Client上重新组织编排IP关系。(注:目前clip也支持将IP存放到本地文件中管理)。目前Clip 提供8个子命令,以下Clip子命令的参数解释与演示(更多案例参考:Clip SDK 案例):
clip scan (用于对String对应的IP进行端口存活状态扫描)

--query_string(-q)# 根据String扫描IP的端口
--ip (-i) # 扫描指定IP的端口
--query_string (-q) *-test-*-*,*-docker-*-* # 多String扫描用逗号分隔
--append (-a) # 在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除String原有IP列表的IP
--limit(-l)# 扫描String中指定范围的IP范围
--port (-P) # 指定自定义扫描端口(注:默认为80端口)
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip

clip scan 使用演示:
扫描*-puppet-*-* 对应开放的端口
点击在新窗口中浏览此图片

clip cstring(正解与反解String对应IP关系)

--query_string(-q)# 解析String对应的IP列表
--ip (-i) # 解析IP对应的String
--query_string (-q) *-test-*-*,*-docker-*-* # 解析多个String对应IP列表,多String用逗号分隔
--limit(-l)# 解析String中指定范围的IP范围
--append (-a) #在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除String原有IP列表的IP
--join (-j) # 指定输出的格式,支持(“&#124;” “,” “\n”,space) 4种格式输出
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip
--count (-c) # 统计输出IP个数
--dryrun (-d) # 输出调用接口用例

clip cstring演示:
解析*-qq-*-* 对应的IP关系。
点击在新窗口中浏览此图片
解析192.168.0.7 对应的String。
点击在新窗口中浏览此图片

clip ssh (远程命令执行工具)

--password (-p) # 密码
--append (-a) # 在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除String原有IP列表的IP
--limit(-l)# 解析String中指定范围的IP范围
--port (-P) #指定自定义端口(注:默认为22端口)
--dryrun (-d) # 输出调用接口用例
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip

clip ssh演示:
查看string(sh-docker-base_v1-*) 对应机器上负载.
点击在新窗口中浏览此图片
查看string(sh-docker-base_v1-*)的第一台服务器对应负载
点击在新窗口中浏览此图片

clip scp (远程命令执行工具)

--password (-p) # 密码
--append (-a) #  在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除cstring原有IP列表的IP
--limit(-l)# 解析String中指定范围的IP范围
--port (-P) # 指定自定义端口(注:默认为22端口)
--dryrun (-d) # 输出调用接口用例
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip

clip scp演示:
将ip文件推送到string(sh-docker-base_v1-*)对应机器的/tmp目录上。
点击在新窗口中浏览此图片

tree(String关系遍历工具)

--query_string(-p) # 密码
--json (-j) # 指定输出的格式
--dryrun (-d) # 输出调用接口用例
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip

clip tree 演示:
遍历*-*-*-* 下的节点
点击在新窗口中浏览此图片

import(IP关系导入工具)

--insert (-i) # 将文件内的clip对应关系导入数据库
--bulid (-b) # 创建clip导入数据库,关系模板文件
--list_struct (-l) # 显示clip数据库结构

clip import 演示:
clip import -b 创建导入string与关系模板
点击在新窗口中浏览此图片

lt(Local tools 本地获取IP关系管理工具)

--password (-p) # 密码
--append (-a) # 追加IP,多个IP用逗号分隔
--remove (-r) # # 删除原有IP列表的IP
--port (-P) # 指定自定义端口(注:默认为22端口)

clip import 演示:
clip lt 根据本地文件IP文件,进行远程ssh command,其中root@“本地IP关系文件名”
点击在新窗口中浏览此图片


接口文档
见:https://github.com/puppeter/clip
Tags: , , , ,
Sep 23
作者:研究僧
文章地址:http://blog.puppeter.com/read.php?4

背景
由于历史的原因我们的机器目前还是单机或单集群对应一个业务模块的形式,优势应对爆发式增长扩容方便,成本结算简单。但是随着网民的饱和,相同业务模块下移动流量上涨,PC流量直线下降,很多业务出现了低负载情况,海量服务器运维中只要有1%的低负载(既机器利用率不饱和)规模也是惊人的,在实际运营中低负载+长尾模块机器数量可能达到了25%-30%之间,当然这里也不排除业务对流量做了冗余与灾备,但是多个业务模块的灾备就会出现浪费资源的情况。我们从运营中发现了这问题的存在,而运维的核心价值也是通过技术优化,能在(成本、质量、效率与安全)四块做优化达到一个很好的收益,所以从2014年中我们开始做离线业务部署项目。项目的思路是通过高负载业务(离线计算)与低负载业务进行混合部署,提升低负载机器利用率同时逐步下线高负载业务的机器为部门节约机器成本。不过经过半年多的运营中我们也发现了很多问题,离线业务的负载均衡权重统一,但是混合部署后的机器负载不均有高有低,混部的结果经常会导致部分机器高负载影响业务,可以看出这里缺少监控负载的和业务合理的手段,经常导致高负载业务影响低负载业务,接口超时影响用户的情况,这是我们不希望看到的,所以总结经验教训,在2015年上半年我们重新打磨项目开发了离线业务混合部署(琥珀自动调度系统)项目,新项目与老项目相比通过docker技术将混部业务控制在容器中,消除争抢资源对业务影响,同时对容器流量进行根据负载调度,在此基础上实现了分时调度等功能。见截图1
点击在新窗口中浏览此图片
希望通过技术架构优化与升级来充分扎干硬件资源,为公司节约服务器成本。在开发过程中,相关业务也向我们提出了以下需求(已经实现功能见图2):
1.机器主动与被动下线不影响在线业务;
2.可以方便的查看到系统运行状态;
3.可以连接到容器内部查询日志以及debug程序;
3.沉淀各系统日常数据,并根据沉淀的数据进行戳峰调度。
点击在新窗口中浏览此图片
系统访问逻辑及接入方式
根据系统需求,最终访问逻辑分为三部分(用户接入、程序逻辑、和容器生成),每层之前交互通过接口,尽量把复杂的逻辑对上一层透明,见图3。
点击在新窗口中浏览此图片

琥珀系统提供两种接入方式:
方式1:
  通过vip方式接入(推荐),用户不必关心底层系统。首次接入将业务环境打为docker,并测试。后续业务流量通过vip引入计算集群(注:计算集群与首次docker业务环境一致),用户不必关系集群内部机器数量与机器状态,系统保证相应的计算量已经容灾调度。见图4
点击在新窗口中浏览此图片
方式2:
  业务流量通过接口获取动态IP列表,并将流量下发到列表IP中。当机器下线接口主动通知业务流量踢IP。与方式1同样首次接入需要打docker镜像源。见图5
点击在新窗口中浏览此图片

系统架构
我们通过介绍开源软件(docker + haproxy + confd + etcd+ clip)来完整整个琥珀系统的架构,见图6
点击在新窗口中浏览此图片

其中开源软件(docker + haproxy + confd + etcd+ clip)介绍如下:如下:
1.Docker(官方网站:https://www.docker.com/)是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化;
2.HAproxy (官方网站:http://www.haproxy.org/ )为负载均衡软件可以根据IP权重自动分发流量,支持8种负载均衡算法;
Confd(官方网站:https://github.com/kelseyhightower/confd)是一个轻量级配置管理工具,它可以从 etcd, consul, dynamodb, redis,zookeeper 或 env获取最新的数据更新本地模板文件;
3.Etcd (官方网站:https://github.com/coreos/etcd) 是一款高可用的键/储存储系统,主要用于服务发现与共享配置,同时聚焦;
   简单:支持 curl 方式的API (HTTP+JSON);
         安全:可选 SSL 客户端证书认证;
         快速:单实例可达每秒 1000 次写操作;        
         可靠:使用 Raft 实现分布式。
etcd是由CoreOS开发并维护使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。目前很多大项目都使用了etcd,如:Google的Kubernetes、Pivotal的Cloud Foundry、Mailgun、Apache Mesos与Mesosphere的DCOS。除开这些大型项目,在GitHub上还有超过500个项目使用了etcd;
4.Clip是(cmdb + tools)的结合(官方网站:http://blog.puppeter.com/read.php?7)。将传统的对IP管理维度替换为String维度,其中String格式为(机房-产品-模块-组-端口),通过Clip可以对IP进行打标签,并根据便签对应属性形式区分服务来源。

程序安装
1)HAproxy安装

# wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.14.tar.gz
# tar –xvzf haproxy-1.5.14.tar.gz  && cd  haproxy-1.5.14
# make install

HAproxy源码编译安装,启动和关闭建议采用以下方式。

# 重启
$ haproxy  -f /etc/haproxy/haproxy.cfg  -p /tmp/haproxy.pid
# 热重启
$ haproxy -D -f /etc/haproxy/haproxy.cfg -p /tmp/haproxy.pid -sf $(cat /tmp/haproxy.pid)


HAproxy 二进制命令参数

-d 前台,debug模式
-D daemon模式启动
-q 安静模式,不输出信息
-V 详细模式
-c 对配置文件进行语法检查
-s 显示统计数据
-l 显示详细统计数据
-dk 不使用kqueue
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-db 禁用后台模式,程序跑在前台
-sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
-st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后
-d 前台,debug模式
-D daemon模式启动
-q 安静模式,不输出信息
-V 详细模式
-c 对配置文件进行语法检查
-s 显示统计数据
-l 显示详细统计数据
-dk 不使用kqueue
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-db 禁用后台模式,程序跑在前台
-sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
-st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后

HAproxy优化

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

2) confd安装
Confd的用途是监听etcd中键值变化,并根据变化更新模块中的数据。(注:这里confd 需要安装在HAproxy相同机器)

wget https://github.com/kelseyhightower/confd/releases/download/v0.6.3/confd-0.6.3-linux-amd64  
# mv confd /usr/local/bin/confd  
# chmod +x /usr/local/bin/confd  
# /usr/local/bin/confd -version  
# mkdir /etc/confd/{conf.d  templates}

在conf.d目录中创建haproxy.toml文件。haproxy.toml是confd的配置文件,其作用是当etcd中的数据发生变化,根据haproxy.toml中的(src)模板信息重新生成目标(dest) 模板,最后重新加目标程序配置文件。它支持所有带配置文件的软件,譬如(nginx,apache,haproxy,lighttpd)等。以下为haproxy.toml文件内容。

haproxy.toml
[template]
src = "haproxy.cfg.tmpl"
dest = "/etc/haproxy/haproxy.cfg"
keys = ["/app/servers/","/app/weiyun"]
reload_cmd = "/usr/local/services/hupo/haproxy-1.4.21/haproxy_reload"

在templates目录中创建haproxy.cfg.tmpl文件,内容如下(注:haproxy.toml中的keys与haproxy.cfg.tmpl模板中遍历的数组要一致):

global
   maxconn 2000
uid 99
gid 99
   daemon
   nbproc 10
   #debug
   #quiet
defaults
        retries 3
        option redispatch
        maxconn 10000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
#       stats uri /haproxy-admin
listen  admin_stat 0.0.0.0:8080
        mode http
    stats refresh 70s
        stats uri /admin_stats
listen  tcp-in 0.0.0.0:1991
        mode tcp
        balance roundrobin

{{range gets "/app/weiyun/*"}}
        server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2
{{end}}

{{range gets "/app/servers/*"}}
        server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2
{{end}}


关于模板更多内容见(https://github.com/kelseyhightower/confd/blob/master/docs/templates.md)

3)etcd安装

# wget https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-linux-amd64.tar.gz
# tar -zxvf etcd-v0.4.6-linux-amd64.tar.gz
# cd etcd-v0.4.6-linux-amd64
# cp etcd* /bin/

启动

# etcd  -name ip_data   -addr IP:4001 -data-dir 数据文件地址 -bind-addr IP:4001

其中etcd常用参数如下:
-name:节点名称;
-addr : 客户端连接地址与端口;
-data-dir: 数据文件存储地址;
-bind-addr:绑定IP + 端口;
其中RESET-API例子

# 增
$ curl -L -X PUT http://127.0.0.1:4001/v2/keys/message -d value="Hello"
{"action":"set","node":{"key":"/message","value":"Hello","modifiedIndex":4,"createdIndex":4}}
# 查
curl -L http://127.0.0.1:4001/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hello","modifiedIndex":4,"createdIndex":4}}
#删
$ curl -L -X DELETE http://127.0.0.1:4001/v2/keys/message
{"action":"delete","node":{"key":"/message","modifiedIndex":19,"createdIndex":4}}


分页: 6/6 第一页 上页 1 2 3 4 5 6 最后页 [ 显示模式: 摘要 | 列表 ]