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

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

mysql快速清除清空某表内容的方法

SQL语句如下

TRUNCATE TABLE '表名'

比delete快,同时释放了空间,不能按条件删除

delete未释放空间,可按条件删除

delete 数据可以回滚,truncate 不可恢复

vmstat输出结果详解及翻译转

Procs
-r: 运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1)
-b: 处于不可中断状态的进程数,常见的情况是由I/O引起的。

MEMORY
-swap:切换到交换内存上的内存(默认以KB为单位) 如果SWAP的值不为0,或者还比较大,比如超过100M了,但是SI,SO的值长期为0,这种情况我们可以不用担心,不会影响系统性能。
-free:p空闲的物理内存
- buff:作为buffer cache的内存,对块设备的读写进行缓冲
-cache:作为page cache的内存,文件系统的cache 如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

SWAP
-si:交换内存使用,由磁盘调入内存
-so:交换内存使用,由内存调入磁盘 内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。
我发现有些朋友看到空闲内存(FREE)很少的或接近于0时,就认为内存不够用了,实际上不能光看这一点,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO
-bi:从块设备读入的数据总量(读磁盘)(KB/S)
-bo:写入到块设备的数据总量(写磁盘)(KB/S) 随机磁盘读写的时候,这2个值越大(如超出1M),能看到CPU在IO等待的值也会越大
SYSTEM
--in:每秒产生的中断次数 --cs:每秒产生的上下文切换次数 上面2个值越大,会看到由内核消耗的CPU时间会越大
CPU
-us:用户进程消耗的CPU时间百分 us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速(比如PHP/PERL)
-sy:内核进程消耗的CPU时间百分比(sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因)
-wa:IO等待消耗的CPU时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

-id:CPU处于空闲状态时间百分比
 情景分析: vmstat的输出哪些信息值得关注?
--proc r:运行的进程比较多,系统很繁忙
--IO bo:磁盘写的数据量稍大,如果大文件的写,10以内基本不用担心,如果是小文件2M以前基本正常,
--CPU us:持续大于50,服务高峰期可以接受
--CPU wa:稍微有些同 --CPU id:持续小于50,服务高峰期可以接受

TOP命令:
 这个命令可以查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等。它是检查系统进程运行状况最方便的工具了。它默认显示部分活动的进程,并按照进程使用CPU的多少排序,

top参数:
-D 不可中断休眠,通常是IO操作处的状态
-R 正在执行的或者处在等街待的进程队列中
-S 休眠中
-T 暂停刮起的
-Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而被INIT进程接管进行销毁。
-W 没有使用物理内存,所占用的物理内存被切换到交换内存

Linux CentOS上安装XEN及虚拟机转

 

 

----------------------

举例:安装一个半虚拟化客户机,512MB 内存,5G 磁盘,通过使用http提供的安装树,要求使用 text-only 模式。

# virt-install --paravirt --name rhel5u4 --ram 512 --file /var/lib/xen/images\/rhel5u4.img -file-size 6 --nographics --location http://192.168.0.254/rhel5u4

以下是一些安装命令的举例:

#virt-install --name rhel5u4 --ram 512 --file=/var/lib/libvirt/images/rhel5u4 \
.img --file-size=3 --vnc --cdrom=/var/lib/libvirt/images/rhel5u4.iso --network\ \network=default

#virt-install -p -n rhel5u4 -r 512 -f /var/lib/libvirt/images/rhel5u4.img -s 3 \ –vnc --cdrom=/var/lib/libvirt/images/rhel5u4 .iso -w network=default

#virt-install -p -n rhel5u4 -r 512 -f /var/lib/libvirt/images/rhel5u4.img -s 3\
–vnc -l http://192.168.0.254/rhel5u4 -w network=default

#virt-install -p -n rhel5u4 -r 512 -f /var/lib/libvirt/images/rhel5u4.img -s 3 \
–vnc --location=http://192.168.0.2/rhel5u4 -x ks=http://192.168.122.1/ks.cfg -w \
network=default

#virt-install -p -n rhel5u4 -r 512 -f /var/lib/libvirt/images/rhel5u4 .img -s 3 \
--vnc -l http://192.168.0.254/rhel5u4 ---extra-args='ks=http://192.168.122.1 \
ks.cfg' -w network=default

常用参数介绍:

-n NAME, --name=NAME             指定 Guest 名字

-r MEMORY, --ram=MEMORY          指定内存大小

 -u UUID, --uuid=UUID            指定 uuid 号
                                 可以使用 uuidgen 命令来产生 uuid:
                                 # uuidgen
                                 a89a3751-3555-4be5-8157-5e205ddba5bb
                                 或者使用如下命令:
                                 # echo 'import virtinst.util ; print\
                                 virtinst.util.uuidToString(virtinst.util.randomUUID())' | python
                                 4217ef56-b0d9-071d-6157-c98d0e6d240a
--vcpus=VCPUS           指定虚拟机的 CPU 数量

 -p, --paravirt         指定客户机为半虚拟化 Guest

 -f DISKFILE, --file=DISKFILE     虚拟机的虚拟磁盘,磁盘可以是文件、磁盘分区或者是

                                  lvm。此选项用来指定虚拟磁盘的路径
-s DISKSIZE, --file-size=DISKSIZE      指定虚拟磁盘的大小,单位是 G;如果—file 指定

                                       的文件路径不存在,并且—nonsparse 选项没有指
                                       定,对这个文件不会预先分配存储空间。
-w NETWORK, --network=NETWORK     NETWORK 有三种选择,bridge:BRIDGE ,

                                       network:NAME 和 user
-c CDROM, --cdrom=CDROM           指定用于全虚拟化 Guest 的虚拟 CD,可以是一个 ISO 镜
                                  像文件,也可以是一个 CDROM 设备,也可以是一个通
                                  过 URL 可以访问和获取到的 boot.iso 镜像。如果将其忽
                                  略,那么在—location 选项中必须指定 kernel 和 initrd
                                  的位置,也可以使用—pxe 参数通过网络进行安装。
--pxe                             使用 PXE boot 协议来加载初始化的 ramdisk 和 kernel,
                                  以便于启动 Guset 段的安装进进程。如果没有指定—pxe,那么
                                  就必须指定—cdrom 和--location 其中一个。
-l LOCATION, --location=LOCATION   指定 kernel 和 initrd 的安装源,这对于半虚拟化是
                                   必须的。对于全虚拟化,要么使用--location 要么使用
                                   --cdrom 来指定 ISO 或 CDROM 镜像。其必须符合下面的
                                   四种格式:
                                   DIRECTORY
                                   nfs:host:/path
                                   http://host/path
                                   ftp://host/path
-x EXTRA, --extra-args=EXTRA      用来给加载的 kernel 和 initrd 提供额外的内核命令行参
                                  数。
(跟详细的参数及使用方法详见 man virt-install)

XEN是目前Linux上的最佳的虚拟化解决方案,特别适合于服务器应用,如用于将多个服务器合并到一台物理服务器上,以节省运营成本(机房空间、电力消耗);或者是出于安全角度的考虑,需要将不同的应用进行分区,以便降低安全风险等。

名词:
完全虚拟化(Full Virtualization):full virtualized
半虚拟化(Para Virtualization):paravirtualized

查看CPU对虚拟化的支持程度:
Intel和AMD的半虚拟化支持标识 - PAE
# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss nx constant_tsc pni ssse3

Intel全虚拟化支持标识 - VMX
# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm

AMD全虚拟化支持标识 - SVM
# cat /proc/cpuinfo | grep flags
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8legacy 3dnowprefetch ts fid vid ttp tm stc 100mhzsteps

XEN的运行环境:Domain-0与Domain-U
Domain-0即虚拟母机或称为宿主机,与Linux主机为同一系统,以XEN的Linux内核启动的主机,负责管理和控制客户机。
Domain-U即虚拟客户机或称VPS,在Domain-0上可以建立多个虚拟客户机。
Domain-0与Domain-U的区别就是Domain-0是虚拟机,Domain-U是虚拟机上的操作系统。用过Windows上VMWare的可以把Domain-0理解为VMWare软件,Domain-U则是运行在VMWare上的操作系统。

XEN的运行方式:
XEN分成多个层级 (layer) 执行。它将Linux的核心修改后,再使用修改过的核心开机,而开机后先载入XEN的监控器 (Hypervisor) , 并且启动第一个操作系统,称为domain-0。在Xen上面所谓的一个domain就是指一个虚拟机。

Domain-0之所以要先被载入是因为Domain-0含有其他虚拟机启动所必须的控制指令,并且domain-0也是控制虚拟装置的重要主控系统。在domain-0上最重要的就是一个xend的常住进程,其他的domain都是由这个xend来管理的。至於命名方面,除了domain-0之外的其他虚拟机就依序被称为domain-1, domain-2等等, 我们统称为domain-U。

Domain-0是很重要的,因为它直接控制Xen的监控器(Hypervisor),而且掌握了真实的Linux驱动程序 (drivers)。而其他的虚拟机(domain-U)则是透过Xen监控器来与真实的硬件以及domain-0进行交互。为了让domain-0能够与Xen结合,我们必须要修改domain-0的核心才能顺利运行。并且需要使用domain-0的核心来开机才可以。domain-0是所有虚拟机的基础,所以它可以尽量简洁,其他的个别服务则可以放置到不同的domain中。

xend可以管理domain-0与其他domain之间的启动与交互,提供一个终端控制 (console) 界面来让 domain-0 登入其他的 domain。

XEN的安装:
在CentOS(5.4)上安装XEN
首先确认XEN是否已经安装
# yum grouplist
如果Virtualization位于Available Groups而非Installed Groups里则说明XEN并未安装在系统中

安装命令有两种,任选其一,效果是一样的
安装方式一
# yum -y install xen <开始安装XEN>
安装方式二
# yum groupinstall Virtualization -y <开始安装XEN>

安装完成后编辑/etc/grub.conf修改开机启动顺序,将default=1修改为改default=0,以XEN的Linux核心为默认启动系统

安装完成,重启。

运行
# xm list
Name                                      ID Mem(MiB) VCPUs      State   Time(s)
Domain-0                                   0      491        2          r-----   7797.5
显示以上内容表示安装无误,Domain-0正常启动运行。

安装客户机 - Domain-U:
半虚拟化安装客户机操作系统CentOS(5.4)

首先为虚拟机创建磁盘并进行格式化

创建磁盘:
# dd if=/dev/zero of=/home/vm01 bs=4096 seek=1024k count=0

参数说明:
if 文件输入位置
of 创建磁盘文件
bs 设置磁盘大小
seek 描述 bs 每一块的单位
count 复制的块数

将磁盘文件格式化为ext3文件格式:
# mkfs -t ext3 /home/vm01

关闭防火墙使用NFS作为安装源:
一般防火墙是默认打开的,如果防火墙已经打开且开放了NFS服务则不需要关闭防火墙
# /etc/init.d/iptables stop <关闭防火墙>

挂载操作系统:
# mkdir /tmp/os
# mount /dev/cdrom /tmp/os

启动NFS服务:
# service nfs start

开放NFS服务的目录:
编辑 /etc/exports 添加一行 /tmp/os         192.168.1.*(ro) ,注意根据个人情况修改IP
激活
# exportfs -rv

开始安装:
#virt-install -n domain01 -r 512 --vcpus=2 -p -f /home/vm01 --nographics -l /tmp/os
进入安装选项->选择语言->选择NFS方式安装->选择IPV4 DHCP ->输入主机ip[192.168.1.1]->输入目录[/tmp/os]
选择TEXT安装模式,以后的安装过程和正常安装CentOS没有区别

安装程序参数列表:
-n 设置虚拟主机名
-r 设置虚拟主机内存 这里设置的是512M
--vcpus 设置cpu个数
-f 设置虚拟主机的磁盘位置
--nographics 不使用图形界面安装
-l 设置系统安装源的位置
-p 半虚拟化客户机
-c 用于全虚拟化的虚拟CD,可以是一个ISO镜像文件或CDROM设备或URL可以访问的boot.iso镜像

将虚拟主机加入开机自动启动:
# chkconfig --add xendomains
# ln -s /etc/xen/domain01 /etc/xen/auto/domain01 <放在auto目录中的虚拟主机会开机自启动>

xendomains服务器的启动/停止/重启/状态查询命令:
一般的情况下,xend服务器启动了,xendomains也会自动启动。

# /etc/init.d/xend start 启动xend
# /etc/init.d/xend stop 停止xend
# /etc/init.d/xend restart 重启xend
# /etc/init.d/xend status 查看xend状态

# /etc/init.d/xendomains start 启动xendomains
# /etc/init.d/xendomains stop 停止xendomains
# /etc/init.d/xendomains restart 重启xendomains
# /etc/init.d/xendomains status 查看xendomains状态

XEN控制虚拟主机的常用命令:
虚拟主机列表
# xm list

关闭虚拟主机,domain01为虚拟主机名,也可用id代替
# xm shutdown domain01

启动一个虚拟主机,domain01为虚拟主机名
# xm create domain01

通过-c 参数调用 console 启动并跟踪虚拟主机状态
# xm create domain01 -c

显示虚拟机的控制台
# xm console domain01

重起虚拟机
# xm reboot domain01

销毁并立即停止虚拟机,类似关掉电源一样关机
# xm destroy domain01

存储正在运行的虚拟操作系统的状态
# xm save domain01 <File>

唤醒虚拟操作系统
# xm restore <File>

暂停正在运行的虚拟操作系统
# xm pause domain01

激活停止的虚拟操作系统
# xm unpause domain01

调整虚拟平台/虚拟操作系统的占用内存
# xm mem-set domain01  128

调整虚拟平台及虚拟操作系统的虚拟CPU个数
# xm vcpu-set domain01 2

查看虚拟系统运行的状态
# xm top

# xentop

常见错误描述及解决办法

通过http或NFS安装客户机操作系统出现 Unable to retrieve 错误:....
多数原因是防火墙造成的,如果使用http安装方式时可以先停止防火墙,也可以采用以下方式解决
通过/etc/init.d/iptables status命令查询是否有打开80端口
或通过 sudo netstat -antup  命令查看网络端口状态
修改vi /etc/sysconfig/iptables添加以下代码开放80端口:
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
执行 /etc/init.d/iptables restart 激活操作

出现类似下面的错误:
POST operation failed: xend_post: error from xen daemon: (xend.err 'Error creating domain: I need 262144 KiB, but dom0_min_mem is 262144 and shrinking to 262144 KiB would leave only 244672 KiB free.')
说明新增的虚拟主机内存设置过高了,需要调小些

nginx discuz7.2伪静态

rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last;
rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last;
rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last;
rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last;
rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;