09/30/18

BASH 脚本构建LNMP测试环境

deploy-one-script 构建dev、test、prod环境

github:https://github.com/chen-123/deploy-one-script

经常遇到开发环境构建需求,所以通过脚本构建基于Centos7.4 + Docker + Docker-compose的开发环境,该脚本采用bash编写。

目前,脚本在centos7.4、centos7.5下测试通过,脚本默认安装docker-17.06.2.ce,docker-compose-1.22.0,etcd-v3.3.5,kubernetes-1.10.8 。

本脚本安装所有资源打包上传到【百度网盘】(链接: https://pan.baidu.com/s/1-E1_9AYh41_487ZHP5yC2Q 提取码: n6ju),资源可以自己根据需求更换。

说明:

  • 通过deploy_lnmp_docker_dev.sh脚本,部署LNMP开发环境,支持本机部署、远程部署。(Centos 7下已经测试可以,Ubuntu、MacOS部署功能后续版本更新)
  • 本地部署模式下,在脚本当前目录的pkg/docker-compose/yaml下,子目录conf是nginx、php、mysql配置,子目录mysql是mysql数据库的数据目录,子目录php是不同版本dockerfile资源,子目录www是php项目代码。
  • 项目代码更新方式:1、登陆开发机器或者docker容器,直接修改

    2、代码提交到gitlab版本库,通过gitlab配置runner或者通过jenkins更新代码

    3、开发机器通过ansible或者lsyncd同步php代码

  • 通过deploy_lnmp_k8s_test_prod.sh脚本,部署基于LNMP架构的线上业务,包括etcd集群部署、k8s集群的部署、k8s系统组件(calico、kube-apiserver、kube-controller-manager、kube-proxy、nginx-ingrss、coredns、jenkins、elk、monitoring)部署等。(部分完成、后续版本添加完善)

LNMP开发环境部署 – deploy_lnmp_docker_dev.sh

一、基本思路

1、通过deploy_lnmp_docker_dev.sh提供统一部署入口,主要包括docker、docker-compose等安装、配置、部署、下线

2、通过common.sh进行环境变量统一维护,系统优化,预安装软件包,公共函数定义等,通过source方式引用

3、通过docker.sh提供本地化docker、docker-compose安装、配置、卸载操作

4、相关代码统一存放在当前目录下pkg/run/v1.0(版本号)下,然后将该目录打包run-v1.0.tar.gz (tar cvf run-v1.0.tar.gz pkg/run/v1.0)

5、通过deploy_lnmp_docker_dev.sh上传run-v1.0.tar.gz到目标服务器,执行相关脚本

二、运行脚本部署

1、远程部署方式(脚本自动将run-v1.0.tar.gz,上传到目标服务器/root下,然后ssh远程执行脚本)

a、批量部署192.168.1.113,192.168.1.114,192.168.1.112三台测试服务器的LNMP开发环境

bash deploy_lnmp_docker_dev.sh –role deploy-lnmp-dev –hosts 192.168.1.113,192.168.1.114,192.168.1.112

b、批量下线192.168.1.113,192.168.1.114,192.168.1.112三台测试服务器的LNMP开发环境下的docker、docker-compose

bash deploy_lnmp_docker_dev.sh –role destroy-lnmp-dev –hosts 192.168.1.113,192.168.1.114,192.168.1.112

c、批量清除安装脚本遗留的文件包

bash deploy_lnmp_docker_dev.sh –role clean-cache –hosts 192.168.1.113,192.168.1.114,192.168.1.112

2、本地部署方式

a、本机安装docker、docker-compose

bash deploy_lnmp_docker_dev.sh –role install-lnmp-dev

b、本机卸载

bash deploy_lnmp_docker_dev.sh –role purge-lnmp-dev

LNMP线上测试和生产环境部署 – deploy_lnmp_k8s_test_prod.sh

一、基本思路

1、通过deploy_lnmp_k8s_test_prod.sh提高统一部署入口,主要包括etcd集群、docker、kubulet、kubectl等安装、配置、部署、下线

2、通过common.sh进行环境变量统一维护,系统优化,预安装软件包,公共函数定义等,通过source方式引用

3、通过kubernetes.sh提供本地化docker、kubelet、kubectl等安装、配置、卸载操作,k8s的yaml组件部署

4、相关代码统一存放在当前目录下pkg/run/v1.0(版本号)下,然后将该目录打包run-v1.0.tar.gz (tar cvf run-v1.0.tar.gz pkg/run/v1.0)

5、通过deploy_lnmp_k8s_test_prod.sh上传run-v1.0.tar.gz到目标服务器,执行相关脚本

6、docker、k8s等安装资源包,提高两种方式同步到目标服务器,一种是从资源服务器下载,另一种是通过rsync同步当前目录下相关资源到目标服务器

二、运行脚本

1、部署etcd集群,在192.168.1.113,192.168.1.114,192.168.1.112三台服务器上部署etcd程序,并组成etcd集群(目前非安全模式测试可用,ssl安全模式继续测试之后,后续版本更新)

bash deploy_lnmp_k8s_test_prod.sh –role deploy-etcd –etcd-hosts 192.168.1.113,192.168.1.114,192.168.1.112

2、etcd集群下架

bash deploy_lnmp_k8s_test_prod.sh –role destroy-etcd –etcd-hosts 192.168.1.113,192.168.1.114,192.168.1.112

3、docker、kubelet、kubectl安装配置

bash deploy_lnmp_k8s_test_prod.sh –role deploy-k8s-nodes –hosts 192.168.1.113,192.168.1.114,192.168.1.112 –etcd-hosts 192.168.1.113,192.168.1.114,192.168.1.112

4、docker、kubelet、kubectl下线

bash deploy_lnmp_k8s_test_prod.sh –role destory-k8s-nodes –hosts 192.168.1.113,192.168.1.114,192.168.1.112 –etcd-hosts 192.168.1.113,192.168.1.114,192.168.1.112

LNMP运用环境说明

一、LNMP特点说明

1、支持多版本PHP环境,包括php5.4、php5.6、php7.2三个,其它版本根据需求定制,php-fpm运用在9000端口

2、支持绑定多域名,通过修改nginx、php-fpm配置,重启服务

3、代码、数据库文件、配置文件、日志等都持久化保持在主机服务器

4、支持https和http/2业务类型,支持php扩展安装,composer更新

5、一次配置,**Windows、Linux、MacOS都支持

6、LNMP开放80、443、8080、8081端口,绑定到主机服务器端口

二、LNMP结构

目录说明

.
├── conf					配置目录
│   ├── common_server.conf			公共安全nginx配置文件
│   ├── conf.d					站点配置目录
│   │   ├── certs				站点证书目录
│   │   │   └── www.phpdba.com			www.phpdba.com 证书目录
│   │   │       ├── gencert.sh			证书生存脚本
│   │   │       ├── www.phpdba.com.crt
│   │   │       ├── www.phpdba.com.csr
│   │   │       ├── www.phpdba.com.key
│   │   │       └── www.phpdba.com.origin.key
│   │   ├── www.chen-123.com.conf		www.chen-123.com Nginx配置文件
│   │   └── www.phpdba.com.conf			www.phpdba.com Nginx配置文件
│   ├── mysql.cnf				mysql 配置文件
│   ├── nginx.conf				nginx 主配置文件
│   ├── php-fpm.conf				php-fpm 配置文件
│   └── php.ini					php.ini 配置文件
├── docker-compose54.yml			php5.4 docker-compose 容器启动配置文件
├── docker-compose56.yml			php5.6 docker-compose 容器启动配置文件
├── docker-compose.yml				php7.2 docker-compose 容器启动配置文件
├── log						nginx 日志目录
│   ├── nginx.error.log
│   └── nginx_www_phpdba_com_error.log
├── mysql					mysql 数据目录
├── php						php 镜像需求dockerfile文件
│   ├── php54
│   │   ├── Dockerfile
│   ├── php56
│   │   ├── Dockerfile
│   └── php72
│       ├── Dockerfile
└── www						站点代码目录
    ├── www.chen-123.com			www.chen-123.com 代码资源目录
    │   └── index.php
    └── www.phpdba.com				www.phpdba.com 代码资源目录
        └── index.php

结构示意图:

Demo Image

快速使用

部署

1、本地安装git

[root@promote deploy-one-script]# yum install -y git

2、clone 项目

[root@promote ~]# git clone https://github.com/chen-123/deploy-one-script.git
正克隆到 'deploy-one-script'...
remote: Counting objects: 610, done.
remote: Compressing objects: 100% (465/465), done.
remote: Total 610 (delta 128), reused 610 (delta 128), pack-reused 0
接收对象中: 100% (610/610), 1.49 MiB | 240.00 KiB/s, done.
处理 delta 中: 100% (128/128), done.
[root@promote ~]# cd deploy-one-script/
[root@promote deploy-one-script]# mkdir pkg/run/v1.0 -p
[root@promote deploy-one-script]# cp *.sh pkg/run/v1.0/
[root@promote deploy-one-script]# ls
common.sh                  deploy_lnmp_k8s_test_prod.sh  etcd.sh  kubernetes.sh  README.md
deploy_lnmp_docker_dev.sh  docker.sh                     img      pkg            upgrade.sh
[root@chen-123 deploy-one-script]# tar cvf run-v1.0.tar.gz pkg/run/v1.0/
pkg/run/v1.0/
pkg/run/v1.0/kubernetes.sh
pkg/run/v1.0/upgrade.sh
pkg/run/v1.0/etcd.sh
pkg/run/v1.0/docker.sh
pkg/run/v1.0/deploy_lnmp_docker_dev.sh
pkg/run/v1.0/deploy_lnmp_k8s_test_prod.sh
pkg/run/v1.0/common.sh
[root@chen-123 deploy-one-script]# vim pkg/ansible/playbook/ansible_host.txt //修改ansible的hosts信息配置
[root@chen-123 deploy-one-script]# tar cvf ansible_playbook.tar.gz pkg/ansible/playbook/
a pkg/ansible/playbook
a pkg/ansible/playbook/file
a pkg/ansible/playbook/playbook.yml
a pkg/ansible/playbook/ansible_host.txt
a pkg/ansible/playbook/file/hosts.allow.j2
a pkg/ansible/playbook/file/authorized_keys.j2
a pkg/ansible/playbook/file/ssh_config.j2
a pkg/ansible/playbook/file/group.j2
a pkg/ansible/playbook/file/passwd.j2
a pkg/ansible/playbook/file/id_rsa.j2
a pkg/ansible/playbook/file/docker_config.json.j2
a pkg/ansible/playbook/file/hosts.j2
a pkg/ansible/playbook/file/hosts.deny.j2

3、启动

[root@promote deploy-one-script]# bash deploy_lnmp_docker_dev.sh --role deploy-lnmp-dev --hosts 192.168.1.118
...
192.168.1.118 docker install ok!
192.168.1.118 docker-compose install ok!

4、在浏览器访问

[root@client ~]#grep 'www.chen-123.com' /etc/hosts || echo "192.168.1.118 www.chen-123.com" >> /etc/hosts

IP访问

118 80 118 8080 118 8081

域名访问

chen-123 80 chen-123 8080 chen-123 8081

5、代码修改查看效果

[root@promote www]# cd /root/pkg/docker-compose/yaml/www
[root@promote www]# ls
www.chen-123.com  www.phpdba.com
[root@promote www]# cd www.chen-123.com/
[root@promote www.chen-123.com]# ls
index.php
[root@promote www.chen-123.com]# vim chen-123.php
[root@promote www.chen-123.com]# cat chen-123.php 
<?php
echo "hi,chen-123!";
?>
[root@promote www.chen-123.com]#

chen-123 add php

切换PHP版本

默认情况下,我们同时创建 PHP5.4、PHP5.6和PHP7.2 三个PHP版本的容器,

切换PHP仅需修改 Nginx 的fastcgi_pass选项,

例如,示例的localhost用的是PHP5.4,Nginx 配置:

fastcgi_pass   php54:9000;

要改用PHP7.2,修改为:

fastcgi_pass   php72:9000;

HTTPS 和 HTTP/2

1、修改hosts

[root@client ~]#grep 'www.chen-123.com' /etc/hosts || echo "192.168.1.118 www.chen-123.com" >> /etc/hosts

Linux和Mac的hosts文件位置: /etc/hosts

Windows的hosts文件位置: C:\Windows\System32\drivers\etc\hosts

然后通过浏览器这两个地址就能看到效果,其中:

www.chen-123.com和192.168.1.118是同一个站点,是经典的http站,

www.phpdba.com是自定义证书的https站点,浏览器会有安全提示,忽略提示访问即可。

日志

Log文件生成的位置依赖于conf下各log配置的值。

1、 Nginx日志

Nginx日志是我们用得最多的日志,所以我们单独放在根目录log下。

log会目录映射Nginx容器的/var/log/dnmp目录,所以在Nginx配置文件中,需要输出log的位置,我们需要配置到/var/log/dnmp目录,如:

error_log  /var/log/dnmp/nginx.site1.error.log  warn;

2、PHP-FPM日志 大部分情况下,PHP-FPM的日志都会输出到Nginx的日志中,所以不需要额外配置。

如果确实需要,可按一下步骤开启。

在主机中创建日志文件并修改权限:

$ touch log/php-fpm.error.log
$ chmod a+w log/php-fpm.error.log

主机上打开并修改PHP-FPM的配置文件conf/php-fpm.conf,找到如下一行,删除注释,并改值为:

php_admin_value[error_log] = /var/log/dnmp/php-fpm.error.log

重启PHP-FPM容器。

3、 MySQL日志 因为MySQL容器中的MySQL使用的是mysql用户启动,它无法自行在/var/log下的增加日志文件。所以,我们把MySQL的日志放在与data一样的目录,即项目的mysql目录下,对应容器中的/var/lib/mysql/目录。

slow-query-log-file     = /var/lib/mysql/mysql.slow.log
log-error               = /var/lib/mysql/mysql.error.log

以上是mysql.conf中的日志文件的配置。

使用composer

lnmp默认已经在容器中安装了composer,使用时先进入容器:

$ docker exec -it yaml_php_1 /bin/bash

然后进入相应目录,使用composer:

# cd /var/www/html/www.chen-123.com
# composer update

因为composer依赖于PHP,所以,是必须在容器里面操作composer的。

phpmyadmin和phpredisadmin

本项目默认在docker-compose.yml中开启了用于MySQL在线管理的phpMyAdmin,以及用于redis在线管理的phpRedisAdmin,可以根据需要修改或删除。

1、 phpMyAdmin

phpMyAdmin容器映射到主机的端口地址是:8080,所以主机上访问phpMyAdmin的地址是:

http://www.chen-123.com:8080 或者 http://192.168.1.118:8080

MySQL连接信息:

host:(本项目的MySQL容器网络) port:3306 username:root(手动在phpmyadmin界面输入) password:123456 (手动在phpmyadmin界面输入)

2、 phpRedisAdmin

phpRedisAdmin容器映射到主机的端口地址是:8081,所以主机上访问phpMyAdmin的地址是:

http://www.chen-123.com:8081 或者 http://192.168.1.118:8080

Redis连接信息如下:

host: (本项目的Redis容器网络) port: 6379

在正式环境中安全使用

要在正式环境中使用,请:

在php.ini中关闭XDebug调试

增强MySQL数据库访问的安全策略

增强redis访问的安全策略

问题和规划

1、代码实时更新脚本未完成,k8s部署脚本为完成

2、ansible 的hosts配置目前需要手动修改

3、代码自动打包上传更新脚本

4、upgrade.sh后续版本

03/15/16

【表格】分享面试评估报告表

很久没写blog了,今天分享昨天整理的一个《面试评估报告表》

应聘者姓名 性别 应聘职位
所属部门 工作地点 评估日期
能力素质

评价

能力项 个人得分
1(差) 2(一般) 3(良) 5(优秀) 特长
面试题目
个人概况
抗压能力
实际经验
表达能力
专业知识
行业理解
工作态度
自学能力
计划分析能力
判断决策能力
目标管理能力
领导能力
团队协同能力
开拓能力
客户服务意识
综合评价 优点
缺点
其他
建议 □录用   □待定     □基本上不符合条件

评估者:                                                           日期:   年   月   日

* 应聘者任何一项考核为差,直接不通过。原则上评估分大于75分,才考虑录用。

* 应聘者各项全优,总分80分。表格中特长栏由面试官填写,总分不超过20分,可不填。

10/29/15

【shell】日志归档分类归档

#!/bin/sh
#遍历当前目录,将日志压缩文件按照域名、日志日期分类
#为了日志统一管理,完善日志系统分析、采集、备份、统计等需求
#date:2015-10-29
#add by chen-123

for file in $(find . -name "*gz" -type f);
do
        path=${file#*/}
        cur_parent_dir=${path%%/*}
        old_dir=${path%/*}
        old_sub_dir=${old_dir%/*}
        project_log_dir_name=$(echo ${file##*/}|awk -F '[-_]' '{print $1}')
        log_filename=$(echo ${file##*/})
        if [ "${cur_parent_dir}" != "${project_log_dir_name}" ];then
                echo $log_filename
                if [ "${old_dir}" = "${old_sub_dir}" ];then
                        test -d "./"$project_log_dir_name || mkdir -p "./"$project_log_dir_name
                        moveto_path="./"$project_log_dir_name"/"$log_filename
                        test -f "${moveto_path}" && moveto_path="./"$project_log_dir_name"/"${log_filename/[_-]/_${cur_parent_dir}_/}
                        test -f "$moveto_path" ||  mv $file $moveto_path
                        test -f "$moveto_path" && echo "move $file to $moveto_path success"
                else
                        new_sub_dir=${old_dir##*/}
                        moveto_path=$project_log_dir_name"/"$new_sub_dir"/"$log_filename
                        test -d $project_log_dir_name"/"$new_sub_dir || mkdir -p $project_log_dir_name"/"$new_sub_dir
                        test -f "$moveto_path" && moveto_path="./"$project_log_dir_name"/"${log_filename/[_-]/_${cur_parent_dir}_/}
                        test -f "$moveto_path" ||  mv $file $moveto_path
                        test -f "$moveto_path" && echo "move $file to $moveto_path success"
                fi
        fi
done

10/13/15

关于网站安全问题的思考

前言:
    网站安全问题,预防为主,别等别人发现你们家漏洞,玩出点名堂才发觉。
     一、预防为主(早发现,早处理)
      1、完善网站资源备份
      2、逐步部署网站应用级入侵防御系统即WAF,使用第三放应用辅助检查安全漏洞(比如:360、百度云观测)
      3、所有项目要求部署ci_safe.php安全代码,规范网站帐号管理
      4、规范配置,将非法请求直接挡掉,并记录日志进行分析,完善白名单机制
      5、应用代码安全审计,安排高级工程师负责审计,规避程序设计存在的安全问题
      6、定期进行错误日志分析,访问日志分析,异常请求分析(404,500,异常IP)等
      7、建立漏洞分析机制,安全员负责收集主流漏洞并提供修复方案
      8、建立一套隔离只读系统,紧急情况可切到隔离只读版本。
      二、处理故障 (快速处理,降低影响)
      1、根据故障反馈情况,分析访问日志,错误日志,确定故障发生时间点、链接、IP、漏洞类型等信息
      2、找到故障源之后,深入分析漏洞原理,讨论修复方案
      3、评估故障影响范围,讨论运营恢复策略。比如:搜索引擎收入情况,其他业务影响情况等
      4、根据上述信息,运维联合技术及运营人员,快速制定恢复方案,并汇报给领导审查
      5、根据恢复方案实施,并在后续运营过程中跟进恢复情况,做相应调整。
07/8/15

十年成长,预见未来

2015年7月8日,公司正式在香港创业板挂牌上市。新的起点,新的开始!

管理团队

IMG_1559

IMG_1557

上市纪念币

IMG_1565

ps:6月份事情比较多,近期研究的一些新东西,还不能自成体系,待完善之后,分享出来!

04/16/15

【python】服务器硬件信息及服务信息报表脚本

一、功能描述

1、phpdba_system_report.sh 收集服务器硬件信息及服务器上开启的服务,比如:apache,nginx,mysql,redis,memcache等,状态信息及安装信息

2、通过batch_ssh.py 脚本,登录各服务器并执行phpdba_system_report.sh收集信息,并将信息记录日志文件。

3、通过parse_result_file.py 脚本分析日志文件,将日志文件保存文本格式文件和excel格式文件。

二、后期改进计划

1、将功能描述中第三步中,将服务器信息入库,定期录入数据,分析服务器硬件信息和服务信息变动情况,并生成 报表告警提示。

三、代码分享地址

https://github.com/chen-123/phper/blob/master/%E8%BF%90%E7%BB%B4%E5%B7%A5%E5%85%B7/python/parse_result_file.py

四、excel报表截图

20150416161419

03/27/15

【出路】三十而立

一、前言

在网上看到太多文章,都讲码农三十岁是一道坎。岁月这把傻猪刀,转眼我也三十了,也该为思考下以后的路。

二、我的经历

08年3月份,来到现在单位某网从事一个非常神圣的职业,学名叫php开发工程师,昵称叫『码农』或者「程序员」。时间过得真快,现在都2015年了,工作第八给年头。在这八年中,我从学生的角色,转变为「码农」,开始自己养活自己;从年轻的男孩转变为大腹便便的胖子,体重曾经直接飙到160,脂肪肝随之出现;从妈妈的乖儿子变成老婆大人的「胖子」,变成了伟仔的「巴巴」。

仿佛在这八年中,实现了我人生中非常重要的几件事情。结婚生子、做房奴,接下来应该是车奴生活,生活压力越来越大,责任也越来越重。

三、三十而立,拥抱机会

八年的「码农」职场历练,让我现在有能力负责某网的运维工作。根据某网业务增长情况,制定全年带宽服务器采购计划及预算;设计千万级pv网站的高可用技术架构;跟进业务发展需求,构建监控体系;运维资产管理,包括服务器硬件资源、服务、应用等;制定备份策略、资源容灾方案、服务扩容方案、安全策略。

四、机会在何处

1、机会是给有准备的人

2、老实人不吃亏,吃亏人不老实

3、机会来去,心态调整好

4、坚持学习,勤思考,才能发现机会

五、我的出路

1、技术路线

高级PHP开发工程师:熟悉PHP开发,也就是可以凭借技术手册、网络、经验等,完成复杂些php开发工作。

高级运维开发工程师:熟练使用python、shell、perl、php等及诸多开源项目,完成运维自动化开发工作。

技术咨询:凭借多年专研,逐步成为自己擅长的技术领域的专家,并为有这方面需求的客户,提供解决方案。

2、管理路线

运维经理:协调管理整合运维资源,包括运维人员、服务器、应用业务、服务、安全、备份、容灾等

架构师:设计程序架构、系统架构、数据库设计、测试架构、上线及bug跟进、系统优化等

六、我的选择

技术路线

现在很晚了,原因有很多,下次阐述。 希望各位「码农」调整好心态,出路就在脚下。幸福其实一直都在。。。。。。

 

02/9/15

【转】服务器阵列卡及硬盘健康监控

通常,我们使用的DELL/HP/IBM三家的机架式PC级服务器阵列卡是从LSI的卡OEM出来的,DELL和IBM两家的阵列卡原生程度较高, 没有做太多封装,可以用原厂提供的阵列卡管理工具进行监控;而HP的阵列卡一般都做过封装了,因此需要使用自身特有的管理工具来监控。

本文以几种常用的阵列卡为例,展示其阵列卡及硬盘监控的方法。
DELL SAS 6/iR卡,全称LSI Logic SAS1068E,只支持RAID 0, RAID 1, RAID 1+0, 不支持RAID 5等高级RAID特性,不支持阵列卡电池。
DELL PERC PERC H700卡,全称LSI Logic MegaRAID SAS 2108,支持各种RAID级别及高级特性,可选配阵列卡电池。
DELL PERC H310 Mini卡 ,全称LSI Logic / Symbios Logic MegaRAID SAS 2008,支持常见RAID级别,不支持高级RAID特性,不支持阵列卡电池。
IBM ServeRAID M5014 SAS/SATA Controller卡,全称LSI Logic / Symbios Logic MegaRAID SAS 2108,支持各种RAID级别及高级特性,可选配阵列卡电池。
IBM ServeRAID-MR10i SAS/SATA Controller卡, 全称LSI Logic / Symbios Logic MegaRAID SAS 1078,支持常见RAID级别,不支持高级RAID特性,可选配阵列卡电池,这个卡其实和DELL的PERC 6/i卡是一样的,都是基于LSI MegaRAID SAS 1078基础上OEM出来的。

上面是几种常见的阵列卡型号,更多的可以自行查看官方的技术手册。

下面我们要继续的是,这些阵列卡以及硬盘如何监控,阵列卡的管理也请查看官方技术手册,不在本文讨论范畴,或者查看作者的一个分享PPT:PC服务器阵列卡管理简易手册。

一般地,支持RAID 5的卡,我们称其为阵列卡,都可以使用LSI官方提供的MegaCli工具来管理,而不支持RAID 5的卡,我们称其为SAS卡,使用lsiutil工具来管理。HP的服务器使用其特有的hpacucli工具来管理。

1、MegaCli工具
a) MegaCli -adpallinfo -aall — 查看阵列卡信息
-a 参数指定阵列卡的编号,一般服务器上只会配一个阵列卡,因此我们通常指定为 -a0(阵列卡适配器编号,从0开始) 即可,主要关注下面几个信息:

状态值 对应含义
Product Name : PERC H710 Mini  阵列卡名称
FW Package Build: 21.2.0-0007  阵列卡firmware版本号,版本如果太低,建议升级以提高稳定性及性能
BBU : Present  是否有配BBU电池

b) MegaCli -cfgdsply -aall — 查看阵列配置

状态值 对应含义
Memory: 512MB  阵列卡cache大小,2的N次方,如果不是,说明阵列卡有异常
Number of dedicated Hotspares: 0  阵列是否有专用/独享热备盘(如果有多个逻辑磁盘组/disk group,则可以指定一个硬盘用于全局热备,那么该disk group上的专用热备盘数量为0也不用担心),除了RAID 1/RAID 1+0一般不指定热备盘以外,其他几个阵列级别建议都要指定热备盘
State : Optimal  阵列状态,如果不是 Optimal 就要关注了
Current Cache Policy: WriteBack, ReadAheadNone, Direct, Write Cache OK if Bad BBU  阵列读写cache策略,建议写策略设置为FORCE WB,最起码是WB,预读策略可以关掉,意义不大,几乎没影响
Disk Cache Policy : Disabled  硬盘cache策略,建议关闭,防止意外时数据丢失
Current Power Savings Policy: None  节电策略,建议关闭
Media Error Count: 0  三个错误计数器,任何一个值大于100就要立刻引起关注,尤其要关注起增长速度。1T以上SATA盘,计数值不够精确,可能所有盘上该值都会大于0,一般重启就会重新清0,如果重启后还是大于0的话,赶紧报修吧。SAS盘的计数值则比较准确。
Other Error Count: 0
Predictive Failure Count: 0
Firmware state: Online, Spun Up  查看硬盘状态,如果是unconfigured表示该硬盘未分 配加入到阵列中;如果是 unconfigured(bad)表示该盘不但是未分配,而且还坏了,正是“出师未捷身先死”;如果是failed,表示该盘故障无法识别;如果是 rebuilding,表示该盘正在重建数据

c) MegaCli -adpbbucmd -aall — 查看阵列卡电池信息

状态值 对应含义
Temperature: 39 C  查看电池温度,如果相比上一次查看高出不少,就需要关注了,或者可以根据经验设置一个基线值
Battery State: Optimal  电池状态,如果不是为Optimal,就需要关注了
Charger Status: Complete  电池充放电状态
isSOHGood: Yes  电池状态,如果不是为Yes,需要关注
Relative State of Charge: 93 %  当前电量,当电量低于15%,或者电池坏掉时,默认都会将写策略从WB改成WT,除非设定为FORCE WB策略
Max Error = 0 %  电池是否有错误信息
Next Learn time: Tue Oct 14 22:06:50 2014  电池充放电时间,注意这是美国时间。另外,新的阵列卡电池很多改成电容式的了,也就不需要重复充放电了

d) MegaCli -fwtermlog -dsply -aALL 查看阵列卡日志,关注里面的error/fail/warn等多个关键字

2、lsiutil工具
lsiutil有交互和非交互两种方式,作为监控,我们肯定选择非交互模式。想要使用交互模式的,可以根据非交互模式自行练习。
a) lsiutil -p 1 -a 20,12,0,0 — 查看硬盘计数器
Invalid DWord Count 2,563 — 任何一个值大于0,都需要引起关注
Running Disparity Error Count 2,366
Loss of DWord Synch Count 0
Phy Reset Problem Count 0

b) lsiutil -p 1 -a 21,1,0,0,0 — 查看逻辑卷状态

状态值 对应含义
Volume State: optimal, enabled  逻辑卷健康状况
Volume draws from Hot Spare Pools: 0  是否有热备
Volume Size 139392 MB, 2 Members  由几块硬盘组成
Primary is PhysDisk 1 (Bus 0 Target 9)  物理硬盘1
Secondary is PhysDisk 0 (Bus 0 Target 3)  物理硬盘0

c) lsiutil -p 1 -a 21,2,0,0,0 — 查看物理硬盘状态

状态值 对应含义
PhysDisk 0 is Bus 0 Target 3  编号
PhysDisk State: online  状态
Error Count 13, Last Error: Command = 28h, Key = 3, ASC/ASCQ = 11h/00h  错误计数器,大于0的话,就需要引起关注

3、hpacucli工具
hpacucli工具查看阵列、硬盘、电池信息,其实就只要一条指令:
hpacucli ctrl all show config detail — 查看阵列详细信息、配置

状态值 对应含义
Controller Status: OK 阵列卡状态
Firmware Version: 1.18 firmware版本,太低了建议升级,以提高稳定性及性能
Cache Board Present: True 是否配备了cache模块
Cache Status: OK cache模块状态
Cache Ratio: 100% Read / 0% Write cache策略,此处只有读cache,不用于写cache,因为没有bbu电池,见下方结果
Drive Write Cache: Disabled 关闭磁盘cache
Total Cache Size: 256 MB cache大小
Total Cache Memory Available: 208 MB 实际可用cache大小,和理论cache大小不一样,说明cache模块可能有问题
No-Battery Write Cache: Disabled 关闭FORCEWB策略
Battery/Capacitor Count: 0 阵列卡BBU电池数量为0,也就是没有BBU模块
Battery/Capacitor Status: Failed (Replace Batteries) 阵列卡BBU电池状态,这里显示是错误状态,需要及时更换
Array: A 第一个乌列阵列,编号从A开始,依次是A、B、C
Status: OK 物理阵列状态
Logical Drive: 1 第一个逻辑卷,编号从1开始
Fault Tolerance: RAID 5 第一个逻辑卷的阵列级别
Status: OK 第一个逻辑卷状态
Caching: Enabled 第一个逻辑卷是否启用了cache策略
physicaldrive 1I:1:1 第一块物理硬盘,编号从1开始
Status: OK 第一块物理硬盘状态
Firmware Revision: HPDA 第一块物理硬盘firmware,如果太低,也需要及时升级,HP的硬盘每个批次都有不同的firmware

延伸阅读:

http://www.lsi.com/downloads/Public/Obsolete/Obsolete%20Common%20Files/mr_sas_stor_ug.pdf
http://www.hp.com/ctg/Manual/c00709035.pdf
http://www.wafl.co.uk/tag/sasadmin/
http://docs.oracle.com/cd/E19121-01/sf.x4200/819-1157-23/F_BIOS_RAID.html

12/3/14

【问题】macbook air下使用svn使用问题

一、问题描述

问题描述:同事新买的Macbook air svn checkout代码时,遇到 411 Content length required的报错。

环境描述:系统默认svn 为1.7的版本号

排查步骤:

1、确认是否svn服务器版本问题,网上找几个开源的svn库测试,均不能svn checkout代码下来。

2、检查svn服务器日志,发现如下日志

9.77.218.146 – - [03/Dec/2014:18:10:49 +0800] “OPTIONS /svn/phpdba HTTP/1.1″ 411 181 “-” “SVN/1.7.17 serf/1.3.3″

9.77.218.146 – - [03/Dec/2014:18:12:42 +0800] “OPTIONS /svn/phpdba HTTP/1.1″ 411 181 “-” “SVN/1.7.17 serf/1.3.3″

直接给nginx挡住,返回411

3、问题确定,mac air 的svn checkout的时候,没有或者丢失内容长度信息,nginx检查到缺少内容长度信息,返回411

二、处理方法

1、开启svnserver服务,macbook air下面通过svn协议请求代码资源

2、修改 ~/.subversion/servers 文件, 添加http-chunked-requests=no 如:

[global]
http-chunked-requests = no