联通电信智能DNS(BIND)配置

本次主要学习通过BIND 9的view功能实现不同地址解析不同的IP,即智能DNS。首先安装BIND9,不懂的请看BIND DNS服务器的安装与主从DNS配置的安装部分安装。

acl文件配置

在配置智能DNS之前,我们需要获取联通电信最新的IP段,并制作成acl文件,这里提供直接提供文件下载,并上传到主从两台dns的/usr/local/bind/etc/目录下。
电信:CHINANET.acl
联通:CNC.acl
当然如果你想获取更新的IP段,可以根据这个脚本实现。http://devops.webres.wang/2012/02/automatic-get-unicom-chinanet-new-ip-ranges/

主DNS配置

named.conf配置

首先生成一个控制key,和三个用于主从同步的key。

  1. rndc-confgen -a
  2. rndc-confgen -a -c /etc/cnc.key -k cnc
  3. rndc-confgen -a -c /etc/chinanet.key -k chinanet
  4. rndc-confgen -a -c /etc/any.key -k any

并也把生成的/etc/cnc.key,/etc/chinanet.key和/etc/any.key传到从服务器。
然后创建named.conf。

  1. vi /usr/local/bind/etc/named.conf

写入如下代码:

  1. include "/etc/rndc.key";//加载rndc.key用于rndc命令
  2. //下面加载的三个key文件用在三个视图里的zone的主从同步。
  3. include "/etc/cnc.key";
  4. include "/etc/chinanet.key";
  5. include "/etc/any.key";
  6. controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndckey"; }; };//定义controls以能使用rndc命令管理bind。
  7. include "/usr/local/bind/etc/CNC.acl"; //cnc acl
  8. include "/usr/local/bind/etc/CHINANET.acl"; //chinanet acl
  9. //定义bind日志
  10. logging {
  11. channel default_syslog { syslog local2; severity notice; };
  12. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  13. category default { default_syslog; };
  14. category general { default_syslog; };
  15. category security { audit_log; default_syslog; };
  16. category config { default_syslog; };
  17. category resolver { audit_log; };
  18. category xfer-in { audit_log; };
  19. category xfer-out { audit_log; };
  20. category notify { audit_log; };
  21. category client { audit_log; };
  22. category network { audit_log; };
  23. category update { audit_log; };
  24. category queries { audit_log; };
  25. category lame-servers { audit_log; };
  26. };
  27. options {
  28.     directory "/usr/local/bind/etc";
  29. pid-file "/usr/local/bind/var/run/bind.pid";
  30. transfer-format many-answers;
  31. interface-interval 0;
  32. allow-query { any; };
  33. };
  34.  
  35. view "view_CNC" {
  36. match-clients { key cnc;CNC; };//匹配带key cnc或CNC里的IP段
  37. server 23.19.81.194 {keys cnc;}; //向从服务器发送消息时,用 cnc 加密
  38. zone "qbtop.com" {
  39. type master;
  40. file "qbtop.com.cnc.zone";
  41. allow-transfer { key cnc; };//只允许用 cnc加密过的 zone transfer 请求
  42. };
  43. };
  44.  
  45. view "view_CHINANET" {
  46. match-clients { key chinanet;CHINANET; };
  47. server 23.19.81.194 {keys chinanet;};
  48. zone "qbtop.com" {
  49. type master;
  50. file "qbtop.com.chinanet.zone";
  51. allow-transfer { key chinanet; };
  52. };
  53. };
  54.  
  55. view “view_any” {
  56. match-clients { key any;any; };
  57. server 23.19.81.194 {keys any;};
  58. zone "qbtop.com" {
  59. type master;
  60. file "qbtop.com.any.zone";
  61. allow-transfer { key any; };
  62. };
  63. };

zone文件配置

分别在/usr/local/bind/etc/目录下创建三个文件,qbtop.com.cnc.zone,qbtop.com.chinanet.zone,qbtop.com.any.zone,分别对应联通zone,电信zone和其它zone。
zone内容如下,唯一区别的是IP的不同。

  1. $TTL 3600
  2. @ IN SOA ns1.qbtop.com. hostmaster.qbtop.com. (
  3. 2012022301  ; Serial
  4. 3600 ; Refresh
  5. 900 ; Retry
  6. 3600000 ; Expire
  7. 3600 ) ; Minimum
  8. @ IN NS ns1.qbtop.com.
  9. @ IN NS ns2.qbtop.com.
  10. ns1 IN A 23.19.81.191
  11. ns2 IN A 23.19.81.194
  12. @   IN A 1.1.1.1
  13. www IN A 1.1.1.1

从DNS配置

创建目录slaves

  1. mkdir /usr/local/bind/etc/slaves

创建named.conf文件。

  1. vi /usr/local/bind/etc/named.conf

写入如下代码:

  1. include "/etc/cnc.key";
  2. include "/etc/chinanet.key";
  3. include "/etc/any.key";
  4. include "/usr/local/bind/etc/CNC.acl";  //cnc acl
  5. include "/usr/local/bind/etc/CHINANET.acl"; //chinanet acl
  6. logging {
  7. channel default_syslog { syslog local2; severity notice; };
  8. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  9. category default { default_syslog; };
  10. category general { default_syslog; };
  11. category security { audit_log; default_syslog; };
  12. category config { default_syslog; };
  13. category resolver { audit_log; };
  14. category xfer-in { audit_log; };
  15. category xfer-out { audit_log; };
  16. category notify { audit_log; };
  17. category client { audit_log; };
  18. category network { audit_log; };
  19. category update { audit_log; };
  20. category queries { audit_log; };
  21. category lame-servers { audit_log; };
  22. };
  23. options {
  24.     directory "/usr/local/bind/etc";
  25. pid-file "/usr/local/bind/var/run/bind.pid";
  26. transfer-format many-answers;
  27. interface-interval 0;
  28. allow-query { any; };
  29. };
  30.  
  31. view "view_CNC" {
  32. match-clients { key cnc;CNC; };
  33. server 23.19.81.191 {keys cnc;};
  34. zone "qbtop.com" {
  35. type slave;
  36. file "slaves/qbtop.com.cnc.zone";
  37. masters { 23.19.81.191; };
  38. };
  39. };
  40.  
  41. view "view_CHINANET" {
  42. match-clients { key chinanet;CHINANET; };
  43. server 23.19.81.191 {keys chinanet;};
  44. zone "qbtop.com" {
  45. type slave;
  46. file "slaves/qbtop.com.chinanet.zone";
  47. masters { 23.19.81.191; };
  48. };
  49. };
  50.  
  51. view “view_any” {
  52. match-clients { key any;any; };
  53. server 23.19.81.191 {keys any;};
  54. zone "qbtop.com" {
  55. type slave;
  56. file "slaves/qbtop.com.any.zone";
  57. masters { 23.19.81.191; };
  58. };
  59. };

至此,联通电信主从智能DNS已经配置完成,你可以使用如下多线路ping工具检测:
http://ping.chinaz.com/
http://www.webkaka.com/Ping.aspx
http://17ce.com/
http://ping.aizhan.com/

自动获取联通电信最新IP段

如果需要做联通电信的智能DNS,必然需要知道这两个ISP分配到的IP段。我们可以通过apnic下载完整的IP段,再查询IP的whois,再根据各运营商的关键词(如联通的netname是unicom,电信是chinanet或telecom)筛选出IP段。
下面是实现这一功能的脚本:
在执行脚本之前先安装jwhois,bc

  1. yum install jwhois bc
  1. #!/bin/sh
  2. FILE=/root/apnic/ip_apnic
  3. rm -f $FILE
  4. wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE
  5. grep ‘apnic|CN|ipv4|’ $FILE | cut -f 4,5 -d’|’|sed -e ‘s/|/ /g’ | while read ip cnt
  6. do
  7. echo $ip:$cnt
  8.         mask=$(cat << EOF | bc | tail -1
  9. pow=32;
  10. define log2(x) {
  11. if (x<=1) return (pow);
  12. pow–;
  13. return(log2(x/2));
  14. }
  15. log2($cnt)
  16. EOF)
  17.        echo $ip/$mask>> cn.net
  18. if whois [email protected] | grep -i ".*chinanet.*|.*telecom.*">/dev/null;then
  19. echo $ip/$mask >> chinanet
  20. elif whois [email protected] | grep -i ".*unicom.*">/dev/null;then
  21. echo $ip/$mask >> unicom
  22. else
  23. echo $ip/$mask >> others
  24. fi
  25. done

直接执行这脚本就会开始进行IP段筛选,这需要一定的时间,等完成后会在当前目录下生成三个文件unicom,chinanet,others。
下面提供联通电信ip段acl文件:
电信:CHINANET.acl
联通:CNC.acl
脚本参考:http://bbs.chinaunix.net/thread-577601-1-1.html

LVM的安装和使用方法

LVM简介

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是一种磁盘管理工具,最主要的功能就是可以随时在线调整分区的大小,解决了安装Linux系统时需要评估分区大小的烦恼。

LVM相关术语

物理存储介质(The physical media)
这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。
物理卷(physical volume)
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(Volume Group)
LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
逻辑卷(logical volume)
LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。
PE(physical extent)
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
LE(logical extent)
逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
下面的图示有助于理解:
系统管理

LVM的安装

加载device-mapper模块

从linux内核2.6.9开始,device-mapper模块就已经包含在内,所以你只需加载即可。
加载mapper模块:

  1. modprobe dm_mod

查看是否已经加载:

  1. lsmod | grep dm_mod

出现如下输出,即表示加载成功:

  1. dm_mod                 63097  4 dm_mirror,dm_multipath,dm_raid45,dm_log

如果你的内核高于2.6.9却没有此模块,可以使用yum install device-mapper命令安装。
如果你的内核低于2.6.9,则需要编译安装device-mapper模块,地址ftp://sources.redhat.com/pub/dm/

LVM2安装

直接yum安装:

  1. yum install lvm2

LVM的使用

创建PV(物理卷)

这个阶段有几个可用命令:
pvcreate :将实体partition创建成为PV;
pvscan :搜索目前系统里面任何具有PV的磁盘或分区;
pvdisplay :显示出目前系统上面的PV状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
1、在磁盘上创建PV

  1. pvcreate /dev/hdb

2、在分区上创建PV
在分区上创建PV,首先得使用fdisk设置分区类型为8e。然后执行以下命令:

  1. pvcreate /dev/hdb1

创建VG(卷组)

这一阶段有如下命令:
vgcreate :创建vg命令;
vgscan :搜索系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;
vgextend :在 VG 内添加额外的 PV ;
vgreduce :在 VG 内移除 PV;
vgchange :配置 VG 是否启动 (active);
vgremove :删除一个 VG
把物理卷/dev/hda1和/dev/hdb1添加进my_volume_group卷组:

  1. vgcreate myvg /dev/hda1 /dev/hdb1

创建LV(逻辑卷)

LV阶段几个命令:
lvcreate :创建 LV
lvscan :查询系统上面的 LV ;
lvdisplay :显示系统上面的 LV 状态
lvextend :在 LV 里面添加容量!
lvreduce :在 LV 里面减少容量;
lvremove :删除一个 LV !
lvresize :对 LV 进行容量大小的调整!

  1. [root@www ~]# lvcreate [-L N[mgt]] [-n LV名称] VG名称
  2. [root@www ~]# lvcreate [-l N] [-n LV名称] VG名称
  3. 选项与参数:
  4. -L  :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,
  5.       因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
  6. -l  :后面可以接 PE 的『个数』,而不是容量。若要这么做,得要自行计算 PE 数。
  7. -n  :后面接的就是 LV 的名称。
  8. 更多的说明应该可以自行查阅! man lvcreate

在myvg创建1500M,名称为mylv的LV:

  1. lvcreate -L 1500M -n mylv myvg

在myvg创建一个名称为mylv,PE个数为100的LV:

  1. lvcreate -l 100 -n mylv myvg

格式化并挂载LV

我们格式化成为ext3,并挂载到/mylv目录

  1. mkdir /mylv
  2. mkfs -t ext3 /dev/my_volume_group/mylv
  3. mount /dev/my_volume_group/mylv /mylv

通过df -h检查发现,/dev/my_volume_group/mylv已经成功挂载到/mylv目录。

LVM其它功能

删除一个vg

停止vg:

  1. vgchange -a n my_volume_group

删除vg:

  1. vgremove my_volume_group

添加pv到vg

  1. vgextend my_volume_group /dev/hdc1

从vg中删除pv

使用pvdisplay命令确保pv不被lv使用:

  1. # pvdisplay /dev/hda1
  2.  
  3. — Physical volume —
  4. PV Name               /dev/hda1
  5. VG Name               myvg
  6. PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]
  7. PV#                   1
  8. PV Status             available
  9. Allocatable           yes (but full)
  10. Cur LV                1
  11. PE Size (KByte)       4096
  12. Total PE              499
  13. Free PE               0
  14. Allocated PE          499
  15. PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7

如果pv已经被使用,需要使用pvmove命令把pv的数据迁移到另外空闲的pv。
然后使用vgreduce命令删除pv:

  1. vgreduce my_volume_group /dev/hda1

删除一个LV

  1. # umount /dev/myvg/homevol
  2. # lvremove /dev/myvg/homevol
  3. lvremove — do you really want to remove "/dev/myvg/homevol"? [y/n]: y
  4. lvremove — doing automatic backup of volume group "myvg"
  5. lvremove — logical volume "/dev/myvg/homevol" successfully removed

扩展LV容量

扩展lv容量到12G:

  1. # lvextend -L12G /dev/myvg/homevol
  2. lvextend — extending logical volume "/dev/myvg/homevol" to 12 GB
  3. lvextend — doing automatic backup of volume group "myvg"
  4. lvextend — logical volume "/dev/myvg/homevol" successfully extended

增加LV容量1G:

  1. # lvextend -L+1G /dev/myvg/homevol
  2. lvextend — extending logical volume "/dev/myvg/homevol" to 13 GB
  3. lvextend — doing automatic backup of volume group "myvg"
  4. lvextend — logical volume "/dev/myvg/homevol" successfully extended

下一步还需要修改文件系统的大小:
对于ext2/ext3格式的文件系统:

  1. # umount /dev/myvg/homevol
  2. # resize2fs /dev/myvg/homevol
  3. # mount /dev/myvg/homevol /home

对于reiserfs格式的文件系统:
在线扩展:

  1. # resize_reiserfs -f /dev/myvg/homevol

离线扩展:

  1. # umount /dev/myvg/homevol
  2.  # resize_reiserfs /dev/myvg/homevol
  3.  # mount -treiserfs /dev/myvg/homevol /home

缩小LV容量

对于ext2/ext3格式的文件系统:

  1. umount /mylv
  2. e2fsck -f /dev/my_volume_group/mylv
  3. resize2fs /dev/my_volume_group/mylv 800M
  4. lvreduce -L -200M /dev/my_volume_group/mylv
  5. mount /dev/my_volume_group/mylv /mylv

800M为减小容量后最终的大小。
对于reiserfs格式的文件系统:

  1. # umount /home
  2. # resize_reiserfs -s-1G /dev/myvg/homevol
  3. # lvreduce -L-1G /dev/myvg/homevol
  4. # mount -treiserfs /dev/myvg/homevol /home

参考:http://www.tldp.org/HOWTO/LVM-HOWTO/

DRBD编译安装与配置

DRBD介绍

DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。 DRBD Logo数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)。DBRD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。DBRD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。

DRBD编译安装

安装所需依赖:

  1. yum -y install gcc kernel-devel kernel-headers flex

开始安装drbd,下载地址:http://oss.linbit.com/drbd/
安装用户空间工具:

  1. cd /tmp
  2. wget http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz
  3. tar xzf drbd-8.4.1.tar.gz
  4. cd drbd-8.4.1
  5. ./configure –prefix=/usr/local/drbd –with-km
  6. make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
  7. make install
  8. mkdir -p /usr/local/drbd/var/run/drbd
  9. cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
  10. chkconfig –add drbd
  11. chkconfig drbd on

安装drbd模块:

  1. cd drbd
  2. make clean
  3. make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
  4. cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
  5. depmod

注:usr/src/kernels/2.6.18-274.18.1.el5-i686/这个内核源码树路径需要根据自己的系统修改。

DRBD配置

建立分区

假如现在有第二块硬盘hdb,两个node都要分区。

  1. #fdisk /dev/hdb                                                      //准备为 hdb 建立分区
  2.  The number of cylinders for this disk is set to 20805.
  3.  There is nothing wrong with that, but this is larger than 1024,
  4.  and could in certain setups cause problems with:
  5.  1) software that runs at boot time (e.g., old versions of LILO)
  6.  2) booting and partitioning software from other OSs
  7.    (e.g., DOS FDISK, OS/2 FDISK)
  8.  Command (m for help): n                                              //键入 n 表示要建立分区
  9.  Command action
  10.     e   extended
  11.     p   primary partition (1-4)
  12.  p                                                                    //键入 p 表示建立主要分区
  13.  Partition number (1-4): 1                                            //键入 1 为此主要分区代号
  14.  First cylinder (1-20805, default 1):                                 //开始磁柱值,按下 enter 即可
  15.  Using default value 1
  16.  Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
  17.  Using default value 20805
  18.  Command (m for help): w                                              //键入 w 表示确定执行刚才设定
  19.  The partition table has been altered!
  20.  Calling ioctl() to re-read partition table.
  21.  Syncing disks.
  22.  [root@node1 yum.repos.d]# partprobe                                  //使刚才的 partition table 变更生效

建立分区完成后使用指令 fdisk -l 确定 partition talbe 状态

  1. #fdisk -l
  2.  Disk /dev/hda: 21.4 GB, 21474754560 bytes
  3.  255 heads, 63 sectors/track, 2610 cylinders
  4.  Units = cylinders of 16065 * 512 = 8225280 bytes
  5.     Device Boot      Start         End      Blocks   Id  System
  6.  /dev/hda1   *           1          13      104391   83  Linux
  7.  /dev/hda2              14        2610    20860402+  8e  Linux LVM
  8.  Disk /dev/hdb: 10.7 GB, 10737377280 bytes
  9.  16 heads, 63 sectors/track, 20805 cylinders
  10.  Units = cylinders of 1008 * 512 = 516096 bytes
  11.     Device Boot      Start         End      Blocks   Id  System
  12.  /dev/hdb1               1       20805    10485688+  83  Linux

建立分区完成后请建立 /db 目录。 (Node1 及 Node2 都必须建立)

  1. #mkdir /db

建立drbd配置文件

主要定义两块global和resource。

  1. vi /usr/local/drbd/etc/drbd.conf

写入:

  1. include "drbd.d/global_common.conf";
  2. include "drbd.d/*.res";
  1. vi /usr/local/drbd/etc/drbd.d/global_common.conf

写入:

  1. global {
  2.   usage-count yes;
  3. }
  4. common {
  5.   net {
  6.     protocol C;
  7.   }
  8. }
  1. vi /usr/local/drbd/etc/drbd.d/r0.res

写入:

  1. resource r0 {
  2.   on node1 {
  3.     device    /dev/drbd1;
  4.     disk      /dev/hdb1;
  5.     address   192.168.1.101:7789;
  6.     meta-disk internal;
  7.   }
  8.   on node2 {
  9.     device    /dev/drbd1;
  10.     disk      /dev/hdb1;
  11.     address   192.168.1.103:7789;
  12.     meta-disk internal;
  13.   }
  14. }

设置hostname

根据上面的resource配置文件,需要对192.168.1.101和192.168.1.103分别设置hostname为node1和node2,设置方法如下:

  1. vi /etc/sysconfig/network

修改HOSTNAME为node1

  1. vi /etc/hosts

填入:

  1. 192.168.1.101 node1
  2. 192.168.1.103 node2

使node1 hostnmae临时生效

  1. hostname node1

node2机器设置类似。

设置resource

以下操作需要在node1和node2操作。

  1. #modprobe drbd                                    //载入 drbd 模块
  2. #lsmod|grep drbd                                  //确认 drbd 模块是否载入
  3.  drbd                  228528  0
  4.  #dd if=/dev/zero of=/dev/hdb1 bs=1M count=100     //把一些资料塞到 hdb 內 (否则 create-md 时有可能会出现错误)
  5.  #drbdadm create-md r0                             //建立 drbd resource
  6.  #drbdadm up r0                                  //启动 resource r0

查看node1和node2的状态应该类似下面的:

  1. cat /proc/drbd
  1. version: 8.4.1 (api:1/proto:86-100)
  2. GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by [email protected], 2012-02-12 06:05:36
  3.  m:res  cs         ro                   ds                         p  mounted  fstype
  4.  0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C

表明现在已经启动服务,但还没有设置同步(即需要设置Primary Node)

设置Primary Node

以下操作仅在node1执行。
设置node1为primary node:

  1. drbdadm primary –force r0

再次查看node1的状态:

  1. #cat /proc/drbd
  2. version: 8.4.1 (api:1/proto:86-100)
  3. GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by [email protected], 2012-02-12 06:47:37
  4.  
  5.  1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
  6.     ns:52892 nr:0 dw:0 dr:52892 al:0 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

我们看到状态已经变成Primary/Secondary,即设置primary node成功。

创建DRBD文件系统

以下操作仅在node1执行。
上面已经完成了/dev/drbd1的初始化,现在来把/dev/drbd1格式化成ext3格式的文件系统。

  1. #mkfs.ext3 /dev/drbd1

然后将/dev/drbd1挂载到之前创建的/db目录。

  1. #mount /dev/drbd1 /db

现在你只要把数据写入/db目录,drbd即会立刻把数据同步到备机192.168.1.103的/dev/hdb1分区上。

drbd同步测试

当在备机node2启动drbd时,它是无法挂载/dev/hdb1分区的,我们可以尝试写些数据到node1的目录/db上,然后停止node2的drbd。

  1. drbdadm down r0

之后就可以把node2的/dev/hdb1挂载到目录/db

  1. mount -t ext3 /dev/hdb1 /db

我们就可以查看node2的/db目录是否有node1的数据。

手动切换主备机

我们可以把node1改变为备机,而node2改变为主机。
在node1上操作:

  1. umount /dev/drbd1
  2. drbdadm secondary r0

在node2上操作:

  1. drbdadm primary r0

此时应该已经切换成功。
如果配置过程中出现错误,可以参考http://devops.webres.wang/2012/02/drbd-erros-faq/

配置DRBD出现错误总结

Q1.’ha’ ignored, since this host (node2.webres.wang) is not mentioned with an ‘on’ keyword.?

Error Meaage:

执行指令 drbdadm create-md ha 时出现如下错误信息

  1. ‘ha’ ignored, since this host (node2.webres.wang) is not mentioned with an ‘on’ keyword.
  2. Ans:

因为在 drbd 设定 drbd.conf 中 on 本来写的是 node1、node2 而以,将node1和node2分别改为node1.webres.wang,node2.webres.wang。

Q2.drbdadm create-md ha: exited with coolcode 20?

Error Meaage:

执行指令 drbdadm create-md ha 时出现如下错误信息

  1. open(/dev/hdb1) failed: No such file or directory
  2.  Command ‘drbdmeta 0 v08 /dev/hdb1 internal create-md’ terminated with exit coolcode 20
  3.  drbdadm create-md ha: exited with coolcode 20

Ans:

因为忘了执行 fdisk /dev/hdb 指令建立分割区所造成,如下将 /dev/hdb 建立分割区后指令即可正常执行

#fdisk /dev/hdb //准备为 hdb 建立分割区
The number of cylinders for this disk is set to 20805.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n //键入 n 表示要建立分割区
Command action
e extended
p primary partition (1-4)
p //键入 p 表示建立主要分割区
Partition number (1-4): 1 //键入 1 为此主要分割区代号
First cylinder (1-20805, default 1): //开始磁柱值,按下 enter 即可
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
Using default value 20805
Command (m for help): w //键入 w 表示确定执行刚才设定
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@node1 yum.repos.d]# partprobe //使刚才的 partition table 变更生效
Q3.drbdadm create-md ha: exited with coolcode 40?

Error Meaage:

执行指令 drbdadm create-md ha 时出现如下错误信息

  1. Device size would be truncated, which
  2.  would corrupt data and result in
  3.  ‘access beyond end of device’ errors.
  4.  You need to either
  5.     * use external meta data (recommended)
  6.     * shrink that filesystem first
  7.     * zero out the device (destroy the filesystem)
  8.  Operation refused.
  9.  Command ‘drbdmeta 0 v08 /dev/hdb1 internal create-md’ terminated with exit coolcode 40
  10.  drbdadm create-md ha: exited with coolcode 40

Ans:

使用 dd 指令将一些资料塞到 /dev/hdb 后再执行 drbdadm create-md ha 指令即可顺利执行

#dd if=/dev/zero of=/dev/hdb1 bs=1M count=100
Q4.DRBD 状态始终是 Secondary/Unknown?

Error Meaage:

  1. Node1、Node2 主机启动 DRBD 后状态始终是 Secondary/Unknown

#service drbd status
drbd driver loaded OK; device status:
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16
m:res cs ro ds p mounted fstype
0:ha WFConnection Secondary/Unknown Inconsistent/DUnknown C
Ans:

1、Node1、Node2 没有打开相对应的 Port,请开启相对应的 Port 或先把 IPTables 服务关闭即可。
2、可能发生了脑裂行为,一般出现在ha切换时,解决方法:
在一节点执行:
drbdadm secondary resource
drbdadm connect –discard-my-data resource
另一节点执行:
drbdadm connect resource
Q5.1: Failure: (104) Can not open backing device

Error Meaage:
执行drbdadm up r0时出现:

  1. 1: Failure: (104) Can not open backing device.
  2. Command ‘drbdsetup attach 1 /dev/sdb1 /dev/sdb1 internal’ terminated with exit code 10

Ans:
可能因为你挂载了/dev/sdb1,执行umount /dev/sdb1即可。

Linux下脚本上传文件到dropbox

这里介绍一个可以上传文件到dropbox的脚本。不用安装,直接运行即可把文件上传到dropbox。
脚本地址:https://github.com/andreafabrizi/Dropbox-Uploader
也可以在本站直接下载:dropbox_uploader.sh
脚本使用方法:
语法:./dropbox_uploader.sh [OPTIONS]…
选项:-u [USERNAME] dropbox用户
-p [PASSWORD] dropbox密码
-f [FILE/FOLDER] 待上传的文件
-d [REMOTE_FOLDER] dropbox的目录,默认是 “/”
-v 返回详细进程模式
例子:
./dropbox_uploader.sh -u [email protected] -f /etc/passwd -v
./dropbox_uploader.sh -u [email protected] -f /var/backup/ -v
也可以在dropbox_uploader.sh文件填写好用户和密码,之后运行脚本时就不用再定义用户和密码。

使用AWStats分析Nginx和Apache日志

AWStats简介

Awstats是一个免费非常简洁而且强大有个性的统计工具。它可以统计您站点的如下信息:
   一:访问量,访问次数,页面浏览量,点击数,数据流量等
   二:精确到每月、每日、每小时的数据
   三:访问者国家
   四:访问者IP
   五:Robots/Spiders的统计
   六:纺客持续时间
   七:对不同Files type 的统计信息
   八:Pages-URL的统计
   九:访客操作系统浏览器等信息
   十:其它信息(搜索关键字等等)

下面我们来在CentOS配置AWStats来分析Nginx和Apache日志。

AWStats安装

  1. cd /tmp
  2. wget http://prdownloads.sourceforge.net/awstats/awstats-7.0.tar.gz
  3. tar xzf awstats-7.0.tar.gz
  4. mv awstats-7.0 /usr/local/awstats
  5. cd /usr/local/awstats/tools
  6. mkdir /etc/awstats /var/lib/awstats

AWStats配置

执行awstats_configure.pl脚本进行配置。

  1. perl awstats_configure.pl

配置过程如下:
Config file path (‘none’ to skip web server setup):
none

—–> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N] ? y

—–> Define config file name to create
What is the name of your web site or profile analysis ?
Example: www.mysite.com
Example: demo
Your web site, virtual server or profile name:
> devops.webres.wang

—–> Define config file path
In which directory do you plan to store your config file(s) ?
Default: /etc/awstats
Directory path to store config file(s) (Enter for default):
> 回车

接着需要编辑配置文件awstats.devops.webres.wang.conf。

  1. vi /etc/awstats/awstats.devops.webres.wang.conf

只需要定义日志的路径,如:

  1. LogFile="/home/centos/log/access.log"

复制css和icon目录到网站根目录。

  1. cp -R /usr/local/awstats/wwwroot/css /home/www/default
  2. cp -R /usr/local/awstats/wwwroot/icon /home/www/default

手动执行命令更新日志统计数据库及生成静态文件到目录/home/www/default/awstats:

  1. /usr/local/awstats/tools/awstats_buildstaticpages.pl -config=devops.webres.wang -update -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -dir=/home/www/default/awstats

之后你就可以使用http://ip或域名/awstats/awstats.devops.webres.wang.html访问日志统计页面。
添加脚本awstats_buildstaticpages.pl到cron定时生成日志统计页面。

  1. crontab -e
  1. 58 23 * * *  /usr/local/awstats/tools/awstats_buildstaticpages.pl -config=devops.webres.wang -update -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -dir=/home/www/default/awstats

awstats_buildstaticpages.pl脚本使用说明:
语法:awstats_buildstaticpages.pl (awstats_options) [awstatsbuildstaticpages_options]
awstats_options可选参数为:
-config=configvalue:定义配置文件,如devops.webres.wang,就会搜索/etc/awstats/awstats.devops.webres.wang.conf文件。
-update :该选项定义生成静态页面之前先更新数据库。
-lang :统计页面的语言,如-lang=cn,语言为中文。
awstatsbuildstaticpages_options可选参数为:
-awstatsprog=pathtoawstatspl :定义awstats.pl路径。
-dir :定义输出静态页面的目录。
参考:http://awstats.sourceforge.net/docs/awstats_setup.html

pils.c:245: error: initialization from incompatible pointer type

编译cluster glue时出现:

  1. cc1: warnings being treated as errors
  2. pils.c:244: error: initialization from incompatible pointer type
  3. pils.c:245: error: initialization from incompatible pointer type
  4. make[2]: *** [pils.lo] Error 1
  5. make[2]: se sale del directorio
  6. `/usr/src/Heartbeat-STABLE-2-1-STABLE-2.1.4/lib/pils’
  7. make[1]: *** [all-recursive] Error 1
  8. make[1]: se sale del directorio
  9. `/usr/src/Heartbeat-STABLE-2-1-STABLE-2.1.4/lib’
  10. make: *** [all-recursive] Error 1

错误。
解决方法:
打开文件lib/pils/Makefile,删除文件里的-Werror字符。

CentOS编译安装Heartbeat

安装cluster glue

安装heartbeat之前需要安装glue。

  1. yum install autoconf automake libtool glib2-devel libxml2-devel bzip2-devel e2fsprogs-devel libxslt-devel
  2. groupadd haclient
  3. useradd -g haclient hacluster
  4. cd /tmp
  5. wget http://hg.linux-ha.org/glue/archive/glue-1.0.9.tar.bz2
  6. tar xjf glue-1.0.9.tar.bz2
  7. cd Reusable-Cluster-Components-glue–glue-1.0.9
  8. ./autogen.sh
  9. ./configure –prefix=/usr/local/heartbeat
  10. make && make install

安装Resource Agents

  1. cd /tmp
  2. wget –no-check-certificate https://github.com/ClusterLabs/resource-agents/tarball/v3.9.2
  3. tar xzf v3.9.2
  4. cd ClusterLabs-resource-agents-b735277/
  5. ./autogen.sh
  6. export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
  7. ./configure –prefix=/usr/local/heartbeat
  8. ln -s  /usr/local/heartbeat/lib/* /lib/
  9. make && make install

安装Heartbeat

  1. cd /tmp
  2. wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/7e3a82377fa8.tar.bz2
  3. tar xjf 7e3a82377fa8.tar.bz2
  4. cd Heartbeat-3-0-7e3a82377fa8/
  5. ./bootstrap
  6. export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
  7. ./configure –prefix=/usr/local/heartbeat
  8. make && make install
  9. cp doc/ha.cf /usr/local/heartbeat/etc/ha.d/
  10. cp doc/haresources /usr/local/heartbeat/etc/ha.d/
  11. cp doc/authkeys /usr/local/heartbeat/etc/ha.d/
  12. cp heartbeat/init.d/heartbeat /etc/rc.d/init.d/
  13. chkconfig –add heartbeat
  14. chkconfig heartbeat on
  15. chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys
  16. sed -i ‘s#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g’ /usr/local/heartbeat/etc/ha.d/shellfuncs
  17. sed -i ‘s#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g’ /usr/local/heartbeat/usr/lib/ocf/lib//heartbeat/ocf-shellfuncs
  18. sed -i ‘s#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g’ /usr/local/heartbeat/etc/ha.d/resource.d//hto-mapfuncs

除错

1、错误:glue_config.h:99:1: error: “HA_HBCONF_DIR” redefined
解决方法:http://devops.webres.wang/2012/02/glue_config-h991-error-ha_hbconf_dir-redefined/
2、错误configure.ac:9: error: Autoconf version 2.63 or higher is required
解决方法:http://devops.webres.wang/2012/03/configure-ac9-error-autoconf-version-2-63-or-higher-is-required/
3、错误configure.ac:63: require Automake 1.10.1, but have 1.9.6
解决方法:http://devops.webres.wang/2012/03/configure-ac63-require-automake-1-10-1-but-have-1-9-6/