Memcached和Redis监控脚本分享

Memcached: #!/usr/bin/env python #coding=utf8 import sys import os class GetMemStatus(): def __init__(self): self....
继续阅读 »
Memcached:
#!/usr/bin/env python
#coding=utf8

import sys
import os

class GetMemStatus():
def __init__(self):
self.val = {}
def check(self):
try:
import memcache
self.mc = memcache.Client(['127.0.0.1:11211'], debug=0)
except:
raise Exception, 'Plugin needs the memcache module'

def extract(self, key):
stats = self.mc.get_stats()
try:
if key in stats[0][1]:
self.val[key] = stats[0][1][key]
return self.val[key]
except:
raise Exception, 'ERROR: key is not in stats!!!'

def main():
if len(sys.argv) == 1:
print "ERROR! Please enter a key"
elif len(sys.argv) == 2:
key = sys.argv[1]
a = GetMemStatus()
a.check()
print a.extract(key)

if __name__ == "__main__":
main()

Redis:
#!/usr/bin/env python
#coding=utf8

import sys
import os

class GetRedisStatus():
def __init__(self):
self.val = {}
def check(self):
try:
import redis
self.redis = redis.Redis('127.0.0.1', port=6379, password=None)
except:
raise Exception, 'Plugin needs the redis module'

def extract(self, key):
info = self.redis.info()
try:
if key in info:
self.val[key] = info[key]
return self.val[key]
except:
raise Exception, 'ERROR info not include this key!'

def main():
if len(sys.argv) == 1:
print "ERROR! Please enter a key"
elif len(sys.argv) == 2:
key = sys.argv[1]
a = GetRedisStatus()
a.check()
print a.extract(key)

if __name__ == "__main__":
main()
收起阅读 »

nmap端口扫描初识(一)

什么是端口扫描 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关),但是端口扫描不但可以为黑客所利用,同时端口扫描还是网络安全工作者的必备的利器,通过对端口的扫描,了解网...
继续阅读 »


什么是端口扫描


端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关),但是端口扫描不但可以为黑客所利用,同时端口扫描还是网络安全工作者的必备的利器,通过对端口的扫描,了解网站中出现的漏洞以及端口的开放情况,对网站安全方面有着不可或缺的贡献,是网络安全中的基础认知。
 
目前在市面上主要的端口扫描工具是X_Scan、SuperScan、nmap,其中在这里主推的是nmap,因为nmap具有以下的这一些优点:
  1. 多种多样的参数,丰富的脚本库,满足用户的个人定制需求,其中脚本库还提供了很多强大的功能任你选择
  2. 强大的可移植性,基本上能在所有的主流系统上运行,而且代码是开源的
  3. 详细的文档说明,和强大的社区团队进行支持,方便新人上手

 
Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具,但是nmap也是有一些缺点的,比如说上手较难,但是难上手是相对的,与其他达到这种功能性的软件产品相比,还是比较容易上手的,但是这也不妨碍nmap成为世界千万安全专家列为必备的工具之一,在其中的一些影视作品中《黑客帝国2》、《特警判官》中都有亮相。


Nmap功能介绍


Centos Install:
# yum -y install nmap
Ubuntu Install:
# apt-get install nmap -y
Nmap包含四项基本功能:
  1. 主机发现(Host Discovery)
  2. 端口扫描(Port Scanning)
  3. 版本侦测(Version Detection)
  4. 操作系统侦测(Operating System Detection)

 
下面我们介绍一下主机发现,主机发现顾名思义就是发现所要扫描的主机是否是正在运行的状态,接下来就来一个简单例子:获取http://baidu.com 的主机是否开启, 命令:nmap -F -sT -v baidu.com
  • -F:扫描100个最有可能开放的端口  
  •  -v 获取扫描的信息   
  • -sT:采用的是TCP扫描 不写也是可以的,默认采用的就是TCP扫描
 运行结果如下:
nmap.png
如上图所示1,我们可以发现对URL进行解析花了0.01秒,如果是国外网站这个地方花费的时间较多,可以进行优化的,优化的方法会稍后介绍图中所示2,是总共的运行时间图中的3是说明有98个端口被屏蔽了,也就是说明了网站的防火墙是开启的,因为没有开启防火墙是不会对端口进行屏蔽的。 端口的状态,一般有如下几种:
nmapconfig.png
图中的4是本次返回的关键信息,其中我们要主要关注的是端口号,端口状态,端口上的服务。 那你可能就会要问为什么要关注这些端口呢?那这个问题就要转到探讨为什么要进行扫描?扫描对于黑客和安全人员来说,大致流程都是如下所示:
nmapflow.png
从这个图中我们不难发现,我们主要关注的区域就是这些内容,接下来就来讨论下,上面提出来的问题?怎样对URL解析的时间进行优化,在Nmap重提供了不进行解析的参数(-n),这样就不会对域名进行解析了其中关于域名解析的相关参数还有:
  • -R 为所有的目标主机进行解析
  • --system-dns 使用系统域名解析器进行解析,这个解析起来会比较慢
  • --dns-server 服务器选择DNS解析
说到-R注释的意思你会有所体会,其实nmap的扫描解析不止是对一个目标主机进行解析,还可以对一定范围内的目标主机群进行解析 例如:查找180.149.132.151-152的主机的状态以及端口状态,分析如下:1、虽然查找的主机的数量不多,但是这样查找起来也是很浪费时间的, 所有我们可以通过使用快速查找的方法来节约时间快速查找端口方法的原理如下:默认的情况下,我们的查找是查找最有可能开放的1000端口,但是使用快速端口查找(参数 -F )会查找最有可能开放的100个端口,这样也就节约了10倍的时间 2、这里我们需要获取端口的状态,所以就不能使用参数(-sn),这个参数是可以跳过端口扫描,直接进行主机发现的输入命令:nmap -F -sT -v -n 180.149.132.151-152     180.149.132.151:baidu.com的IP地址PS:1、-sn参数只能扫描的主机,不能扫描端口,另一个参数也要特别注意的是(-PE)通过ICMP echo判定主机是否存活运行情况如下:
result.png
图片中的1处指的是,采用sT的扫描方法,这种扫描方法准确,速度快,但是这样的扫描容易被防火墙和IDS发现并记录,所以这种方法,实际中并不多用由图中的3处我们可以知道在不进行解析的情况下扫描用时为4.53秒,比解析的时候用的时间节约了不少图中的4说明了扫描了2个主机  提示:在nmap运行的时候,如果我们可以像其他编程一样打“断点”,直接按键盘的d键就行了,如果想知道运行的进度可以按下X键

扫描方法

好了,示例也讲完了,下面我们就来分析一下扫描的各种方法:一、端口扫描1、TCP扫描(-sT)这是一种最为普通的扫描方法,这种扫描方法的特点是:扫描的速度快,准确性高,对操作者没有权限上的要求,但是容易被防火墙和IDS(防入侵系统)发现运行的原理:通过建立TCP的三次握手连接来进行信息的传递
portscan.png
  2、SYN扫描(-sS)这是一种秘密的扫描方式之一,因为在SYN扫描中Client端和Server端没有形成3次握手,所以没有建立一个正常的TCP连接,因此不被防火墙和日志所记录,一般不会再目标主机上留下任何的痕迹,但是这种扫描是需要root权限(对于windows用户来说,是没有root权限这个概念的,root权限是linux的最高权限,对应windows的管理员权限) 运行的原理图如下:
synscan.png
 3、NULL扫描NULL扫描是一种反向的扫描方法,通过发送一个没有任何标志位的数据包给服务器,然后等待服务器的返回内容。这种扫描的方法比前面提及的扫描方法要隐蔽很多,但是这种方法的准确度也是较低的, 主要的用途是用来判断操作系统是否为windows,因为windows不遵守RFC 793标准,不论端口是开启还是关闭的都返回RST包
nullscan.png
但是虽然NULL具有这样的一些用处,但是本人却认为不宜使用NULL[list=1]
  • NULL方法的精确度不高,端口的状态返回的不是很准确
  • 要获取目标主机的运行系统,可以使用参数(-O),来获取对于一些操作系统无法准确判断的,可以加上参数(-osscan-guess)
  • NULL扫描易被过滤
  •  4、FIN扫描FIN扫描的原理与NULL扫描的原理基本上是一样的在这里就不重复了5、ACK扫描ACK扫描的原理是发送一个ACK包给目标主机,不论目标主机的端口是否开启,都会返回相应的RST包,通过判断RST包中的TTL来判断端口是否开启运行原理图:
    ackscan.png
    TTL值小于64端口开启,大于64端口关闭大致上主要的扫描方法就是这些,除了我们可以按照这样些参数去执行扫描外,还可以自己定义一个TCP扫描包 6、自定义TCP扫描包的参数为(--scanflags)例如:定制一个包含ACK扫描和SYN扫描的安装包命令:nmap --scanflags ACKSYN baidu.com
    Starting Nmap 7.00 ( https://nmap.org ) at 2016-09-19 23:57 CSTNmap scan report for baidu.com (220.181.57.217)Host is up (0.010s latency).Other addresses for baidu.com (not scanned): 180.149.132.47 123.125.114.144 111.13.101.208Not shown: 998 filtered portsPORT    STATE SERVICE80/tcp  open  http443/tcp open  httpsNmap done: 1 IP address (1 host up) scanned in 5.41 seconds
    接下来还有各种扫描方法的端口列表参数:
    • -PS 端口列表用,隔开[tcp80 syn 扫描]
    • -PA 端口列表用,隔开[ack扫描](PS+PA测试状态包过滤防火墙【非状态的PA可以过】)【默认扫描端口1-1024】
    • -PU 端口列表用,隔开[udp高端口扫描 穿越只过滤tcp的防火墙]

     
    其他的常见命令
    输出命令
    -oN 文件名 输出普通文件
    -oX 文件名 输出xml文件

    错误调试:
    --log-errors 输出错误日志
    --packet-trace 获取从当前主机到目标主机的所有节点
    更多参数参考:http://www.2cto.com/Article/201203/125686.html
    文章参考:http://www.myhack58.com/Article/60/76/2015/67856.htm?utm_source=tuicool&utm_medium=referral 收起阅读 »

    Elasticsearch聚合限制内存使用

    限制内存使用 通常为了让聚合(或者任何需要访问字段值的请求)能够快点,访问fielddata一定会快点, 这就是为什么加载到内存的原因。但是加载太多的数据到内存会导致垃圾回收(gc)缓慢, 因为JVM试着发现堆里面的额外空间,甚至导致OutOfMemory...
    继续阅读 »


    限制内存使用


    通常为了让聚合(或者任何需要访问字段值的请求)能够快点,访问fielddata一定会快点, 这就是为什么加载到内存的原因。但是加载太多的数据到内存会导致垃圾回收(gc)缓慢, 因为JVM试着发现堆里面的额外空间,甚至导致OutOfMemory异常。
     
    最让你吃惊的是,你会发现Elaticsearch不是只把符合你的查询的值加载到fielddata. 而是把index里的所document都加载到内存,甚至是不同的 _type 的document。
     
    逻辑是这样的,如果你在这个查询需要访问documents X,Y和Z, 你可能在下一次查询就需要访问别documents。而一次把所有的值都加载并保存在内存 , 比每次查询都去扫描倒排索引要更方便。
     
    JVM堆是一个有限制的资源需要聪明的使用。有许多现成的机制去限制fielddata对堆内存使用的影响。这些限制非常重要,因为滥用堆将会导致节点的不稳定(多亏缓慢的垃圾回收)或者甚至节点死亡(因为OutOfMemory异常);但是垃圾回收时间过长,在垃圾回收期间,ES节点的性能就会大打折扣,查询就会非常缓慢,直到最后超时。
     
    如何设置堆大小
    对于环境变量 $ES_HEAP_SIZE 在设置Elasticsearch堆大小的时候有2个法则可以运用:
    • 不超过RAM的50%
    Lucene很好的利用了文件系统cache,文件系统cache是由内核管理的。如果没有足够的文件系统cache空间,性能就会变差。
    • 不超过32G
    如果堆小于32GB,JVM能够使用压缩的指针,这会节省许多内存:每个指针就会使用4字节而不是8字节。 把对内存从32GB增加到34GB将意味着你将有更少的内存可用,因为所有的指针占用了双倍的空间。同样,更大的堆,垃圾回收变得代价更大并且可能导致节点不稳定;这个限制主要是大内存对fielddata影响比较大。

    Fielddata大小

    参数 indices.fielddata.cache.size 控制有多少堆内存是分配给fielddata。当你执行一个查询需要访问新的字段值的时候,将会把值加载到内存,然后试着把它们加入到fielddata。如果结果的fielddata大小超过指定的大小 ,为了腾出空间,别的值就会被驱逐出去。 默认情况下,这个参数设置的是无限制 — Elasticsearch将永远不会把数据从fielddata里替换出去。 这个默认值是故意选择的:fielddata不是临时的cache。它是一个在内存里为了快速执行必须能被访问的数据结构,而且构建它代价非常昂贵。如果你每个请求都要重新加载数据,性能就会很差。 一个有限的大小强迫数据结构去替换数据。我们将看看什么时候去设置下面的值,首先让我们看一个警告: 【warning】这个设置是一个保护措施,而不是一个内存不足的解决方案
    break.png
     如果你没有足够的内存区保存你的fielddata到内存里,Elasticsearch将会经常性的从磁盘重新加载数据,并且驱逐别的数据区腾出空间。这种数据的驱逐会导致严重的磁盘I/O,并且在内存里产生大量的垃圾,这个会在后面被垃圾回收。 假设你在索引日志,每天使用给一个新的索引。通常情况下你只会对过去1天或者2天的数据感兴趣。即使你把老的索引数据保留着,你也很少查询它们。尽管如此,使用默认的设置, 来自老索引的fielddata也不会被清除出去!fielddata会一直增长直到它触发fielddata circuit breaker --参考断路器 --它将阻止你继续加载fielddata。 在那个时候你被卡住了。即使你仍然能够执行访问老的索引里的fielddata的查询, 你再也不能加载任何新的值了。相反,我们应该把老的值清除出去给新的值腾出空间。 为了防止这种情景,通过在 config/elasticsearch.yml 文件里加上如下的配置给fielddata 设置一个上限:
    indices.fielddata.cache.size:  40%
    当然可以设置成堆大小的百分比,也可以是一个具体的值,比如 8gb;通过适当的设置这个值,最近被访问的fielddata将被清除出去,给新加载的数据腾出空间。 在网上你可能会看到另外一个设置参数: indices.fielddata.cache.expire 。千万不要使用这个设置!这个设置高版本已经废弃。这个设置告诉Elasticsearch把比过期时间老的数据从fielddata里驱逐出去,而不管这个值是否被用到。这对性能是非常可怕的 。驱逐数据是有代价的,并且这个有目的的高效的安排驱逐数据并没有任何真正的收获。没有任何理由去使用这个设置;我们一点也不能从理论上制造一个假设的有用的情景。现阶段存 在只是为了向后兼容。我们在这个书里提到这个设置是因为这个设置曾经在网络上的各种文章里 被作为一个 ``性能小窍门'' 被推荐过。记住永远不要使用它,就ok!

    监控fielddata

    监控fielddata使用了多少内存以及是否有数据被驱逐是非常重要的。大量的数据被驱逐会导致严重的资源问题以及不好的性能。 Fielddata使用可以通过下面的方式来监控:
    • 对于单个索引使用 {ref}indices-stats.html[indices-stats API]:
    GET /_stats/fielddata?fields=*
    • 对于单个节点使用 {ref}cluster-nodes-stats.html[nodes-stats API]:
    GET /_nodes/stats/indices/fielddata?fields=*
    • 或者甚至单个节点单个索引

    GET /_nodes/stats/indices/fielddata?level=indices&fields=*
    通过设置 ?fields=* 内存使用按照每个字段分解了.


    断路器(breaker)


    聪明的读者可能已经注意到fielddata大小设置的一个问题。fielddata的大小是在数据被加载之后才校验的。如果一个查询尝试加载到fielddata的数据比可用的内存大会发生什么情况?答案是不客观的:你将会获得一个OutOfMemory异常。
     
    Elasticsearch包含了一个 fielddata断路器 ,这个就是设计来处理这种情况的。断路器通过检查涉及的字段(它们的类型,基数,大小等等)来估计查询需要的内存。然后检查加 载需要的fielddata会不会导致总的fielddata大小超过设置的堆的百分比。
     
    如果估计的查询大小超过限制,断路器就会触发并且查询会被抛弃返回一个异常。这个发生在数据被加载之前,这就意味着你不会遇到OutOfMemory异常。
     
    Elasticsearch拥有一系列的断路器,所有的这些都是用来保证内存限制不会被突破
    indices.breaker.fielddata.limit
    这个 fielddata 断路器限制fielddata的大小为堆大小的60%,默认情况下。
    indices.breaker.request.limit
    这个 request 断路器估算完成查询的其他部分要求的结构的大小,比如创建一个聚集通, 以及限制它们到堆大小的40%,默认情况下。
    indices.breaker.total.limit
    这个total断路器封装了 request 和 fielddata 断路器去确保默认情况下这2个 使用的总内存不超过堆大小的70%。
     
    断路器限制可以通过文件 config/elasticsearch.yml 指定,也可以在集群上动态更新:
    PUT /_cluster/settings
    {
    "persistent" : {
    "indices.breaker.fielddata.limit" : 40% (1)
    }
    }
    这个限制设置的是堆的百分比。
     
    最好把断路器设置成一个相对保守的值。记住fielddata需要和堆共享 request 断路器, 索引内存缓冲区,过滤器缓存,打开的索引的Lucene数据结构,以及各种各样别的临时数据 结构。所以默认为相对保守的60%。过分乐观的设置可能会导致潜在的OOM异常,从而导致整 个节点挂掉。

    从另一方面来说,一个过分保守的值将会简单的返回一个查询异常,这个异常会被应用处理。 异常总比挂掉好。这些异常也会促使你重新评估你的查询:为什么单个的查询需要超过60%的 堆空间。


    断路器和Fielddata大小


    在 Fielddata大小部分我们谈到了要给fielddata大小增加一个限制去保证老的不使用 的fielddata被驱逐出去。indices.fielddata.cache.size 和 indices.breaker.fielddata.limit 的关系是非常重要的。如果断路器限制比缓冲区大小要小,就会没有数据会被驱逐。为了能够 让它正确的工作,断路器限制必须比缓冲区大小要大。

    我们注意到断路器是和总共的堆大小对比查询大小,而不是和真正已经使用的堆内存区比较。 这样做是有一系列技术原因的(比如,堆可能看起来是满的,但是实际上可能正在等待垃圾 回收,这个很难准确的估算)。但是作为终端用户,这意味着设置必须是保守的,因为它是 和整个堆大小比较,而不是空闲的堆比较。


    参考:Elasticsearch权威指南笔记 
    官网:https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html


    收起阅读 »

    Hadoop fs命令学习小记

    1,hadoop fs –fs [local | ]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop jar里的hadoop-default.xml->[Math Processing Error...
    继续阅读 »
    HDFS.png

    1,hadoop fs –fs [local | ]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop jar里的hadoop-default.xml->[Math Processing Error]HADOOPCONFDIR下的hadoop−default.xml−>HADOOP_CONF_DIR下的hadoop-site.xml。使用local代表将本地文件系统作为hadoop的DFS。如果传递uri做参数,那么就是特定的文件系统作为DFS。

    2,hadoop fs –ls :等同于本地系统的ls,列出在指定目录下的文件内容,支持pattern匹配。输出格式如filename(full path)     size.其中n代表replica的个数,size代表大小(单位bytes)。

    3,hadoop fs –lsr :递归列出匹配pattern的文件信息,类似ls,只不过递归列出所有子目录信息。

    4,hadoop fs –du :列出匹配pattern的指定的文件系统空间总量(单位bytes),等价于unix下的针对目录的du –sb /*和针对文件的du –b ,输出格式如name(full path)  size(in bytes)。

    5,hadoop fs –dus :等价于-du,输出格式也相同,只不过等价于unix的du -sb。

    6,hadoop fs –mv :将制定格式的文件 move到指定的目标位置。当src为多个文件时,dst必须是个目录。

    7,hadoop fs –cp :拷贝文件到目标位置,当src为多个文件时,dst必须是个目录。

    8,hadoop fs –rm [-skipTrash] :删除匹配pattern的指定文件,等价于unix下的rm

    9,hadoop fs –rmr [skipTrash] :递归删掉所有的文件和目录,等价于unix下的rm –rf

    10,hadoop fs –rmi [skipTrash] :等价于unix的rm –rfi

    11,hadoop fs –put :从本地系统拷贝文件到DFS。

    12,hadoop fs –copyFromLocal :等价于-put。

    13,hadoop fs –moveFromLocal :等同于-put,只不过源文件在拷贝后被删除。

    14,hadoop fs –get [-ignoreCrc] [-crc] :从DFS拷贝文件到本地文件系统,文件匹配pattern,若是多个文件,则dst必须是目录。

    15,hadoop fs –getmerge :顾名思义,从DFS拷贝多个文件、合并排序为一个文件到本地文件系统。

    16,hadoop fs –cat :展示文件内容。

    17,hadoop fs –copyToLocal [-ignoreCrc] [-crc] :等价于-get。

    18,hadoop fs –mkdir :在指定位置创建目录。

    19,hadoop fs –setrep [-R] [-w] :设置文件的备份级别,-R标志控制是否递归设置子目录及文件。

    20,hadoop fs –chmod [-R] PATH…:修改文件的权限,-R标记递归修改。MODE为a+r,g-w,+rwx等,OCTALMODE为755这样。

    21,hadoop fs -chown [-R] [OWNER][:[GROUP]] PATH…:修改文件的所有者和组。-R表示递归。

    22,hadoop fs -chgrp [-R] GROUP PATH…:等价于-chown … :GROUP …。

    23,hadoop fs –count[-q] :计数文件个数及所占空间的详情,输出表格的列的含义依次为:DIR_COUNT,FILE_COUNT,CONTENT_SIZE,FILE_NAME或者如果加了-q的话,还会列出QUOTA,REMAINING_QUOTA,SPACE_QUOTA,REMAINING_SPACE_QUOTA。

    最后就是万能的hadoop fs –help 收起阅读 »

    Hbase shell常用命令小记

    1、进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成功之后再使用hbase shell进入可以使用w...
    继续阅读 »
    hbase.png
    1、进入hbase shell console
    $HBASE_HOME/bin/hbase shell
    如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成功之后再使用hbase shell进入可以使用whoami命令可查看当前用户
    hbase(main):002:0> whoami
    2016-09-12 13:09:42,440 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    root (auth:SIMPLE)
    groups: root

     2、表的管理
    1)查看有哪些表
    hbase(main):001:0> list
    TABLE
    pythonTrace
    1 row(s) in 0.1320 seconds
    2)创建表
    语法:create , {NAME => , VERSIONS => }
    例如:创建表t1,有两个family name:f1,f2,且版本数均为2
    hbase(main):001:0> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}
    0 row(s) in 0.4400 seconds

    => Hbase::Table - t1
    3)删除表
    分两步:首先disable,然后drop ;  例如:删除表t1
    hbase(main):002:0> disable 't1'
    0 row(s) in 1.2030 seconds

    hbase(main):003:0> drop 't1'
    0 row(s) in 0.1870 seconds
    4)查看表的结构
    语法:describe
    ,  例如:查看表t1的结构
    hbase(main):005:0> describe 't1'
    Table t1 is ENABLED
    t1
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '2', COMP
    RESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_M
    EMORY => 'false', BLOCKCACHE => 'true'}
    {NAME => 'f2', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '2', COMP
    RESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_M
    EMORY => 'false', BLOCKCACHE => 'true'}
    2 row(s) in 0.0240 seconds
    5)修改表结构
    修改表结构必须先disable
    语法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}; 例如:修改表t1的cf的TTL为180天
    hbase(main):006:0> disable 't1'
    0 row(s) in 1.1950 seconds

    hbase(main):007:0> alter 't1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'}
    Updating all regions with the new schema...
    1/1 regions updated.
    Done.
    Updating all regions with the new schema...
    1/1 regions updated.
    Done.
    0 row(s) in 2.1910 seconds

    hbase(main):008:0> enable 't1'
    0 row(s) in 0.3930 seconds

    3、权限管理
    1)分配权限
    语法 : grant
    参数后面用逗号分隔
    权限用五个字母表示: "RWXCA"; READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
    例如,给用户‘test'分配对表t1有读写的权限
    hbase(main)> grant 'test','RW','t1'
    2)查看权限
    语法:user_permission
    ; 例如,查看表t1的权限列表
    hbase(main)> user_permission 't1'
    3)收回权限
    与分配权限类似,语法:revoke

    例如,收回test用户在表t1上的权限
    hbase(main)> revoke 'test','t1'

    4、表数据的增删改查
    1)添加数据
    语法:put
    ,,,,
    例如:给表t1的添加一行记录:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系统默认
    hbase(main)> put 't1','rowkey001','f1:col1','value01'
    用法比较单一
    2)查询数据
    a)查询某行记录
    语法:get
    ,,[,....]   ;例如:查询表t1,rowkey001中的f1下的col1的值
    hbase(main)> get 't1','rowkey001', 'f1:col1'
    # 或者:
    hbase(main)> get 't1','rowkey001', {COLUMN=>'f1:col1'}
    查询表t1,rowke002中的f1下的所有列值
    hbase(main)> get 't1','rowkey001'
    b)扫描表
    语法:scan
    , {COLUMNS => [ ,.... ], LIMIT => num}
    另外,还可以添加STARTROW、TIMERANGE和FITLER等高级功能; 例如:扫描表t1的前5条数据
    hbase(main)> scan 't1',{LIMIT=>5}
    c)查询表中的数据行数
    语法:count
    , {INTERVAL => intervalNum, CACHE => cacheNum}
    INTERVAL设置多少行显示一次及对应的rowkey,默认1000;CACHE每次去取的缓存区大小,默认是10,调整该参数可提高查询速度
    例如,查询表t1中的行数,每100条显示一次,缓存区为500
    hbase(main)> count 't1', {INTERVAL => 100, CACHE => 500}
    3)删除数据
    a )删除行中的某个列值
    语法:delete
    , , ,必须指定列名
    例如:删除表t1,rowkey001中的f1:col1的数据
    hbase(main)> delete 't1','rowkey001','f1:col1'
    注:将删除改行f1:col1列所有版本的数据
     
    b )删除行
    语法:deleteall
    , , ,可以不指定列名,删除整行数据
    例如:删除表t1,rowk001的数据
    hbase(main)> deleteall 't1','rowkey001'
    c)删除表中的所有数据
    语法: truncate

    其具体过程是:disable table -> drop table -> create table ;例如:删除表t1的所有数据
    hbase(main)> truncate 't1'

    5、Region管理
    1)移动region
    语法:move 'encodeRegionName', 'ServerName'
    encodeRegionName指的regioName后面的编码,ServerName指的是master-status的Region Servers列表
    示例如下:
    hbase(main)>move '4343995a58be8e5bbc739af1e91cd72d', 'db-41.xxx.xxx.org,60020,1390274516739'
    2)开启/关闭region
    语法:balance_switch true|false
    hbase(main)> balance_switch
    3)手动split
    语法:split 'regionName', 'splitKey'
    4)手动触发major compaction
    #语法:
    #Compact all regions in a table:
    hbase> major_compact 't1'
    #Compact an entire region:
    hbase> major_compact 'r1'
    #Compact a single column family within a region:
    hbase> major_compact 'r1', 'c1'
    #Compact a single column family within a table:
    hbase> major_compact 't1', 'c1'

    6、配置管理及节点重启
    1)修改hdfs配置
    hdfs配置位置:/etc/hadoop/conf
    # 同步hdfs配置
    cat /home/hadoop/slaves|xargs -i -t scp /etc/hadoop/conf/hdfs-site.xml hadoop@{}:/etc/hadoop/conf/hdfs-site.xml
    # 关闭:
    cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode"
    # 启动:
    cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start datanode"
    2)修改hbase配置
    hbase配置位置:
    # 同步hbase配置
    cat /home/hadoop/hbase/conf/regionservers|xargs -i -t scp /home/hadoop/hbase/conf/hbase-site.xml hadoop@{}:/home/hadoop/hbase/conf/hbase-site.xml
    # graceful重启
    cd ~/hbase
    bin/graceful_stop.sh --restart --reload --debug inspurXXX.xxx.xxx.org
    收起阅读 »

    influxdata监控系统介绍

    influxdata是一个强大的实时监控系统,分为4个部分,系统架构图如下:  Telegraf Telegraf负责收集监控数据,并将数据输出到influxDB数据库,它支持多种类型的数据输入,比如httpjson、mysql、rabbitMQ...
    继续阅读 »
    influxdata是一个强大的实时监控系统,分为4个部分,系统架构图如下: 
    influxdata.png


    Telegraf


    Telegraf负责收集监控数据,并将数据输出到influxDB数据库,它支持多种类型的数据输入,比如httpjson、mysql、rabbitMQ等等。
     


    InfluxDB


    influxdb.png

    InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。
     


    Chronograf


    chronrogf.png

    从InfluxDB时间序列数据的数据可视化工具,负责从InfluxDB收集数据,并将数据图表以web的形式发布。
     


    Kapacitor


    kapacitor.png

    Kapacitor是InfluxDB的数据处理引擎,主要作用是时间序列数据处理、监视和警报。
     


    Enterprise Manager


    Enterprise Manager是正在开发的UI系统,用于更加广泛的图形展示。

    InfluxData平台是第一个专用,端到端解决方案收集、存储、可视化和警报在时间序列数据规模。基于堆栈,所有组件平台的设计无缝地协同工作。TICK堆栈是什么?这是influxdata的愿景管理时间序列数据的完整的数据平台。
    tick-stack-grid.jpg
    收起阅读 »

    Kafka集群中如何平衡Topics

    为什么我们需要平衡Topic 当一个kafka集群中一个节点关闭或者宕机,该服务器的负载任务将分配到集群中的其他节点,这种分配是不均匀的;即负载不是均匀的分布在集群中所有节点,我们需要做一些措施来实现这一平衡(也称为再平衡)。   再平衡我们需要注意两件事...
    继续阅读 »


    为什么我们需要平衡Topic


    当一个kafka集群中一个节点关闭或者宕机,该服务器的负载任务将分配到集群中的其他节点,这种分配是不均匀的;即负载不是均匀的分布在集群中所有节点,我们需要做一些措施来实现这一平衡(也称为再平衡)。
     
    再平衡我们需要注意两件事情。一是leader连任,或首选副本选举,另一种是分区的再平衡。多数情况下,一个节点宕机,然后过段时间又重新加入集群,第二种情况就是,当我们想要么减少或增加集群中节点的数目。 让我们来看看如何处理这些不同的场景平衡Topic的情况。
     
    我下面的案例以5个broker的kafka集群为例。
     


    案例1:当broker因为维护或由于服务器故障而关闭,并在一定的时间恢复 


    有两种方法来处理这​​种情况。 一种是添加以下行到代理配置“auto.leader.rebalance.enable”自动重新平衡,但这个报告是个问题 。 另一种方法是手动使用“kafka-preferred-replica-election.sh”的工具。
     
    编辑配置文件server.properties配置文件,添加auto.leader.rebalance.enable = false
    kafkap1.png

     
    我们让broker4宕机,然后看看topic负载如何分布
    KafkaPrition.png

     
    在这里我们可以看到负载不均匀分布,接下来我们在恢复broker4看看。
    KafkaEvenly.png

     
    现在,我们可以看到,即使broker4已经恢复到集群中服务了,但是它不是作为一个领导者作用于任何分区。那让我们使用kafka-preferred-replica-election.sh工具来平衡负载试试。
    KafkaReelection.png

    KafkaDescribe.png

    现在我们可以看到topic分布是平衡的。


    案例2:一个节点宕机且无法恢复


    我们创建了一个新的broker,即使设置其borker.id为以前的broker的ID,那也是不能恢复的,只能手动运行kafka-preferred-replica-election.sh是topic平衡。


    案例3:增加或者减少kafka集群中节点数量


    增加或者删除节点,平衡topic步骤如下:
    1. 使用分区重新分配的工具(kafka-reassign-partition.sh),使用--generta参数生成一个推荐配置,这显示了当前和建议的副本分配情况;
    2. 复制推荐分配配置方案到jason文件中;
    3. 执行分区重新分配工具(kafka-reassign-partition.sh -execute)来更新元数据平衡。 确保运行的时候集群中节点负载问题,因为这个过程是在不同节点间发生数据移动;
    4. 等待一段时间(基于必须移动一定量的数据),并使用--verify选​​项验证平衡成功完成
    5. 一旦分区重新分配完成后,运行“kafka-preferred-replica-election.sh”工具来完成平衡。

     
    在这里我们假设为减少kafka集群中的节点数(这里为介绍broker5),当节点终止后,我们使用使用分区重新分配工具,生成一份当前和建议的副本任务作为JSONs候选人分配的配置。
    KafkaGenerate.png


    把建议重新分配配置复制到一个JSON文件并执行分区重新分配的工具。 这将更新元数据,然后开始四处移动数据来平衡负载。
    KafkaJson.png

    KafkaExecute.png

     
    接下来我们验证重新平衡/重新分配是否成功:
    KafkaVerify.png

     
    一旦重新分配所有分区是成功的,我们运行的首选副本竞选工具来平衡的主题,然后运行“描述主题”来检查主题平衡。
    Kafkapre.png

    KafkaView.png

    现在我们可以看到topic(以及leaders和replicas)都是平衡的。
    英文原文:https://blog.imaginea.com/how-to-rebalance-topics-in-kafka-cluster/
      收起阅读 »

    Linux的复仇

    Linux 系统在早期的时候被人们嘲笑,它什么也干不了。而现在,Linux 无处不在! 我当时还是个在巴西学习计算机工程的大三学生,并同时在一个全球审计和顾问公司兼职系统管理员。公司决定用 Oracle 数据库开发一些企业资源计划(ERP)软件。因...
    继续阅读 »
    linux.jpg

    Linux 系统在早期的时候被人们嘲笑,它什么也干不了。而现在,Linux 无处不在!

    我当时还是个在巴西学习计算机工程的大三学生,并同时在一个全球审计和顾问公司兼职系统管理员。公司决定用 Oracle 数据库开发一些企业资源计划(ERP)软件。因此,我得以在 Digital UNIX OS (DEC Alpha) 进行训练,这个训练颠覆了我的三观。

    UNIX 系统非常的强大,而且给予了我们对机器上包括存储系统、网络、应用和其他一切的绝对控制权。

    我开始在 ksh 和 Bash 里编写大量的脚本让系统进行自动备份、文件传输、提取转换加载(ETL)操作、自动化 DBA 日常工作,还为各种不同的项目创建了许多服务。此外,调整数据库和操作系统的工作让我更好的理解了如何让服务器以最佳方式运行。在那时,我在自己的个人电脑上使用的是 Windows 95 系统,而我非常想要在我的个人电脑里放进一个 Digital UNIX,或者哪怕是 Solaris 或 HP-UX 也行,但是那些 UNIX 系统都得在特定的硬件才能上运行。我阅读了所有的系统文档,还找过其它的书籍以求获得更多的信息,也在我们的开发环境里对这些疯狂的想法进行了实验。

    后来在大学里,我从我的同事那听说了 Linux。我那时非常激动的从还在用拨号方式连接的因特网上下载了它。在我的正宗的个人电脑里装上 UNIX 这类系统的这个想法真是太酷了!

    Linux 不同于 UNIX 系统,它设计用来在各种常见个人电脑硬件上运行,在起初,让它开始工作确实有点困难,Linux 针对的用户群只有系统管理员和极客们。我为了让它能运行,甚至用 C 语言修改了驱动软件。我之前使用 UNIX 的经历让我在编译 Linux 内核,排错这些过程中非常的顺手。由于它不同于那些只适合特定硬件配置的封闭系统,所以让 Linux 跟各种意料之外的硬件配置一起工作真的是件非常具有挑战性的事。

    我曾见过 Linux 在数据中心获得一席之地。一些具有冒险精神的系统管理员使用它来帮他们完成每天监视和管理基础设施的工作,随后,Linux 作为 DNS 和 DHCP 服务器、打印管理和文件服务器等赢得了更多的使用。企业曾对 Linux 有着很多顾虑(恐惧,不确定性,怀疑(FUD:fear, uncertainty and doubt))和诟病:谁是它的拥有者?由谁来支持它?有适用于它的应用吗?

    但现在看来,Linux 在各个地方进行着逆袭!从开发者的个人电脑到大企业的服务器;我们能在智能手机、智能手表以及像树莓派这样的物联网(IoT)设备里找到它。甚至 Mac OS X 有些命令跟我们所熟悉的命令一样。微软在制造它自己的发行版,在 Azure 上运行,然后…… Windows 10 要装备 Bash。

    有趣的是 IT 市场会不断地创造并迅速的用新技术替代,但是我们所掌握的 Digital UNIX、HP-UX 和 Solaris 这些旧系统的知识还依然有效并跟 Linux 息息相关,不论是为了工作还是玩。现在我们能完全的掌控我们的系统,并使它发挥最大的效用。此外,Linux 有个充满热情的社区。

    我真的建议想在计算机方面发展的年轻人学习 Linux,不论你处于 IT 界里的哪个分支。如果你深入了解了一个普通的家用个人电脑是如何工作的,你就可以以基本相同的方式来面对任何机器。你可以通过 Linux 学习最基本的计算机知识,并通过它建立能在 IT 界任何地方都有用的能力!


    翻译原文:https://opensource.com/life/16/8/revenge-linux


    收起阅读 »

    Python编码解析

    一般我们在Python2.7的环境进行Python的编程的时候,一般头部会加#-*- coding:utf-8 -*- ​来声明编码类型为utf-8的编码,那为什么要声明,一定要声明吗? 针对如上问题我们先来讨论另外一个问题,为什么我们可以在显示器上能看到这...
    继续阅读 »
    一般我们在Python2.7的环境进行Python的编程的时候,一般头部会加#-*- coding:utf-8 -*- ​来声明编码类型为utf-8的编码,那为什么要声明,一定要声明吗?

    针对如上问题我们先来讨论另外一个问题,为什么我们可以在显示器上能看到这些文字、数字、图片、字符、等等信息呢?大家都知道计算机本身只能识别 0  1 的组合,他们是怎么展示这些内容的呢?我们怎么和计算机去沟通呢?

    如果我们使用0 1 的组合和计算机沟通你还能看到这些内容吗?还有一个问题就是01的组合我相信对于常人类都是没有办法看懂的。

    那怎么办?如何让计算机理解我们的语言,并且我们能理解计算机的语言呢?

    举个比较形象的例子,中英文词典对照表,这样我们就可以把中英文进行互相的翻译了呢?对不对!同理计算机也是这样的他需要一个标准的对照关系,那么这个标准最早叫什么呢?ASCII表
    ascii.gif

    表格内容大致如下:
    有特殊符号、大写字母、小写字母、数字(这里注意下0~9的数字是字符),在这些字符左边都有一个10进制的数字。但是对于10进制来说计算机他也是不能理解的,因为他只能理解0 1 ,但是10进制和2进制的转换就非常容易了!

    举例来说:如果我在键盘上按一个A字母的时候那么实际是给计算机传输了一个数字65,通过这样的机制和计算机沟通,有了这个ASCII码表就可以和任何计算机进行沟通了。

    这里在看个知识点:计算机中最小的单位是什么?bit   bit就咱们常说一位二进制,一位二进制要么是0 要么是 1

    但是bit这个单位太小了,我们用字节(byte)来表示。他们是有换算的规则的(看下面的规则我想大家都不是很陌生对吧):
    8b = 1B  #小b=bit ; 大B=byte
    1024B = 1KB
    1024KB = 1M
    1024M = 1G
    1024G = 1T
    在存储英文的时候我们至少需要1个字节(一个字母),就是8位(bit),看下ASCII表中1个字节就可以表示所有的英文所需要的字符,是不非常高效!

    为什么呢?早期的计算机的空间是非常宝贵的!

    那你会发现1个字节8位,他能存储的最大数据是2的8次方-1 = 255,一个字节最多能表示255个字符 那西方国家他们使用了127个字符,那么剩下字符是做什么的呢?就是用来做扩展的,西方人考虑到还有其他国家。所以留下了扩展位。

    但是呢有问题,计算机是西方人发明的,如果仅仅支持英文的话,这127个字符完全就可以表示所有英文中能用的的内容了。但是他没有考虑咱们大中国啊!ASCII到了中国之后发现:咱们中国最常用的中文都有6000多个完全不够用啊!

    但是怎们办?中国人非常聪明:就在原有的扩展位中,扩展出自己的gbk、gb2312、gb2318字符编码。 

    他是怎么扩展的呢?比如说在ASCII码中的128这个位置,这个位置又指定一张单独表,聪明吧! 其他国家也是这样设计的!

    中国东亚大国是吧,我们国家比较NB,我要兼容其他国家的常用的编码!比如韩国日本,因为韩国和日本人家都有自己的编码,人家根本就不鸟你,举个例子来说,比如韩国的游戏,在中国下载安装之后会出现乱码的情况?什么鬼?

    这种乱码的出现基本上就两种情况:
    1、字符编码没有
    2、字符编码冲突了,人家在写这个程序的时候指定的字符集和咱们使用的字符集的位置不对。 

    你想想不光是亚洲国家这样,欧洲国家,非洲国家都会存在这个问题,基于这个乱象国际互联网组织就说你们各个国家都别搞了,我们给你们搞一个统一的,这个统一的是什么呢Unicode“万国编码”

    Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536, 注:此处说的的是最少2个字节,可能更多。

    这里还有个问题:使用的字节增加了,那么造成的直接影响就是使用的空间就直接翻倍了!举例还说:同样是ABCD这些字符存储一篇相同的文章,使用ASCII码如果是1M的话,那么Unicode存储至少2M可能还会更多。

    为了解决个问题就出现了:UTF-8编码

    UTF-8编码:是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

    通过这种可扩展的方式来存储。

    OK 上面了解了:
    1、什么ASCII编码
    2、什么Unicode编码
    3、什么UTF-8编码

    回顾下乱码的出现原因:1、没有字符集 2、字符集冲突

    回过头来看下为什么需要在第二行加上指定编码呢?在2.x版本的Python中Pyton在解释.py文件的时候,默认是给他一个编码的就是ASCII码,so如果在2.7版本中如果你不指定编码并且在.py文件中写了一个ASCII码中没有的字符就会显示乱码 。

    不过这个问题在Python3中就不存在了,因为在Python3中默认就是Unicode编码。


    Python编码转换


    有一个问题,既然有统一的Unicode编码了,为毛还需要编码转换?大家都统一一个编码不就可以了吗?

    不要问我为什么,我问你们个问题,如果世界上出了一种世界语言,你会放弃中文吗?去使用这个世界通用语言吗?这就是个坑,是个遗留问题。

    但是虽然以后可能世界语言会慢慢替代咱们常用的语言,大家以后沟通就使用世界语言就不会有沟通障碍了对吧。(就是举个例子)

    还有一个情况是什么呢?韩国的游戏到中国来之后,是乱码?结合上一个回答咱们可以猜出:编写这个游戏的人在编写游戏的时候可能根本就没有考虑出口其他国家。那如果没有这个Unicode编码的话,到咱们这里来显示肯定是乱码是吧。

    那就得需要通过转码把他们编码集,转换为Unicode(utf-8)编码集。这样他们就可以正常显示韩文了!(这里只是转编码集并不是翻译成中文不要弄混了~~!)

    Python3中的编码转换
    #在Python3中默认就是unicode编码
    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen

    tim = '华仔'
    #转为UTF-8编码
    print(tim.encode('UTF-8'))

    #转为GBK编码
    print(tim.encode('GBK'))

    #转为ASCII编码(报错为什么?因为ASCII码表中没有‘华仔’这个字符集~~)
    print(tim.encode('ASCII'))
    EncodeError.png

     
    二、Python2.X中的编码转换
    #因为在python2.X中默认是ASCII编码,你在文件中指定编码为UTF-8,但是UTF-8如果你想转GBK的话是不能直接转,需要Unicode做一个中间人转换角色。
    decode.png

    #!/usr/bin/env python2
    # _*_coding:utf-8_*_
    # Author: Lucky.chen

    import sys
    print(sys.getdefaultencoding())


    msg = "我爱北京天安门"
    msg_gb2312 = msg.decode("utf-8").encode("gb2312")
    gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")

    print(msg)
    print(msg_gb2312)
    print(gb2312_to_gbk)
    收起阅读 »

    高效DevOps的10项实践「翻译」

    采用这些DevOps实践可以实现高效协作,平滑运营,更整洁的代码等目标。 DevOps已经成为了我们行业最热门的流行语之一。然而出人意料的是,在更紧密的愿景和开发团队和运营团队更有效的协作之上,很少有共识DevOps到底意味着什么。不同组织对DevOps有着不...
    继续阅读 »

    采用这些DevOps实践可以实现高效协作,平滑运营,更整洁的代码等目标。


    DevOps已经成为了我们行业最热门的流行语之一。然而出人意料的是,在更紧密的愿景和开发团队和运营团队更有效的协作之上,很少有共识DevOps到底意味着什么。不同组织对DevOps有着不同的定义,其实DevOps有个新兴的最佳实践核心,其更进一步的目标是高度协作以生产更好的软件。在这里我考验了这些实践。但是坦白说,我并不只从开发人员角度来观察这些实践。


    我按优先级从高到低列出了这些实践条目,后面的实践往往依赖于前面的实践。


    实践1:利益相关者的积极参与

    DevOps的根本原则是开发人员,运营人员以及支持人员必须定期紧密的工作在一起。


    言外之意是他们必须互相视对方为重要的利益相关人,并积极争取一起工作。敏捷社区中一个普遍的实践是“现场客户”。


    这个实践出自于极限编程,它鼓励开发人员应该与业务人员紧密合作。规范的敏捷团队将该实践更进一步,即利益相关的积极参与,这意味着开发人员应该与所有利益相关者一起紧密工作,包括运营人员及支持人员,而不仅仅是业务人员。


    这是双向的:运营人员和支持人员也必须愿意和开发人员紧密工作。


    实践2:自动化测试

    敏捷软件开发人员被称为质量感染者,这是因为他们关注于编写高质量的代码,渴望测试越早开始越好。


    结果,自动化的回归测试是敏捷团队普遍采用的实践。该实践有时又被扩展为测试先行的方式,比如测试驱动开发(TDD),以及行为驱动开发(BDD)。


    由于敏捷团队经常一天多次运行他们的自动化测试集,并且能够马上修复发现的问题,所以他们比普通团队能达到更高的质量。对于运营人员而言,在同意一个解决方案发布到产品环境前,坚持足够的质量审查,这是件好事情。


    实践3:集成配置管理

    要实现以集成的方式来进行配置管理(CM),开发团队不仅要习惯于在解决方案层级应用CM,还需要考虑自身的解决方案与组织的其余基础设施之间的 产品环境配置问题。


    对于一些开发人员而言这是个不小的转变,因为他们往往习惯于只考虑当前他们工作的解决方案的CM。


    在DevOps环境中,开发人员需要拥有企业级视角,在更高的层次看待问题。他们的解决方案如何能在产品环境结合其它资源带来优势?其它资源是否能支持被开发的解决方案?


    言外之意是开发团队需要了解及管理他们产品的所有范围的依赖。集成配置管理也使得运营人员了解新的发布潜在的影响,从而更容易决定进行发布的时间。


    实践4:综合变更管理

    从IT的角度来看,变更管理是一门确保IT基础设施的演化能对整体组织的支持成功及有意义的艺术。但是对于项目-团队层级则颇具挑战。


    这是因为非常多的技术,甚至相似技术的多个版本会被使用在单个解决方案的开发过程中。


    由于DevOps引入了与运营有关的企业级问题,综合变更管理策略会变得越来越复杂,因为需要考虑大量的解决方案能够在产品环境中同时运行和交互。为了实现综合变更管理,开发团队必须与运营团队紧密合作,来从组织层面了解任何技术的改变带来的影响。


    该方式依赖于前面的实践-利益相关者的积极参与,集成配置管理及自动化测试。


    实践5:持续集成

    持续集成(CI)是构建及验证项目的规范,当有代码更新被迁入到版本控制系统时,会进行自动化的回归测试及代码分析。


    CI是与DevOps相关的性感的敏捷开发实践之一(至少从开发人员角度来说是如此)。


    CI确保开发人员以较小的,可以对代码缺陷立即反馈的常规步骤来开发一个高质量的可以工作的解决方案。


    实践6:集成部署计划

    从开发团队角度而言,部署计划总是需要与该组织的运营人员交互。有些情况下,与运营人员接口的专家被特称为发布工程师。经验丰富的团队将使开发,运营及支持团队这些利益相关者一起持续的制定部署计划。当你采用了DevOps策略,你会很快意识到需要一种跨团队的方式来完成发布计划,因为需要运营人员与整个开发团队一起工作。对于运营人员来说这不是什么新鲜事,但是对于只习惯工作于孤立环境的开发团队来说却很惊奇。如果你的团队还没有这样做,你需要开始从组织层面来考虑部署时间表。更远一步,为了支持持续部署,发布工程师需要增加发布次数,因为敏捷团队已经可以持续及一致地达到发布的质量要求。


    实践7:持续部署

    持续部署是持续集成实践的扩展。对于持续部署,当集成在一个沙盒中成功完成时,变更会被自动升迁到另一个沙盒中,集成会自动的在这里进行。自动升迁一直持续,直到有人验证了所有的变更,特别是开发向运营的过渡期。


    持续部署使得开发团队减少了新功能从被验证到部署到产品环境的时间,使得业务更具响应性。然而,持续部署增加了运营风险,因为如果开发团队没严格遵守规范,会增加缺陷被引入到产品环境的潜在风险。在企业级环境中成功的执行持续部署要求实现前面介绍的所有实践。


    实践8:产品支持

    企业级环境中,大多数的应用程序开发团队工作在已经存在于产品环境的解决方案的新的功能上。他们不仅工作于该新功能,还有解决严重的产品问题的职责。开发团队往往被称为产品的“第3级支持”,因为他们是解决棘手的产品问题的第三个(也是最后一个)团队。尽管做第三级产品支持的需要是普遍的,但是看板和规范敏捷交付(Disciplined Agile Delivery, DAD)则是例外,很多敏捷方法只解决传递这些影响。该实践的一个重要的副作用是给予了开发者发生在产品中的此类问题的鉴别能力,提供给他们一种学习机会,从而在设计解决方案时就考虑到相应的问题。


    实践9:应用监控

    正如其名称所示,这是一个运营实践,监控已经发布到产品的环境的正在运行的解决方案和应用程序。技术基础设施平台(比如操作系统),应用程序服务器,以及通讯服务通常提供监控功能,可以工作于一些监控工具(比如微软管理终端,IBM Tivoli 监控, 以及jManage)。然而,为了监控特定应用程序的功能,比如只给特定用户使用的用户界面,仪表化该信息需要与你组织的监控基础设施兼容,这需要构建到应用程序中。开发团队需要知道该运营要求,或者,更好的方式是可以访问一个框架,该框架可以直接提供相应的仪表化。


    实践10:自动化的仪表盘

    使用自动化仪表盘的实践是IT领域的商业智能(business intelligence, BI)。该实践分为两个方面,开发智能以及运营智能。开发智能需要使用开发工具来仪表化产生的指标。例如,你的配置管理(CM)工具已经记录了谁以及什么时候迁入代码。持续集成工具可能同样记录了构建发生的时间,运行了多少个测试,测试运行的时间,构建是成功还是失败,运行成功的测试数量等。这些原始数据会被分析并显示在一个自动化的仪表盘中。运营智能是之前讨论过的应用程序监控的一个方面。使用了自动化仪表盘,组织的整体指标开销将被显著降低(但是不能完全淘汰,因为不是所有的事情都能被自动化)。自动化仪表盘提供了实时的对组织的管理团队的洞察。


    DevOps与文化息息相关

    在讨论了这些苛刻的支持DevOps的实践之后,我需要强调主要的限制成功的因素是能否建立一个贯穿整个IT组织的相互协作的相互尊敬的文化。我的经验是,当决定采用高效的DevOps策略时,人及他们相互工作的方式是成功的主要决定因素。不幸的是,在组织中带来文化变迁比采用一些新的实践要难得多。



    原文地址:http://www.drdobbs.com/architecture-and-design/top-10-practices-for-effective-devops/240149363?pgno=1
    作者:Scott W. Ambler
    翻译:黄博文@无敌北瓜

    收起阅读 »