有赞.测试团队介绍 读后感

有赞.测试团队介绍 读后感

读完这篇文章给我最深的三点印象
第一是 测试,运维和开发在工作之中配合更紧密,这一点我们做的还不够,我们运维在工作很少涉及到跟其他团队之间合作,在以后的工作中也会更加注重这一点
第二点是 无论是测试还是运维都需要具备一定的编码能力,否则在工作中只能有心无力
第三点应用性能监控与发布系统相结合,项目发布完毕自动调用接口进行多节点检查,这一点也是我们要学习借鉴的,运维与测试配合对各个应用进行深层次的监控

ELK使用及详解

1.前言

通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的 syslog ,将所有服务器上的日志收集汇总。

集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep 、 awk 和 wc 等 Linux 命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

开源实时日志分析 ELK 平台能够完美的解决我们上述的问题, ELK 由ElasticSearch 、 Logstash 和 Kiabana 三个开源工具组成。官方网站:https://www.elastic.co/products

l   Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制, restful 风格接口,多数据源,自动搜索负载等。

l   Logstash 是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。

l   kibana 也是一个开源和免费的工具,他 Kibana 可以为 Logstash 和 ElasticSearch提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

工作原理如下如所示:

在需要收集日志的所有服务上部署 logstash ,作为 logstash agent ( logstash shipper )用于监控并过滤收集日志,将过滤后的内容发送到 logstash indexer ,logstash indexer 将日志收集在一起交给全文搜索服务 ElasticSearch ,可以用ElasticSearch 进行自定义搜索通过 Kibana 来结合自定义搜索进行页面展示。

2.kibana查询语法

我们kibana页面访问地址:elk.dev.aixuexi.com,下图是查询页面上常用的功能注释微信图片_20170912191526

 单项term查询

例: 搜independenceDay,student等(不建议这么查询慢,容易超时)

字段field查询

field:value   例:appname:Alen, host:beijing

通配符

? 匹配单个字符      例: H?bbs

* 匹配0到多个字符           例: H*

注意: ? * 不能用作第一个字符,例如: ?text    *text

范围查询

age:[20 TO 30]        age:{20 TO 30}

注:[ ] 表示端点数值包含在范围内,{ } 表示端点数值不包含在范围内

逻辑操作(建议使用查询快)

AND     OR       例子:firstname:H* AND age:20          firstname:H* OR age:20

+ :搜索结果中必须包含此项

– :不能含有此项

例: +firstname:H* -age:20 city:H*    firstname字段结果中必须存在H开头的,不能有年龄是20的,city字段H开头的可有可无

分组

(firstname:H* OR age:20) AND state:KS      先查询名字H开头年龄或者是20的结果,然后再与国家是KS的结合

字段分组

firstname:(+H* -He*)        搜索firstname字段里H开头的结果,并且排除firstname里He开头的结果

转义特殊字符

+ – && || ! () {} [] ^” ~ * ? : \

注意:以上字符当作值搜索的时候需要用 \ 转义(例如account-service搜索时加引号或者转义)

3.logstash配置

工作原理:
每个阶段都由很多的插件配合工作,比如file、elasticsearch、redis等等。
每个阶段也可以指定多种方式,比如输出既可以输出到elasticsearch中,也可以指定到stdout在控制台打印。
 
命令行中常用的命令
 
    -f:通过这个命令可以指定Logstash的配置文件,根据配置文件配置logstash
    -e:后面跟着字符串,该字符串可以被当做logstash的配置(如果是“” 则默认使用stdin作为输入,stdout作为输出)
    -l:日志输出的地址(默认就是stdout直接在控制台中输出)
    -t:测试配置文件是否正确,然后退出。
 
 
logstash基本上由三部分组成:
 
    input {…}
    filter {…}
    output {…}
 
在每个部分中,也可以指定多个访问方式,例如多个日志来源:
 
    input { 
     file { path =>”/var/log/messages” type =>”syslog”} 
     file { path =>”/var/log/apache/access.log” type =>”apache”} 
    }
  类似的,如果在filter中添加了多种处理规则,则按照它的顺序一一处理,但是有一些插件并不是线程安全的。
  比如在filter中指定了两个一样的的插件,这两个任务并不能保证准确的按顺序执行,因此官方也推荐避免在filter中重复使用插件。
 
例子:
 
    input {
        file {
         #指定监听的文件路径,注意必须是绝对路径
            path => “E:/software/logstash-1.5.4/logstash-1.5.4/data/test.log”
            start_position => beginning
        }
    }
    filter {
        
    }
    output {
        stdout {}
    }
日志大致如下:
 
    hello,this is first line in test.log!
    hello,my name is xingoo!
    goodbye.this is last line in test.log!
 
我们的配置文件
input {
        file {
                #start_position => beginning
                #add_field => {“project_name” => “battleship”}
                #tags => “tag1”
                path => [“/data/var/log/application/*/*/*.log”]
        }
}
filter {
        grok {
                patterns_dir => [“/usr/local/logstash-2.3.4/patterns”]
                match => { “message” => “%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:level}”
                        }
             }
        grok {
                match => {
                        “path” => “/data/var/log\/application/%{USER:appname}/”
                        }
             }
}
output {
        elasticsearch{
         hosts => [“10.44.202.185:9200″,”10.28.51.196:9200″,”10.28.51.196:9200”]
     }
     stdout { codec => rubydebug }
        }
4.elasticsearch增删改查详解
刚接触的童鞋经常搞不明白ES的各个概念的含义。尤其对“索引”二字更是与关系型数据库混淆的不行。本文通过对比关系型数据库,将ES中常见的增、删、改、查操作进行图文呈现。能加深你对ES的理解。同时,也列举了kibana下的图形化展示。

ES Restful API GET、POST、PUT、DELETE、HEAD含义:
1)GET:获取请求对象的当前状态。
2)POST:改变对象的当前状态。
3)PUT:创建一个对象。
4)DELETE:销毁对象。
5)HEAD:请求获取对象的基础信息。

MySQL与Elasticsearch核心概念对比示意图
这里写图片描述
以上表为依据,
ES中的新建文档(在Index/type下)相当于mysql中(在某Database的Table)下插入一行数据。

1、新建文档(类似mysql insert插入操作)

http://localhost:9200/blog/ariticle/1 put
{
"title":"New version of Elasticsearch released!",
"content":"Version 1.0 released today!",
"tags":["announce","elasticsearch","release"]
}

创建成功如下显示:

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "1 -d",
- "_version": 1,
- "_shards": {
    - "total": 2,
    - "successful": 1,
    - "failed": 0
- },
- "created": true

}

这里写图片描述

2、检索文档(类似mysql search 搜索select*操作)

检索结果如下:

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "1",
- "_version": 1,
- "found": true,
- "_source": {
    - "title": "New version of Elasticsearch released!",
    - "content": "Version 1.0 released today!",
    - "tags": [
        - "announce"
        - ,
        - "elasticsearch"
        - ,
        - "release"
    - ]
- }

}

如果未找到会提示:

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "11",
- "found": false

}

查询全部文档如下:
这里写图片描述
具体某个细节内容检索,
查询举例1:查询cotent列包含版本为1.0的信息。
http://localhost:9200/blog/
_search?pretty&q=content:1.0

{

- "took": 2,
- "timed_out": false,
- "_shards": {
    - "total": 5,
    - "successful": 5,
    - "failed": 0
- },
- "hits": {
    - "total": 1,
    - "max_score": 0.8784157,
    - "hits": [
        - {
            - "_index": "blog",
            - "_type": "ariticle",
            - "_id": "6",
            - "_score": 0.8784157,
            - "_source": {
                - "title": "deep Elasticsearch!",
                - "content": "Version 1.0!",
                - "tags": [
                    - "deep"
                    - ,
                    - "elasticsearch"
                - ]
            - }
        - }
    - ]
- }

}

查询举例2:查询书名title中包含“enhance”字段的数据信息:
[root@5b9dbaaa1a ~]# curl -XGET 10.200.1.121:9200/blog/ariticle/_search?pretty -d ‘

> { "query" : {
> "term" :
> {"title" : "enhance" }
> }
> }'
{
  "took" : 189,
  "timed_out" : false,
  "_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
  },
  "hits" : {
  "total" : 2,
  "max_score" : 0.8784157,
  "hits" : [ {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "4",
  "_score" : 0.8784157,
  "_source" : {
  "title" : "enhance Elasticsearch!",
  "content" : "Version 4.0!",
  "tags" : [ "enhance", "elasticsearch" ]
  }
  }, {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "5",
  "_score" : 0.15342641,
  "_source" : {
  "title" : "enhance Elasticsearch for university!",
  "content" : "Version 5.0!",
  "tags" : [ "enhance", "elasticsearch" ]
  }
  } ]
  }
}

查询举例3:查询ID值为3,5,7的数据信息:
[root@5b9dbaaa148a ~]# curl -XGET 10.200.1.121:9200/blog/ariticle/_search?pretty -d ‘

{ "query" : {
"terms" :
{"_id" : [ "3", "5", "7" ] }
}
}'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
  },
  "hits" : {
  "total" : 3,
  "max_score" : 0.19245009,
  "hits" : [ {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "5",
  "_score" : 0.19245009,
  "_source" : {
  "title" : "enhance Elasticsearch for university!",
  "content" : "Version 5.0!",
  "tags" : [ "enhance", "elasticsearch" ]
  }
  }, {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "7",
  "_score" : 0.19245009,
  "_source" : {
  "title" : "deep Elasticsearch for university!",
  "content" : "Version 2.0!",
  "tags" : [ "deep", "elasticsearch", "university" ]
  }
  }, {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "3",
  "_score" : 0.19245009,
  "_source" : {
  "title" : "init Elasticsearch for university!",
  "content" : "Version 3.0!",
  "tags" : [ "initialize", "elasticsearch" ]
  }
  } ]
  }
}

3、更新文档(类似mysql update操作)

http://localhost:9200/blog/ariticle/1/_update/ POST
{“script”:”ctx._source.content = \”new version 2.0 20160714\”“}

更新后结果显示:
{

  • “_index”: “blog”,
  • “_type”: “ariticle”,
  • “_id”: “1”,
  • “_version”: 2,
  • “_shards”: {
    • ”total”: 2,
    • “successful”: 1,
    • “failed”: 0
  • }

}

查询&验证更新后结果:(对比可知,版本号已经更新完毕)
http://localhost:9200/blog/ariticle/1/

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "1",
- "_version": 2,
- "found": true,
- "_source": {
    - "title": "New version of Elasticsearch released!",
    - "content": "new version 2.0 20160714",
    - "tags": [
        - "announce"
        - ,
        - "elasticsearch"
        - ,
        - "release"
    - ]
- }

}
`![这里写图片描述](http://img.blog.csdn.net/20160717132407353)``

注意更新文档需要在elasticsearch_win\config\elasticsearch.yml下新增以下内容:

script.groovy.sandbox.enabled: true
script.engine.groovy.inline.search: on
script.engine.groovy.inline.update: on
script.inline: on
script.indexed: on
script.engine.groovy.inline.aggs: on
index.mapper.dynamic: true

4、删除文档(类似mysql delete操作

http://localhost:9200/blog/ariticle/8/回结果

{

- "found": true,
- "_index": "blog",
- "_type": "ariticle",
- "_id": "8",
- "_version": 2,
- "_shards": {
    - "total": 2,
    - "successful": 1,
    - "failed": 0
- }

}

这里写图片描述

 

向七牛上传zip包

# -*- coding: utf-8 -*-
# flake8: noqa
from qiniu import Auth
from qiniu import BucketManager
import mysql.connector
sumr = 0
count = 0
real_count = 0
access_key = ‘WR5JtPxdsdYOgladSBDXZl3idmqjBzqkX5E-UDfG’
secret_key = ‘QOsocxMR2BN9eNZek3gjKeP2j_KznEl-H0JOg5g9’
# 初始化Auth状态
q = Auth(access_key, secret_key)
# 初始化BucketManager
bucket = BucketManager(q)
# 你要测试的空间, 并且这个key在你空间中存在
bucket_name = ‘axx-homework’

conn = mysql.connector.connect(user=’aixuexidball’, password=’aixuexi_2016dball’,host=’rm-2zefci7s9f4bpy9gt.mysql.rds.aliyuncs.com’, database=’managesystemv1.0′)
cursor = conn.cursor()
cursor.execute(
“SELECT correct_result FROM c_student_homework_answer_record WHERE correct_result LIKE ‘%http://image1.aixuexi.com%'”)

values = cursor.fetchall()
cursor.close()
conn.close()
values_set = set()
for value in values:
count+=1
values_set.add(value)

for value in values_set:
real_value = value[0].split(‘/’)[-1]
real_count+=1
# print(real_value)
# real_value = value[0].replace(‘http://image1.aixuexi.com/’, ”)
try:
ret, info = bucket.stat(bucket_name, real_value)
if info.status_code == 612:
sumr+=1
print(real_value)
f=open(‘goods.txt’, ‘a’)
f.write(str(real_value+’\n’))
f.close()
except BaseException as e:
print(“111”)
continue
f=open(‘goods.txt’, ‘a’)
f.write(“共计:”+str(count)+’\n’+”真实共计:”+str(real_count)+’\n’+”不存在共计:”+str(sumr))
f.close()
print(“共计:”+str(count))
print(“真实共计:”+str(real_count))
print(“不存在共计:”+str(sumr))

七牛课件重命名

# -*- coding: utf-8 -*-
# flake8: noqa
from qiniu import Auth
from qiniu import BucketManager
import mysql.connector
import time
localtime = time.asctime(time.localtime(time.time()))
current_date = time.strftime(‘%Y-%m-%d’,time.localtime(time.time()))
access_key = ‘WR5JtPxdsdYOgladSBDXZl3idmqjBzqkX5E-UDfG’
secret_key = ‘QOsocxMR2BN9eNZek3gjKeP2j_KznEl-H0JOg5g9’
# 初始化Auth状态
q = Auth(access_key, secret_key)
# 初始化BucketManager
bucket = BucketManager(q)
# 你要测试的空间, 并且这个key在你空间中存在
bucket_name = ‘axx-courseware’

conn = mysql.connector.connect(user=’aixuexidball’, password=’aixuexi_2016dball’,host=’rm-2zefci7s9f4bpy9gt.mysql.rds.aliyuncs.com’, database=’managesystemv1.0′)
cursor = conn.cursor()
cursor.execute(“select DISTINCT(filePath) from coursenote where createTime like ‘” + current_date + “%’ and filePath like ‘kjqn%’;”)

values = cursor.fetchall()
cursor.close()
conn.close()
#print(values)
for val in values:
for real_val in val:
html5_val = real_val.decode()+’/html5.html’
index_val = real_val.decode()+’/index.html’
flash_val = real_val.decode()+’/flash.html’
ret, html5_info = bucket.stat(bucket_name, html5_val)
ret, index_info = bucket.stat(bucket_name, index_val)
ret, flash_info = bucket.stat(bucket_name, flash_val)

if html5_info.status_code != 200 and index_info.status_code == 200 and flash_info.status_code == 200:
ret, info = bucket.move(bucket_name, index_val, bucket_name, html5_val)
if info.status_code == 200:
f=open(‘rename_kejian.log’, ‘a’)
f.write(localtime+” rename:”+str(index_val)+”–>”+str(html5_val)+’\n’)
f.close()
else:
f=open(‘rename_kejian.log’, ‘a’)
f.write(localtime+” faild:”+str(index_val)+”–>”+str(html5_val)+’\n’)
f.write(localtime+” error:”+info+’\n’)
f.close()

ret, info = bucket.move(bucket_name, flash_val, bucket_name, index_val)
if info.status_code == 200:
f=open(‘rename_kejian.log’, ‘a’)
f.write(localtime+” rename:”+str(flash_val)+”–>”+str(index_val)+’\n’)
f.close()
else:
f=open(‘rename_kejian.log’, ‘a’)
f.write(localtime+” faild:”+str(flash_val)+”–>”+str(index_val)+’\n’)
f.write(localtime+” error:”+info+’\n’)
f.close()
elif html5_info.status_code != 200 and index_info.status_code != 200 and flash_info.status_code != 200:
f=open(‘rename_kejian.log’, ‘a’)
f.write(localtime+” lose:”+html5_val+”&”+index_val+”&”+flash_val+’\n’)
f.close()
elif html5_info.status_code != 200 and index_info.status_code == 200 and flash_info.status_code != 200:
f=open(‘rename_kejian.log’, ‘a’)
f.write(localtime+” lose:”+html5_val+”&”+flash_val+’\n’)
f.close()
elif html5_info.status_code != 200 and index_info.status_code != 200 and flash_info.status_code == 200:
f=open(‘rename_kejian.log’, ‘a’)
f.write(localtime+” lose:”+html5_val+”&”+index_val+’\n’)
f.close()

iptables规则

iptables包括配置iptables三个链条的默认规则、添加iptables规则、修改规则、删除规则等。
一、查看规则集
iptables –list -n // 加一个-n以数字形式显示IP和端口,看起来更舒服
二、配置默认规则
iptables -P INPUT DROP // 不允许进
iptables -P FORWARD DROP // 不允许转发
iptables -P OUTPUT ACCEPT // 允许出
三、增加规则
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
//允许源IP地址为192.168.0.0/24网段的包流进(包括所有的协议,这里也可以指定单个IP)
iptables -A INPUT -d 192.168.0.22 -j ACCEPT
//允许所有的IP到192.168.0.22的访问
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
//开放本机80端口
iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT
//开放本机的ICMP协议
四、删除规则
iptables -D INPUT -s 192.168.0.21 -j ACCEPT
//删除刚才建立的第一条规则
五、规则的保存
iptables -F
//清空规则缓冲区(这个操作会将上面的增加操作全部清空,若须保留建议先执行一下句:保存)
service iptables save
//将规则保存在/etc/sysconfig/iptables文件里
service iptables restart
//重启Iptables服务
最后说明一下,iptables防火墙的配置文件存放于:/etc/sysconfig/iptables

tomcat重启脚本

#!/bin/bash
RED=’\E[1;31m’
GRN=’\E[1;32m’
RES=’\E[0m’
tomcat_name=”tomcat-guanli”
tomcat_log=”/project/opt/${tomcat_name}/logs/catalina.out”
tomcat_start=”/project/opt/${tomcat_name}/bin/startup.sh”
tomcat_pid=`ps aux | grep ${tomcat_name} | grep -v grep | awk ‘{print $2}’`
if [ ! ${tomcat_pid} ];then
echo -e “${RED}tomcat not start…${RES}”
echo -e “${RED}please start tomcat…${RES}”
echo -e “${GRN}start ${tomcat_name}now…${RES}”
sleep 1
sh $tomcat_start ; tail -f $tomcat_log
else
echo -e “${GRN}tomcat pid is ${tomcat_pid} ${RES}”
echo -e “${RED}kill ${tomcat_name}…${RES}”
kill -9 $tomcat_pid
sleep 1
echo -e “${GRN}start ${tomcat_name}…${RES}”
sh $tomcat_start ;tail -f $tomcat_log
fi

mysql5.6自动化安装脚本

大家在使用的时候需要根据实际情况来调整路径变量

#!/bin/bash

#制作人:张阳
#时间:2016/2/25 14:25

#定义颜色变量
RED_COLOR=’\E[1;31m’ #红
GREEN_COLOR=’\E[1;32m’ #绿
YELOW_COLOR=’\E[1;33m’ #黄
BLUE_COLOR=’\E[1;34m’ #蓝
PINK=’\E[1;35m’ #粉红
RES=’\E[0m’

#定义脚本内部变量
SOFT_DIR=/soft
MYSQL_NAME=”mysql-5.6.29.tar.gz”
USER=`cat /etc/passwd | grep ^mysql | wc -l`
MYSQL_INSTALL_DIR=/usr/local/mysql
MY_CNF=`ls /etc/my.cnf |wc -l`
SRC=”/usr/src”

check_environment(){
yum install make gcc-c++ cmake bison-devel ncurses-devel -y

}

check_install(){
if [ -d $SOFT_DIR ];then
cd $SOFT_DIR
if [ -f $MYSQL_NAME ];then
tar xf $MYSQL_NAME -C $SRC
cd $SRC/mysql-5.6.29
cmake \
-DCMAKE_INSTALL_PREFIX=$MYSQL_INSTALL_DIR \
-DMYSQL_DATADIR=$MYSQL_INSTALL_DIR/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
if [ $? -eq 0 ];then
make
if [ $? -eq 0 ];then
make install
if [ $? -eq 0 ];then
echo -e “$GREEN_COLOR 软件已安装完成 $RES”

else
echo -e “$RED_COLOR make install error $RES”
exit 1
fi
else
echo -e “$RED_COLOR make error $RES”
exit 1
fi
else
echo -e “$RED_COLOR configure error $RES”
exit 1
fi
else
echo -e “$RED_COLOR 没有文件,请检查文件或文件名是否正确 $RES”
exit 1
fi
else
echo -e “$RED_COLOR 没有目录 $RES”
exit 1
fi
}

check_user(){
if [ $USER -eq 1 ];then
useradd -g mysql -s /sbin/nologin mysql
else
groupadd mysql
useradd -g mysql -s /sbin/nologin mysql
fi
}

check_perm(){
chown -R mysql.mysql $MYSQL_INSTALL_DIR
}

mysql_configure(){
cd $MYSQL_INSTALL_DIR
scripts/mysql_install_db –basedir=$MYSQL_INSTALL_DIR –datadir=$MYSQL_INSTALL_DIR/data –user=mysql
}

mysql_init(){
cp $MYSQL_INSTALL_DIR/support-files/mysql.server /etc/init.d/mysql
if [ $MY_CNF -eq 0 ];then
cp $MYSQL_INSTALL_DIR/my.cnf /etc/my.cnf
else
rm -rf /etc/my.cnf
cp $MYSQL_INSTALL_DIR/my.cnf /etc/my.cnf
fi
chkconfig mysql on
/etc/init.d/mysql start
if [ $? -eq 0 ];then
echo -e “$GREEN_COLOR mysql安装完成 $RES”
else
echo -e “$RED_COLOR mysql 安装失败,请检查原因 $RES”
fi
}

check_path(){
cat >>/etc/profile <<EOF
export PATH=/usr/local/mysql/bin:$PATH
export PATH=/usr/local/mysql/sbin:$PATH
EOF
sleep 1
source /etc/profile
}

main(){
check_environment
check_install
check_user
check_perm
mysql_configure
mysql_init
check_path
}

echo -ne “$GREEN_COLOR 在安装之前确认是否有${SOFT_DIR}这个目录,是否开始安装:Y/N $RES”

read A

case $A in
Y)
main;;
N)
echo -e “$RED_COLOR 退出安装 $RES”
break;;
*)
echo -e “$RED_COLOR 非法输入,请输入大写的Y/N $RES”
break
esac

读<京东PE谈如何颠覆应用运维认知>读后感

看完此文章的第一感觉首先是感觉眼界得到了开阔,了解到的作为一个运维现在以及以后的一个发展方向,以及运维这个职业的成长史(传统运维,自动化运维,智能运维),还让我明白了,运维不只是把技术做好了就行,我们需要做的东西还很多,我们需要学习的东西也很多。

再来回想,首先是我刚入职公司的时候,那会儿就是一个典型的人肉运维,手动的发布代码,被动的解决问题,每次上线都伴随的很大的风险,没有一些流程化的规则,监控没有一套合理的环境,监控规则没有标准化,而且没有app的监控,只有机器的硬件信息监控…

再说现在,我们现在正处于一种高速发展的阶段,而我们的运维小组也在尽快的成长,而且我们现在也有了目标,第一就是我们的自动化平台(ansible),虽然说我们现在的自动化还很薄弱,但是我们会坚定不移的一步步的把我们的自动化做好。第二就是我们的监控,我们现在有了cat,我们的zabbix也在熟悉了解中,而且还有阿里的监控,能做到及时的报警。对于我来说,这是一个机遇,也是一个挑战自我的机会。

最后说一下看了这边文章的自我检讨:

  • 我们的自动化还处于很薄弱的状态,现在我们只是以快速上线为目的进行部署
  • 我们的监控也很薄弱,我们需要监控的东西也是很多的,而我们现在基础的监控都不全
    1. 基础的监控
    2. 应用性能监控
  • 我们是接受故障了,但是没有好好的总结过故障,以及更深入的研究。
  • 我们的风险控制意识不足。

谈运维认知读后感

读完京东高级PE王超的应用运维认知,觉得京东对自动化运维的理解与实施很值得我们学习。他们的团队从几个人到20几个人,从传统运维到自动化到智能运维,从开发和运维的矛盾点到一个标准实时的流程。这就是我们想要的! 目前我们虽然我们虽然还在初阶段,但我们有了明确的目标,还有这些大神们的经验,我们要快速学习应用到爱学习当中。 困难还是有的,老项目的复杂凌乱,项目的繁琐众多,但是看到力勇说的一个字:干!我也精神振奋! 我们先定个小目标:做好项目发布自动化。加快速度与业务连续性,降低风险提高安全。让爱学习更好很快更强!