工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

只允许本地访问cache_object

acl local src 127.0.0.1
acl Manager proto cache_object
http_access allow Manager local
http_access deny Manager
acl alls src all
http_access allow alls

在squid2.6中refresh_pattern的一些理解和建议.

refresh_pattern的作用:
用于确定一个页面进入cache后,它在cache中停留的时间。
refresh_pattern规则仅仅应用到没有明确过时期限的响应。
原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。

语法:
refresh_pattern [-i] regexp min percent max [options]

min参数是分钟数量。它是过时响应的最低时间限制。如果某个响应驻留在cache里的时间没有超过这个最低限制,那么它不会过期。类似的,max参数是存活响应的最高时间限制。如果某个响应驻留在cache里的时间高于这个最高限制,那么它必须被刷新。

在最低和最高时间限制之间的响应,会面对squid的最后修改系数LM-factor算法LM-factor=(response age)/(resource age)。对这样的响应,squid计算响应的年龄和最后修改系数,然后将它作为百分比值进行比较。响应年龄简单的就是从原始服务器产生,或最后一次验证响应后,经历的时间数量。源年龄在Last-Modified和Date头部之间是不同的。LM-factor是响应年龄与源年龄的比率。

常用的几个参数的意思

override-expire
该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期。

override-lastmod
改选项导致squid在检查LM-factor百分比之前先检查min值。

reload-into-ims
该选项让squid在确认请求里,以no-cache指令传送一个请求。换句话说,squid在转发请求之前,对该请求增加一个If-Modified- Since头部。注意这点仅仅在目标有Last-Modified时间戳时才能工作。外面进来的请求保留no-cache指令,以便它到达原始服务器。
一般情况可以使用 reload-into-ims。

它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间。
举例:
refresh_pattern -i \.css$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.xml$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.html$ 1440 90% 129600 reload-into-ims-
refresh_pattern -i \.shtml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.hml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.jpg$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.png$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.gif$ 1440 90% 129600 ignore-reload
refresh_pattern -i \.bmp$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.js$ 1440 90% 129600 reload-into-ims

ignore-reload
该选项导致squid忽略请求里的任何no-cache指令。
所以。如果希望内容一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项,
这个我们常用在mp3,wma,wmv,gif之类。
Examples:

refresh_pattern -i \.mp3$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wmv$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.rm$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.swf$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.mpeg$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wma$ 1440 50% 2880 ignore-reload
resource age =对象进入cache的时间-对象的last_modified
response age =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)

举个例子,这里只考虑percent, 不考虑min 和max

例如:refresh_pattern 20%

假设源服务器上www.aaa.com/index.htm -----lastmodified 是 2007-04-10 02:00:00
squid上 proxy.aaa.com/index.htm index.htm进入cache的时间 2007-04-10 03:00:00

1)如果当前时间 2007-04-10 03:00:00
resource age =3点-2点=60分钟
response age =0分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟
也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。

2)如果当前时间 2007-04-10 03:05:00
resource age =3点-2点=60分钟
response age =5分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7
LM-factor=5/60=8.3%<20%

一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。
如果这时没有index.htm的请求,index.htm会一直在缓存中,如果有index.htm请求,squid收到该请求后,由于已经过期, squid会向源服务器发一个index.htm是否有改变的请求,源服务器收到后,如果index.htm没有更新,squid就不用更新缓存,直接把缓存的内容放回给客户端,同时,重置对象进入cache的时间为与源服务器确认的时间,比如2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age变长,相应在cache中存活的时间也变长。

如果有改变则把最新的index.htm返回给squid,squid收到会更新缓存,然后把新的index.htm返回给客户端,同时根据新页面中的Last_Modified和取页面的时间,重新计算resource age,进一步计算出存活时间。

实际上,一个页面进入cache后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认。

隐藏Squid版本信息

3.18版本

只需要一行

reply_header_access Via deny all  或 via off 也可

还有如下一些

#reply_header_access All deny all
#reply_header_access Server deny all
#reply_header_access Via deny all
#reply_header_access X-Forwarded-For deny all
#reply_header_access X-Cache deny all
#reply_header_access X-Cache-Lookup deny all
#reply_header_access Accept-Encoding deny all

 

2.X版本的是用 header_access

 

可以去掉所有的header或部分header,可以参照下面列表
Accept         HTTP_ACCEPT
Accept-Charset         HTTP_ACCEPT-CHARSET
Accept-Encoding         HTTP_ACCEPT-ENCODING
Accept-Language         HTTP_ACCEPT-LANGUAGE
Accept-Ranges         HTTP_ACCEPT-RANGES
Age         HTTP_AGE
Allow         HTTP_ALLOW
Authorization         HTTP_AUTHORIZATION
Cache-Control         HTTP_CACHE-CONTROL
Connection         HTTP_CONNECTION
Content-Base         HTTP_CONTENT-BASE
Content-Disposition         HTTP_CONTENT-DISPOSITION
Content-Encoding         HTTP_CONTENT-ENCODING
Content-Language         HTTP_CONTENT-LANGUAGE
Content-Length         HTTP_CONTENT-LENGTH
Content-Location         HTTP_CONTENT-LOCATION
Content-MD5         HTTP_CONTENT-MD5
Content-Range         HTTP_CONTENT-RANGE
Content-Type         HTTP_CONTENT-TYPE
Cookie         HTTP_COOKIE
Date         HTTP_DATE
ETag         HTTP_ETAG
Expires         HTTP_EXPIRES
From         HTTP_FROM
Host         HTTP_HOST
If-Match         HTTP_IF-MATCH
If-Modified-Since         HTTP_IF-MODIFIED-SINCE
If-None-Match         HTTP_IF-NONE-MATCH
If-Range         HTTP_IF-RANGE
Last-Modified         HTTP_LAST-MODIFIED
Link         HTTP_LINK
Location         HTTP_LOCATION
Max-Forwards         HTTP_MAX-FORWARDS
Mime-Version         HTTP_MIME-VERSION
Pragma         HTTP_PRAGMA
Proxy-Authenticate         HTTP_PROXY-AUTHENTICATE
Proxy-Authentication-Info         HTTP_PROXY-AUTHENTICATION-INFO
Proxy-Authorization         HTTP_PROXY-AUTHORIZATION
Proxy-Connection         HTTP_PROXY-CONNECTION
Public         HTTP_PUBLIC
Range         HTTP_RANGE
Referer         HTTP_REFERER
Request-Range         HTTP_REQUEST-RANGE
Retry-After         HTTP_RETRY-AFTER
Server         HTTP_SERVER
Set-Cookie         HTTP_SET-COOKIE
Title         HTTP_TITLE
Transfer-Encoding         HTTP_TRANSFER-ENCODING
Upgrade         HTTP_UPGRADE
User-Agent         HTTP_USER-AGENT
Vary         HTTP_VARY
Via         HTTP_VIA
Warning         HTTP_WARNING
WWW-Authenticate         HTTP_WWW-AUTHENTICATE
Authentication-Info         HTTP_AUTHENTICATION-INFO
X-Cache         HTTP_X-CACHE
X-Cache-Lookup         HTTP_X-CACHE-LOOKUP
X-Forwarded-For         HTTP_X-FORWARDED-FOR
X-Request-URI         HTTP_X-REQUEST-URI
X-Squid-Error         HTTP_X-SQUID-ERROR
Negotiate         HTTP_NEGOTIATE
X-Accelerator-Vary         HTTP_X-ACCELERATOR-VARY
Other:         HTTP_OTHER:

squid日志TCP命中率字段解释

squid日志TCP命中率字段解释
#cat access.log|gawk ‘{print $4}’|sort|uniq -c|sort -nr
9568 TCP_IMS_HIT/304
6313 TCP_HIT/200
2133 TCP_MISS/200
1568 TCP_MISS/206
587 TCP_MEM_HIT/200
531 TCP_MISS/304
207 TCP_REFRESH_HIT/200
152 TCP_REFRESH_HIT/304
86 TCP_NEGATIVE_HIT/404
69 TCP_MISS/404
9 TCP_MISS/000
4 TCP_MISS/503
1 TCP_REFRESH_MISS/000
1 TCP_DENIED/400

可以使用上面的方法,大约的分析一下命令中比。什么意思就看下面的详解.
#cat /var/log/squid/access.log |grep TCP_MEM_HIT
如果看到很多的TCP_MEM_HIT ,这表明该文件是从内存缓存读取的,squid已经起作用了!你再用浏览器打开该文件,应该是快如闪电了。。呵呵,大功告成了!还有其他类型的HIT,如TCP_HIT等等,这些是从磁盘读取的,我??得加速的意义不大,只不过缓解了apache的压力而已。

相应于HTTP请求,下列标签可能出现在access.log文件的第四个域。

TCP_HIT
Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。

TCP_MISS
Squid没有请求资源的cache拷贝。

TCP_REFERSH_HIT
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。

TCP_REF_FAIL_HIT
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到??户端。

TCP_REFRESH_MISS
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。

TCP_CLIENT_REFRESH_MISS
Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认。

TCP_IMS_HIT
客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

TCP_SWAPFAIL_MISS
Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这是个cache丢失一样。

TCP_NEGATIVE_HIT
在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

TCP_MEM_HIT
Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

TCP_DENIED
因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值。

TCP_OFFLINE_HIT
当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度。

TCP_REDIRECT
重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节)。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令。

NONE
无分类的结果用于特定错误,例如无效主机名。


相应于ICP查询,下列标签可能出现在access.log文件的第四域。

UDP_HIT
Squid在cache里发现请求资源的貌似新鲜的拷贝。

UDP_MISS
Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求,就可能是个cache丢失。请对比UDP_MISS_NOFETCH。

UDP_MISS_NOFETCH
跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS。

UDP_DENIED
因为icp_access规则,ICP查询被拒绝。假如超过95% 的到某客户端的ICP响应是UDP_DENIED,并且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端。若这点发生,你也可在cache.log里见到一个警告。

UDP_INVALID
Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等)。Squid发送UDP_INVALID响应到客户端。

linux 软阵列管理

简单来说,RAID(磁盘阵列)把多个硬盘组合成为一个逻辑扇区,因此,操作系统只会把它当作一个硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。最初的RAID分成了不同的等级,每种等级都有其理论上的优缺点。更多内容参考:RAID

阵列可以有阵列卡实现的硬阵列,也可以由操作系统提供支持的软阵列。linux下的软阵列用mdadm来管理。以下是针对CentOS的基本操作:

一、建立软阵列一般分为3个步骤
1、产生组成单元

linux中软阵列的组成单元是分区,且这个分区的系统识别码必须设置成“fd linux raid autodetect”。可以用fdisk或pareted分区工具分区。

   Device Boot      Start         End      Blocks   Id  System
/dev/hdb1               1         195       98248+  fd  Linux raid autodetect
/dev/hdb2             196         390       98280   fd  Linux raid autodetect2、建立磁盘阵列

mdadm -C /dev/md0 -l 1 -n 4 /dev/hd[bd][12]
#-C /dev/md0 创建名为md0的磁盘阵列设备
#-l 1 阵列等级是raid1,可以建立0,5等其他磁盘阵列
#-n 4 组成单元有4个分区
#/dev/hd[bd][12] 组成单元是/dev/hdb1、/dev/hdb2、/dev/hdd1、/dev/hdd2

#格式化该磁盘阵列
mkfs -t ext3 /dev/md0

#挂载并设置/etc/fstab
mount /dev/md0 /data
echo "/dev/md0 /data ext3 defaults 1 2" >> /etc/fstab3、mdadm.conf配置

/etc/mdadm.conf是centos下mdadm的默认配置文件,系统启动时会根据此配置文件激活磁盘阵列及启动阵列监控服务。此配置文件可以参考/usr/share/doc/mdadm-2.6.9/mdadm.conf-example。配置很简单,可以根据已经建立的磁盘阵列使用以下命令建立此文件。

mdadm -Ds >> /etc/mdadm.conf
echo "MAILADDR saplingidea@gmail.com" >> /etc/mdadm.conf
#MAILADDR是管理员email,磁盘阵列出问题时会发邮件通知管理员。
cat /etc/mdadm.conf
#内容如下
ARRAY /dev/md0 level=raid1 num-devices=4 metadata=0.90 UUID=40d32084:7be6bc73:071b21a9:4d8afc12
MAILADDR saplingidea@gmail.com二、管理磁盘阵列
1、查看磁盘阵列信息

#直接查看/proc/mdstat
cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdd2[3] hdd1[2] hdb2[1] hdb1[0]
      98176 blocks [4/4] [UUUU]

#使用mdadm查看
mdadm -D /dev/md02、处理硬盘故障

对于raid1,raid5这样有容灾能力的磁盘阵列来说,硬盘的故障不用太担心。以下是处理硬盘故障一般步骤:
a.使用mdadm /dev/md0 -r /dev/hdb1 在线卸载故障硬盘的组成单元
b.物理拆除故障硬盘
c.安装正常的硬盘并分区产生新的组成单元
d.使用mdadm /dev/md0 -a /dev/hdd3 在线加入新组成单元

#-f参数可以模拟磁盘故障
mdadm /dev/md0 -f /dev/hdb1

mdadm -D /dev/md0 |tail
           UUID : 40d32084:7be6bc73:071b21a9:4d8afc12
         Events : 0.4

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       3       66        1      active sync   /dev/hdb2
       2      22       65        2      active sync   /dev/hdd1
       3      22       66        3      active sync   /dev/hdd2

       4       3       65        -      faulty spare   /dev/hdb1

#在线卸载故障硬盘的组成单元
mdadm /dev/md0 -r /dev/hdb1

#在线加入新组成单元
mdadm /dev/md0 -a /dev/hdd3

mdadm -D /dev/md0 |tail
  Spare Devices : 0

           UUID : 40d32084:7be6bc73:071b21a9:4d8afc12
         Events : 0.26

    Number   Major   Minor   RaidDevice State
       0      22       67        0      active sync   /dev/hdd3
       1       3       66        1      active sync   /dev/hdb2
       2      22       65        2      active sync   /dev/hdd1
       3      22       66        3      active sync   /dev/hdd23、启用、停用磁盘阵列

#启用
mdadm -A -s [MD_DEVICE]
#停用
mdadm --stop -s [MD_DEVICE]4、监控磁盘阵列

启动mdmonitor服务监控磁盘阵列,当磁盘阵列出现故障时会发邮件通知管理员,邮件保存在/etc/mdadm.conf里。

/etc/init.d/mdmonitor start
chkconfig mdmonitor on

#报警内容示例
This is an automatically generated mail message from mdadm
running on localhost.localdomain

A Fail event had been detected on md device /dev/md0.

It could be related to component device /dev/hdb1.

Faithfully yours, etc.

P.S. The /proc/mdstat file currently contains the following:

Personalities : [raid1]
md0 : active raid1 hdd2[3] hdd1[2] hdb2[1] hdb1[4](F)
     98176 blocks [4/3] [_UUU]

unused devices:5、删除磁盘阵列

删除磁盘阵列前必需做好备份。

umount /dev/md0
mdadm --stop -s /dev/md0
mdadm --zero-superblock /dev/hd[bd][123]
rm /etc/mdadm.conf

#删除磁盘阵列后必须修改/etc/fstab,以免开机无法挂载分区而无法启动。

 

---------------------linux as4中创建软阵列-

通常情况下人们在服务器端采用各种冗余磁盘阵列(RAID)技术来保护数据,中高档的服务器一般都提供了昂贵的硬件RAID控制器。对于资金实力有限的中小企业来讲,在Linux下通过软件来实现硬件的RAID功能,这样既节省了投资,又能达到很好的效果。何乐而不为呢?

作为一个面向服务器的网络型操作系统,Linux对数据的安全和存取速度给予了高度重视,从2.4版内核开始Linux就实现了对软件RAID的支持(关于RAID的背景知识请见附文),这让我们可以不必购买昂贵的硬件RAID设备,就能享受到增强的磁盘I/O性能和可靠性,进一步降低了系统的总体拥有成本。下面就让我们看一个Redhat Linux AS 4下的软件RAID配置实例吧。

系统配置情况

假设某单位新上了一套使用Oracle数据库的能量采集系统,该系统数据量极大并且读写非常频繁,实时性要求高,高峰时有近40名用户在线,对数据库服务器的磁盘子系统提出了很高的要求。由于预算比较紧张,经过多方比较,最终选择了采用Linux系统做软件RAID5的方案。

其配置情况如下:

● 操作系统为RedHat Linux AS 4;

● 内核版本为2.6.9-5.EL;

● 支持RAID0、RAID1、RAID4、RAID5、RAID6;

● 五块36GB SCSI接口的磁盘,其中RedHat AS 4安装在第一块磁盘,其它四块组成RAID 5用来存放Oracle数据库。

在RedHat AS 4下实现软件RAID是通过mdadm工具实现的,其版本为1.6.0,它是一个单一的程序,创建、管理RAID都非常方便,而且也很稳定。而在早期Linux下使用的raidtools,由于维护起来很困难,而且其性能有限,在RedHat AS 4下已经不支持了。

实现过程

1.创建分区

五块SCSI磁盘分别对应/dev/sda、/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde。其中第一块磁盘/dev/sda分两个区,用于安装RedHat AS 4和做交换分区,其他四块磁盘每块只分一个主分区,分别为/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1,并且将分区类型指定为“fd”,这将使Linux内核能将它们识别为RAID分区,且在每次引导时自动被检测并启动。创建分区使用fdisk命令。

# fdisk /dev/sdb

进入fdisk命令行后,使用命令n创建分区,命令t改变分区类型,命令w保存分区表并退出,命令m为帮助。

2.创建RAID 5

这里使用了/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1四个设备创建RAID 5,其中/dev/sde1作为备份设备,其他为活动设备。备份设备主要起备用作用,一旦某一设备损坏可以立即用备份设备替换,当然也可以不使用备份设备。命令格式如下:

# mdadm -Cv /dev/md0 -l5 -n3 -x1 -c128 /dev/sd[b,c,d,e]1

命令中各参数分别表示如下作用:“-C”指创建一个新的阵列;“/dev/md0”表示阵列设备名称;“-l5”表示设置阵列模式,可以选择0、1、4、5、6,它们分别对应于RAID0、RAID1、RAID4、RAID5、RAID6,这里设为RAID5模式;“-n3”指设置阵列中活动设备的数目,该数目加上备用设备的数目应等于阵列中的总设备数; “-x1”设置阵列中备份设备的数目,当前阵列中含有1个备份设备;“-c128”指设置块的尺寸为128KB,缺省为64KB;“/dev/sd[b,c,d,e]1”指当前阵列中包含的所有设备标识符,也可以分开来写,中间用空格分开,其中最后一个为备份设备。

3.查看阵列状态

当创建一个新阵列或者阵列重构时,设备需要进行同步操作,这一过程需要一定时间,可以通过查看/proc/mdstat文件,来显示阵列的当前状态以及同步进度、所需时间等。

# more /proc/mdstat

Personalities : [raid5]

md0 : active raid5 sdd1[3] sde1[4] sdc1[1] sdb1[0]

75469842 blocks level 5, 128k chunk, algorithm 2 [3/2] [UU_]

[>....................] recovery = 4.3% (1622601/37734912) finish=1.0min speed=15146K/sec

unused devices:

当新建或重构完成后,再次查看/proc/mdstat文件:

# more /proc/mdstat

Personalities : [raid5]

md0 : active raid5 sdd1[2] sde1[3] sdc1[1] sdb1[0]

75469842 blocks level 5, 128k chunk, algorithm 2 [3/3] [UUU]

unused devices:

通过以上内容,可以很清楚地看出当前阵列的状态,各部分所代表的意思如下:“[3/3]”中的第一位数表示阵列所包含的设备数,第二位数表示活动的设备数,如果有一个设备损坏,则第二位数将减1;“[UUU]”标记当前阵列可以正常使用的设备情况,现假设/dev/sdb1出现故障,则该标记将变成[_UU],这时的阵列以降级模式运行,即该阵列仍然可用,但是不再具有任何冗余;“sdd1[2]”指阵列所包含的设备数为n,若方括号内的数值小于n,则表示该设备为活动设备,若数值大于等于n,则该设备为备份设备,当一个设备出现故障的时候,相应设备的方括号后将被标以(F)。

4.生成配置文件

mdadm的缺省配置文件为/etc/mdadm.conf,它主要是为了方便阵列的日常管理而设置的,对于阵列而言不是必须的,但是为了减少日后管理中不必要的麻烦,还是应该坚持把这一步做完。

在mdadm.conf文件中要包含两种类型的行:一种是以DEVICE开头的行,它指明在阵列中的设备列表;另一种是以ARRAY开头的行,它详细地说明了阵列的名称、模式、阵列中活动设备的数目以及设备的UUID号。格式如下:

DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

ARRAY /dev/md0 level=raid5 num-devices=3 UUID=8f128343:715a42df: baece2a8: a5b878e0

以上的这些信息可以通过扫描系统的阵列来获取,命令为:

# mdadm -Ds

ARRAY /dev/md0 level=raid5 num-devices=3 UUID=8f128343:715a42df: baece2a8: a5b878e0

devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1

使用vi命令,按照规定的格式编辑修改/etc/mdadm.conf文件

# vi /etc/mdadm.conf

5.创建文件系统并挂接(mount)使用

RAID5已经启动并处于运行状态,现在要做的就是在其上创建一个文件系统,这里使用mkfs命令,文件系统类型为ext3。命令如下:

# mkfs -t ext3 /dev/md0

当新的文件系统生成之后,就可以将/dev/md0挂接到指定的目录了。命令如下:

# mount /dev/md0 /mnt/raid

为了让系统在启动时自动将/dev/md0挂接到/mnt/raid,还需要修改/etc/fstab文件,添加如下内容:

/dev/md0 /mnt/raid ext3 defaults 0 0

故障模拟

上面的实例,让我们对Redhat Linux AS 4的软件RAID功能有了一定的认识,并且通过详细的步骤说明了如何创建RAID5。有了RAID做保障,电脑里的数据看起来似乎已经很安全了,然而现有的情况还是不能让我们高枕无忧,想一想,万一磁盘出现故障怎么办?下面我们模拟一个更换RAID5故障磁盘的完整过程,希望以此丰富大家处理RAID5故障的经验,提高管理和维护水平。

我们仍然沿用上面的RAID5配置,首先往阵列中拷贝一些数据,接下来开始模拟/dev/sdb1设备故障。不过,对于无备份设备的RAID5的模拟过程也要经过如下三步,只是阵列重构和数据恢复是发生在新设备添加到阵列中之后,而不是设备损坏时。

1.将/dev/sdb1标记为已损坏的设备

# mdadm /dev/md0 -f /dev/sdb1

查看当前阵列状态

# more /proc/mdstat

Personalities : [raid5]

md0 : active raid5 sdd1[2] sde1[3] sdc1[1] sdb1[4](F)

75469842 blocks level 5, 128k chunk, algorithm 2 [3/2] [_UU]

[=>...................] recovery = 8.9% (3358407/37734912) finish=1.6min speed=9382K/sec

unused devices:

因为有备份设备,所以当阵列中出现设备损坏时,阵列能够在短时间内实现重构和数据的恢复。从当前的状态可以看出,阵列正在重构,且运行在降级模式,sdb1[4]的后面已经标上了(F),活动设备数也降为2个。

经过几分钟后,再次查看当前阵列状态。

# more /proc/mdstat

Personalities : [raid5]

md0 : active raid5 sdd1[2] sde1[0] sdc1[1] sdb1[3](F)

75469842 blocks level 5, 128k chunk, algorithm 2 [3/3] [UUU]

unused devices:

此时阵列重构已经完成,数据恢复完毕,原有的备份设备sde1成为了活动设备。

2.移除损坏的设备

# mdadm /dev/md0 -r /dev/sdb1

查看当前阵列的状态:

# more /proc/mdstat

Personalities : [raid5]

md0 : active raid5 sdd1[2] sde1[0] sdc1[1]

75469842 blocks level 5, 128k chunk, algorithm 2 [3/3] [UUU]

unused devices:

损坏的sdb1已经从阵列中移掉。

3.将新设备添加到阵列中

因为是模拟操作,可以通过下面的命令再次将/dev/sdb1添加到阵列中。如果是实际操作则要注意两点:一是在添加之前要对新磁盘进行正确的分区;二是添加时要用所添加设备的设备名替换/dev/sdb1。

# mdadm /dev/md0 -a /dev/sdb1

查看当前阵列的状态:

# more /proc/mdstat

Personalities : [raid5]

md0 : active raid5 sdb1[3] sdd1[2] sde1[0] sdc1[1]

75469842 blocks level 5, 128k chunk, algorithm 2 [3/3] [UUU]

unused devices:

这时sdb1作为备份设备再次出现在阵列中

常用阵列维护命令

1.启动阵列

# mdadm -As /dev/md0

该命令指启动/dev/md0阵列,其中“-A”指装载一个已存在的阵列;“-s”指查找mdadm.conf文件中的配置信息,并以此为依据启动阵列。

#mdadm -As

该命令指启动mdadm.conf文件中的所有阵列。

#mdadm -A /dev/md0 /dev/sd[b,c,d,e]1

如果没有创建mdadm.conf文件则可以采用上面这种启动方式。

2.停止阵列

# mdadm -S /dev/md0

3.显示指定阵列的详细信息

# mdadm -D /dev/md0

链接

RAID简介

RAID是冗余磁盘阵列(Redundant Array of Inexpensive Disk)的简称。它是把多个磁盘组成一个阵列,当作单一磁盘使用。它将数据以分段(striping)的方式分散存储在不同的磁盘中,通过多个磁盘的同时读写,来减少数据的存取时间,并且可以利用不同的技术实现数据的冗余,即使有一个磁盘损坏,也可以从其他的磁盘中恢复所有的数据。简单地说,其好处就是:安全性高、速度快、数据容量大。

磁盘阵列根据其使用的技术不同而划分了等级,称为RAID level,目前公认的标准是RAID 0~RAID 5。其中的level并不代表技术的高低,RAID 5并不高于RAID 4 ,RAID 0并不低于RAID 2 ,至于选择哪一种RAID需视用户的需求而定。下面分别对常用的RAID 0、RAID 1、RAID 5进行简单的介绍。

1.RAID 0

特点:它是将多个磁盘并列起来,成为一个大硬盘。在存取数据时,将数据按磁盘的个数来进行分段,然后同时将这些数据写进这些盘中。在所有的级别中,RAID 0的速度是最快的。但没有数据冗余,阵列中任何一个磁盘坏掉,意味着所有数据丢失。


磁盘利用数:n(假设有n个磁盘)。

配置条件:最低两块磁盘,且分区大小尽量相同。

应用领域:对高磁盘容量及高速磁盘存取有特殊需求,而又不计较其高故障率的工作。当然,如果你正在使用集群,RAID 0 无疑是提高磁盘I/O性能的最好方法,因为在这种情况下,你就不用担心冗余的问题了。

2.RAID 1

特点:使用磁盘镜像(disk mirroring)的技术,在一个磁盘上存放数据的同时也在另一个磁盘上写一样的数据。因为有了备份磁盘,所以RAID 1的数据安全性在所有的RAID级别上来说是最好的。尽管其写入数据的速度比较慢,但因其数据是以分段的方式作储存,因而在读取时,它几乎和RAID 0有同样的性能。
 

磁盘利用数:n/2。

配置条件:最低两块磁盘,且分区大小尽量相同。

应用领域:数据库、金融系统等一些对数据有着高可靠性要求的领域。再者就是系统中写数据量比较少,而读数据量又比较多的情况下可以采用这一模式。

3.RAID 5

特点:以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位,而是将数据段的校验位交互存放于各个磁盘上。这样,任何一个磁盘损坏,都可以根据其他磁盘上的校验位来重建损坏的数据。并行读写数据,性能也很高。
 

磁盘利用数:n-1。

配置条件:最低三块硬盘,且分区大小尽量相同。

 

测试通过

 

Red Hat Enterprise Linux 4中,raid磁盘阵列的管理仅通过一条/sbin/mdadm 命令来完成的。在通过mdadm -C 建立/dev/mdXRAID 设备后,每次电脑重新启动后,都能正确加载RAID 设备,这是为什么呢?
本人一开始也感到很疑惑,后来通过分析,初步掌握了linux起动时加载和管理RAID 设备的过程,写出来与大家分享和探讨。
1.与mdadm相关配置文件文件:
/etc/mdadm.conf
/proc/partitions
/proc/mdstat
/dev/mdX

2.linux起动时是如何加载和管理RAID 设备
主要是通过/etc/rc.d/rc.initsys来做到的。
首先查找/etc/mdadm.conf,如果找到则用/sbin/mdadm -A -s命令加载
。。。。。
if [ -f /etc/mdadm.conf ]; then
/sbin/mdadm -A -s
fi
。。。。。
可用以下命令测试:
/sbin/mdadm -S /dev/mdX
/sbin/mdadm -A -s
如果没有找到有效的/etc/mdadm.config文件,则通过/proc/partitions来加载
。。。。
if [ $RESULT -gt 0 -a -x /sbin/mdadm ]; then
/sbin/mdadm -Ac partitions $i -m dev
RESULT=$?
fi
。。。。。
显然/etc/mdadm.conf不是必须的
可用以下命令测试:
/sbin/mdadm -S /dev/mdX
/sbin/mdadm -Ac partitions /dev/md0 -m dev
or
mdadm -Ac partitions /dev/md0 -m 0

shell结合iptables自动处理CC攻击

大概原理就是对最新日志里面的客户端访问IP进行采样统计分析,然后对超出正常访问次数的IP进行屏蔽,如下面统计分析后的结果:

对最新1000条日志的客户端访问IP进行排序统计访问次数。比如第一个IP 219.128.20.68 1000条日志就有295条,访问肯定不正常

root@ubuntu134:# tail access.log -n 1000 |grep vote.php |awk {'print $2'} |sort |uniq -c |sort -nr
   295 219.128.20.68
   175 113.250.97.209
   164 218.87.140.39
   153 59.61.215.42
     98 222.240.182.234
     83 220.181.110.65
     73 120.38.1.255
     62 221.3.99.106
     21 220.249.83.74
     12 218.22.10.114
      1 123.52.158.16
      1 114.81.115.201

然后就是自动处理,如果1000条日志单IP超过50条就屏蔽掉

*/2 * * * * /usr/local/nginx/var/log/drop.sh

#!/bin/sh
cd /usr/local/nginx/var/log
tail access.log -n 1000 |grep vote.php |awk {'print $2'} |sort |uniq -c |sort -nr |awk '{if ($2!=null && $1>50) {print $2}}' > drop_ip.txt
for i in `cat drop_ip.txt`
do
/sbin/iptables -I INPUT -s $i -j DROP;
done

这shell 每几分钟执行一次,就可自动屏蔽那些不正常IP,相信大家都看的懂,下面是针对连接数屏蔽代码

#!/bin/sh
/bin/netstat -ant |grep 80 |awk '{print $5}' |awk -F : '{print $1}' |sort |uniq -c |sort -rn |grep -v -E '192.168|127.0' |awk '{if ($2!=null && $1>50) {print $2}}' > drop_ip.txt
for i in `cat drop_ip.txt`
do
/sbin/iptables -I INPUT -s $i -j DROP;
done

说下,grep -v -E '192.168|127.0'  也就是排除内网IP,免得把自己给屏蔽了,当然还可以加些自己的IP。

nginx 限制ip并发数和限制速度

nginx限制ip并发数,也是说限制同一个ip同时连接服务器的数量

1.添加limit_zone
这个变量只能在http使用
vi /usr/local/nginx/conf/nginx.conf
limit_zone one $remote_addr 10m;

 

2.添加limit_conn
这个变量可以在http, server, location使用
我只限制一个站点,所以添加到server里面
vi /usr/local/nginx/conf/host/gaojinbo.com.conf
limit_conn   one 10;

 3.重启nginx
killall -HUP nginx

 

 

 

nginx 限速模块

参考:
关于limit_zone:http://wiki.nginx.org/NginxHttpLimitZoneModule
关于limit_rate和limit_conn:http://wiki.nginx.org/NginxHttpCoreModule

nginx可以通过HTTPLimitZoneModule和HTTPCoreModule两个组件来对目录进行限速。

http {
  limit_zone   one  $binary_remote_addr  10m; 
  server {
    location /download/ {
      limit_conn   one  1;
      limit_rate 300k;
    }
  }
}

limit_zone,是针对每个IP定义一个存储session状态的容器。这个示例中定义了一个10m的容器,按照32bytes/session,可以处理320000个session。

limit_conn one 1;
限制每个IP只能发起一个并发连接。

limit_rate 300k;
对每个连接限速300k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。

tcp/ip相关的值

加快回收time_wait的连接
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1

net.ipv4.tcp_fin_timeout=30
#当KEEPALIVE起作用时,发送keepalive消息的频率,默认2小时,改为20分钟
net.ipv4.tcp_keepalive_time=1200
#开启SYN Cookies,当SYN等待列队溢出,启用cookies来处理,默认关闭,改为开启
net.ipv4.tcp_syncookies=1
#开启重用,允许将TIME-WAIT状态sockets重新用于新的TCP连接,默认关闭,改为开启
net.ipv4.tcp_tw_reuse=1
#启用TCP连接中TIME-WAIT sockets的快速回收,默认关闭,改为开启
net.ipv4.tcp_tw_recycle=1
#用户向外连接的端口范围,默认32768~61000,改为1024~65000
net.ipv4.ip_local_port_range=1024 65000
#表示SYN列队的长度,默认1024,改为8192,可容纳更多处于等待状态的连接
net.ipv4.tcp_max_syn_backlog=8192
#表示系统同时保持TIME-WAIT套接字的最大数量,如果超过将立即清除,默认180000,改为5000
net.ipv4.tcp_max_tw_buckets=5000