keepalived+LVS+apache双机搭建高可用负载均衡web服务[原创]

keepalived程序因为他的配置简单,维护容易而广为各位linuxer使用,蚊子自然也不会放过这么好的一款软件了,关于keepalived的做lvs高可用的文章已经满google都是了,蚊子自然就不在这里赘述了。蚊子这篇文章讲述的是如何只使用两台机器使用keepalived搭建web服务的高可用和负载均衡。

之前在蚊子的《》一篇文章中,介绍了使用heartbeat,lvs和squid来搭建双机高可用负载均衡的上网服务器,有兴趣的朋友可以对比一下现在这篇和上篇。

一、试验环境

vmware6.0
linux01 192.168.211.128  CentOS release 5.3 (Final)
linux02 192.168.211.129  CentOS release 5.3 (Final)
web:httpd-2.2.3-31.el5.centos
keepalived版本:keepalived-1.1.19.tar.gz

二、安装程序

1、keepalived的安装

首先到http://www.keepalived.org/download.html下载最新的keepalived程序

# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure –prefix=/ –with-kernel-dir=/usr/src/kernels/2.6.18-128.el5-i686
# make
# make install

# cp keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived
# chmod +x /etc/init.d/keepalived
# cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived

2、web的安装

因为蚊子只是为了实现功能,所以只使用了centos自己的apache,如果默认系统没有按照httpd,使用

# yum –y install httpd

3、ipvsadm的安装

ipvsadm的安装也很简单,如果系统默认没有,则使用

# yum –y install ipvsadm

以上两个步骤在两台机器上是一样的。

三、 配置部分

1、linux01上的配置

1.1、keepalived的配置

编辑/etc/keepalived/keepalived.conf

# vi /etc/keepalived/keepalived.conf ,添加如下内容

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id linux01
}

vrrp_instance VI_1 {                               #定义一个实例
    state BACKUP                                    #设置为backup,然后通过priority控制哪台提升为主
    interface eth0
    virtual_router_id 51
    priority 100
    nopreempt                                          #在priority高的这台设置这个参数,方便当主恢复后
    advert_int 1                                        #可以自动接管
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.211.110 dev eth0 label eth0:0                #这里使用label标签启用eth0:0
    }
}

virtual_server 192.168.211.110 80 {                        #这里往下是定义LVS
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    protocol TCP

    real_server 127.0.0.1 80 {                            #其中一台是本地web服务
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 192.168.211.129 80 {             #另一台的web服务
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }  
}

1.2、web配置

web使用apache默认的配置,唯一修改的就是添加了自己的index.html文件,为了方便之后的测试

# echo “linux01”>/var/www/html/index.html

1.3、关于本机启动回环地址

众所周知,要是用lvs的dr模式,必须在realserver上启动回环地址,所以,搭建两台机器的负载均衡,当然就得在本机也启动相应的回环地址,才能实现所要的功能,脚本如下

# vi /usr/local/bin/startlo

#!/bin/sh

VIP=192.168.211.110

case "$1" in
  stop)
        # close lo:0 interface

        echo $"Close lo:0 interface"
        /sbin/route del -host $VIP dev lo:0
        /sbin/ifconfig lo:0 down
        echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
        echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
        ;;
  start)
        # start lo:0 interface

        echo $"Start lo:0 interface"
        /sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up
        /sbin/route add -host $VIP dev lo:0
        echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
        echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
        ;;
  *)
        echo $"Usage: $0 (start|stop)"
        exit 1
        ;;
esac

但由于keepalived不像heartbeat里有ldirectord来控制回环地址的启动和停止,所以我们需要人为的判断应该在哪台机器上启动回环地址,所以蚊子就写了下面的一个脚本,

# vi /usr/local/bin/check_interface

#!/bin/bash
#
#作者:蚊子
#
#脚本说明:
#本脚本用于判断当前server是否是master
#如果当前server不是master,则启动回环地址
#否则停止回环地址
#
#VIP_interface请根据自己的情况自行设定,这个是VIP接口
#lo_interface请根据自己的情况自行设定,是回环地址接口

VIP_interface="eth0:0"
lo_interface="lo:0"

i=10

while [ $i != 0 ]
do
    /sbin/ifconfig |grep $VIP_interface &>/dev/null
    retval=$?
    if [ ! $retval -eq 0 ];then
        /sbin/ifconfig |grep $lo_interface &>/dev/null
        retval=$?
        if [ ! $retval -eq 0 ];then
            /usr/local/bin/startlo start
        fi
    else
        /sbin/ifconfig |grep $lo_interface &>/dev/null
        retval=$?
        if [ $retval -eq 0 ];then
            /usr/local/bin/startlo stop
        fi
    fi
    i=10
    sleep 10
done

2、linux02上的配置

2.1、keepalived的配置

具体的配置这里就不给出了,请参考linux01上的配置,唯一的区别

A、priority的值小于linux01上值,蚊子设置为50
B、在vrrp_instance VI_1的配置中不用设置nopreempt  
C、修改realserver部分的ip为本机和另外一台server的ip地址

2.2、web的配置

apache的配置和linux01一样使用默认配置,同意是编辑默认的index.html文件

# echo “linux02”>/var/www/html/index.html

2.3、本地回环地址的设置

这部分内容和linux01上的一样,相关脚本可以拷贝过来直接使用

四、启动测试

到此,一切准备就绪就可以测试了

首先将所有需要的脚本设置可执行权限。依次启动相应的服务

A、# /etc/init.d/httpd start
B、# /usr/local/bin/check_interface &
C、# /etc/init.d/keepalived start

如果没有任何报错,说明服务已经启动,keepalived的日志存放在/var/log/messages中,如果有错误,请自行查看

测试1:当前状态下测试负载均衡情况

方法:打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换

测试2:停止linux01的keepalive,测试负载均衡情况

方法:

A、/etc/init.d/keepalived stop
然后等待几秒可以看到linux01上的lo:0地址已经启动,而linux02上的lo:0已经停止

B、打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换

测试3:开启linux01上的keepalived,观察linux01是否切换回master

方法:启动keepalived程序,使用ifconfig观察linux01上已经启动了eth0:0接口,同时lo:0接口停止,linux02上eth0;0接口停止,同时lo:0接口启动

drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据(第2版)[原创]

DRBD是一种块设备的实现,与heartbeat的搭配,被广泛用于linux下的高可用(HA)方案中,蚊子的这篇文章是建立在上一篇《drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据》之上的,对于上一篇中不足和潜在问题予以改正。如果有需要在线操作的请以这篇为准。

此篇文章还是介绍如何在已经含有数据的分区或硬盘上搭建drbd和heartbeat高可用的mysql服务。

在对含有数据的分区或硬盘建立drbd高可用的时候,请确认以下三件事。

1,所在分区或硬盘可以扩容,比如使用lvm
2,所在分区或硬盘上的文件系统支持shrinking
3,如果以上两条都不能满足,请使用外部metadata

蚊子这里使用的是第一种方法,具体请接着往下看

测试环境:

Vmware6.0
             linux01 192.168.211.128  /dev/VG/data分区,存放数据库文件,320M
             linux02 192.168.211.129 /dev/VG/data分区,存放数据库文件,320M

mysql数据路径/data/mysql
因为没有合适的mysql数据所以使用wordpress的数据,wordpress2.8.5
nginx version: nginx/0.8.20
PHP 5.2.11 (cli) (built: Oct 23 2009 21:01:40)

一,准备工作

linux01上完成的内容

1,heartbeat的安装

yum –y install heartbeat heartbeat-devel

2,drbd的安装

tar zxvf drbd-8.3.4.tar.gz
cd drbd-8.3.4
make all
make install
make install-tools

3,准备一个含有mysql数据的硬盘分区

蚊子这里没有现成的mysql数据,就使用wordpress的数据库内容了,mysql的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[[email protected] ~]# mkfs.ext3 /dev/VG/data

挂载分区
[[email protected] ~]# mount /dev/VG/data  /data/

初始化数据库

[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql
Installing MySQL system tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK
Filling help tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK

在此处安装wordpress,将wordpress数据库安装到blog库中,如下
[[email protected] mysql]# ll /data/mysql/
total 20572
drwx—— 2 mysql mysql     4096 Oct 27 17:26 blog
-rw-rw—- 1 mysql mysql 10485760 Oct 27 17:25 ibdata1
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile0
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile1
-rw-rw—- 1 mysql root      1247 Oct 27 17:25 linux01.err
-rw-rw—- 1 mysql mysql        5 Oct 27 17:25 linux01.pid
drwx—— 2 mysql root      4096 Oct 27 17:25 mysql
drwx—— 2 mysql root      4096 Oct 27 17:25 test

卸载/data分区
[[email protected] ~]# umount /data/

4,备份分区前1M空间

[[email protected] mysql]# dd if=/dev/VG/data of=/root/back bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.049084 seconds, 21.4 MB/s

5,计算metadata容量并扩展分区,计算近似值如下公式

计算出来的近似值是1M左右,因为蚊子环境的lvm最小PE-size就是32Mb,所以扩展一个pe就行了

lvextend –l +1 /dev/VG/data

6,清空分区前1M空间

[[email protected] mysql]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0131647 seconds, 79.7 MB/s

7,创建drbd.conf文件,内容如下

global {

    usage-count yes;
}

common {
  syncer { rate 10M; }
}

resource r0 {

  protocol C;

  handlers {
    pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

    fence-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";

  }

  disk {
    on-io-error   detach;
  }

  net {

    after-sb-0pri disconnect;

    after-sb-1pri disconnect;

    after-sb-2pri disconnect;

    rr-conflict disconnect;

  }

  syncer {
    rate 10M;
    al-extents 257;

  }

  on linux01 {
    device     /dev/drbd0;
    disk       /dev/VG/data;
    address    192.168.211.128:7788;
    flexible-meta-disk  internal;
  }

  on linux02 {
    device    /dev/drbd0;
    disk      /dev/VG/data;
    address   192.168.211.129:7788;
    meta-disk internal;
  }
}

8,初始化drbd磁盘

[[email protected] mysql]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] mysql]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

确认drbd是否启动
[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将当前机器上的drbd设为primary
[[email protected] mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

9,恢复分区第一分区,这也是保证数据还在的关键一步

[[email protected] mysql]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.113655 seconds, 9.2 MB/s

10,重启drbd服务

[[email protected] mysql]# /etc/init.d/drbd restart
Restarting all DRBD resources: .

到此为止,linux01上的准备工作就做好了,下面看下linux02上的操作

因为linux02是备份用的,基本不用怎么设置,如果分区里面含有数据的话,就直接执行下面的操作就行

1,heartbeat的安装

yum –y install heartbeat heartbeat-devel

2,drbd的安装

tar zxvf drbd-8.3.4.tar.gz
cd drbd-8.3.4
make all
make install
make install-tools

3,初始化drbd

拷贝linux01上/etc/drbd.conf到linux02上的/etc下

[[email protected] ~]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0141756 seconds, 74.0 MB/s

扩展分区
[[email protected] ~]# lvextend –l +1 /dev/VG/data

创建metadata
[[email protected] ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[[email protected] ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:33
0: cs:SyncTarget ro:Secondary/Secondary ds:Inconsistent/UpToDate C r—-
    ns:0 nr:184320 dw:184320 dr:0 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:405448
        [=====>…………..] sync’ed: 32.0% (405448/589768)K
        finish: 0:00:34 speed: 11,696 (10,240) K/sec

现在两台机器上的准备工作都完毕了,进入到下面一个阶段

二,drbd,Heartbeat和mysql整合工作

两台机器上的公共操作

编辑ha.cf文件,内容如下

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 5
warntime 10
initdead 10
ucast eth0 192.168.211.129    #在两台机器上的内容是不一样的,都是指向对方的ip地址
auto_failback on
node    linux01
node    linux02
ping 192.168.211.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

编辑authkeys文件,内容如下

auth 1
1 crc

修改此文件权限为600

编辑haresources,内容如下

linux01 drbddisk::r0 Filesystem::/dev/drbd0::/data 192.168.211.120 mysqld

第一个字段是主机名,是uname -n得到的
第二个字段作用是当前主机设置为primary
第三个字段作用将/dev/drbd0 mount到/data目录上
第四个字段作用是启动VIP
第五个字段启动mysql进程

这个文件在启动的时候是由左往右启动,停止就是相反的由右往左停止。

分配权限:

chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta

三,启动测试阶段

到现在,全部配置就已经完成了,可以进行测试了

现在两台机器上都启动heartbeat,可以看到第一台机器的状态

VIP已经启动
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:71:2E:11 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0×2000

mysql已经顺利启动
2845 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux01.pid
2945 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux01.err –pid-file=/data/mysql/linux01.pid –socket=/tmp/mysql.sock –port=3306

drbd0设备mount上了
/dev/drbd0            567M   38M  501M   8% /data

这时停止linux01上的heartbeat,看下linux02上的状态

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:50:E4:62 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0×2000

[[email protected] ~]# ps ax|grep mysql|grep -v grep
2582 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux02.pid
2682 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux02.err –pid-file=/data/mysql/linux02.pid –socket=/tmp/mysql.sock –port=3306

[[email protected] ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG-root    6919612   1866388   4696056  29% /
/dev/sda1               101086     12072     83795  13% /boot
tmpfs                   127772         0    127772   0% /dev/shm
/dev/drbd0              580540     38872    512180   8% /data

这时如果在linux02上也启动nginx的话,使用vip是可以正常访问wordpress的页面的,这里蚊子就不上图了。到此这篇文章就全部完成了,需要的朋友可以亲自去试试,切记,如果需要在正式环境中应用并保证原有数据存在,请做好相应的备份工作。

使用以上方法,蚊子已经成功把公司线上两台数据库成功做成drbd+heartbeat高可用的方式了,目前稳定运行一周了。

drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据[原创]

随着两篇drbd相关文章的完成,蚊子对drbd的理解更进了一层,本篇文章就在前两篇的基础上结合了Heartbeat来搭建一个mysql高可用的应用,并保留原有mysql数据的内容。

先来介绍一下蚊子的环境吧

Vmware6.0
             linux01 192.168.211.128
             linux02 192.168.211.129

mysql数据路径/data/mysql
因为没有合适的mysql数据所以使用wordpress的数据,wordpress2.8.5
nginx version: nginx/0.8.20
PHP 5.2.11 (cli) (built: Oct 23 2009 21:01:40)

一,准备工作

linux01上完成的内容

1,准备一个含有mysql数据的硬盘分区

蚊子这里没有现成的mysql数据,就使用wordpress的数据库内容了,mysql的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[[email protected] ~]# mkfs.ext3 /dev/VG/data

挂载分区
[[email protected] ~]# mount /dev/VG/data  /data/

初始化数据库

[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql
Installing MySQL system tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK
Filling help tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK

在此处安装wordpress,将wordpress数据库安装到blog库中,如下
[[email protected] mysql]# ll /data/mysql/
total 20572
drwx—— 2 mysql mysql     4096 Oct 27 17:26 blog
-rw-rw—- 1 mysql mysql 10485760 Oct 27 17:25 ibdata1
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile0
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile1
-rw-rw—- 1 mysql root      1247 Oct 27 17:25 linux01.err
-rw-rw—- 1 mysql mysql        5 Oct 27 17:25 linux01.pid
drwx—— 2 mysql root      4096 Oct 27 17:25 mysql
drwx—— 2 mysql root      4096 Oct 27 17:25 test

卸载/data分区
[[email protected] ~]# umount /data/

2,备份分区第一扇区

[[email protected] mysql]# dd if=/dev/VG/data of=/root/back bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.049084 seconds, 21.4 MB/s

3,清空分区第一扇区

[[email protected] mysql]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0131647 seconds, 79.7 MB/s

4,创建drbd.conf文件,内容如下

global {

    usage-count yes;
}

common {
  syncer { rate 10M; }
}

resource r0 {

  protocol C;

  handlers {
    pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

    fence-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";

  }

  disk {
    on-io-error   detach;
  }

  net {

    after-sb-0pri disconnect;

    after-sb-1pri disconnect;

    after-sb-2pri disconnect;

    rr-conflict disconnect;

  }

  syncer {
    rate 10M;
    al-extents 257;

  }

  on linux01 {
    device     /dev/drbd0;
    disk       /dev/VG/data;
    address    192.168.211.128:7788;
    flexible-meta-disk  internal;
  }

  on linux02 {
    device    /dev/drbd0;
    disk      /dev/VG/data;
    address   192.168.211.129:7788;
    meta-disk internal;
  }
}

5,初始化drbd磁盘

[[email protected] mysql]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] mysql]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

确认drbd是否启动
[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将当前机器上的drbd设为primary
[[email protected] mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

6,恢复分区第一分区,这也是保证数据还在的关键一步

[[email protected] mysql]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.113655 seconds, 9.2 MB/s

7,重启drbd服务

[[email protected] mysql]# /etc/init.d/drbd restart
Restarting all DRBD resources: .

到此为止,linux01上的准备工作就做好了,下面看下linux02上的操作

因为linux02是备份用的,基本不用怎么设置,如果分区里面含有数据的话,就直接执行下面的操作就行

拷贝linux01上/etc/drbd.conf到linux02上的/etc下

[[email protected] ~]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0141756 seconds, 74.0 MB/s

[[email protected] ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[[email protected] ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:33
0: cs:SyncTarget ro:Secondary/Secondary ds:Inconsistent/UpToDate C r—-
    ns:0 nr:184320 dw:184320 dr:0 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:405448
        [=====>…………..] sync’ed: 32.0% (405448/589768)K
        finish: 0:00:34 speed: 11,696 (10,240) K/sec

现在两台机器上的准备工作都完毕了,进入到下面一个阶段

二,drbd,Heartbeat和mysql整合工作

两台机器上的公共操作

yum -y install heartbeat heartbeat-devel

编辑ha.cf文件,内容如下

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 5

warntime 10
initdead 10
ucast eth0 192.168.211.129    #在两台机器上的内容是不一样的,都是指向对方的ip地址
auto_failback on
node    linux01
node    linux02
ping 192.168.211.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

编辑authkeys文件,内容如下

auth 1
1 crc

修改此文件权限为600

编辑haresources,内容如下

linux01 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 192.168.211.120 mysqld

第一个字段是主机名,是uname -n得到的
第二个字段作用是当前主机设置为primary
第三个字段作用将/dev/drbd0以ext3格式mount到/data目录上
第四个字段作用是启动VIP
第五个字段启动mysql进程

这个文件在启动的时候是由左往右启动,停止就是相反的由右往左停止。

分配权限:

chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta

三,启动测试阶段

到现在,全部配置就已经完成了,可以进行测试了

现在两台机器上都启动heartbeat,可以看到第一台机器的状态

VIP已经启动
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:71:2E:11 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0x2000

mysql已经顺利启动
2845 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux01.pid
2945 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux01.err –pid-file=/data/mysql/linux01.pid –socket=/tmp/mysql.sock –port=3306

drbd0设备mount上了
/dev/drbd0            567M   38M  501M   8% /data

这时停止linux01上的heartbeat,看下linux02上的状态

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:50:E4:62 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0x2000

[[email protected] ~]# ps ax|grep mysql|grep -v grep
2582 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux02.pid
2682 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux02.err –pid-file=/data/mysql/linux02.pid –socket=/tmp/mysql.sock –port=3306

[[email protected] ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG-root    6919612   1866388   4696056  29% /
/dev/sda1               101086     12072     83795  13% /boot
tmpfs                   127772         0    127772   0% /dev/shm
/dev/drbd0              580540     38872    512180   8% /data

这时如果在linux02上也启动nginx的话,使用vip是可以正常访问wordpress的页面的,这里蚊子就不上图了。到此这篇文章就全部完成了,需要的朋友可以亲自去试试,切记,如果需要在正式环境中应用并保证原有数据存在,请做好相应的备份工作。

heartbeat2.x-pacemaker Configuration Explained翻译笔记02[原创]

快速删除部分配置文件

找出你希望删除的目标,例如:

sles-1:~ # cibadmin -Q | grep stonith
<nvpair id=”cib-bootstrap-options-stonith-action” name=”stonith-action” value=”reboot”/>
<nvpair id=”cib-bootstrap-options-stonith-enabled” name=”stonith-enabled” value=”1″/>
<primitive id=”child_DoFencing” class=”stonith” type=”external/vmware”>
<lrm_resource id=”child_DoFencing:0″ type=”external/vmware” class=”stonith”>
<lrm_resource id=”child_DoFencing:0″ type=”external/vmware” class=”stonith”>
<lrm_resource id=”child_DoFencing:1″ type=”external/vmware” class=”stonith”>
<lrm_resource id=”child_DoFencing:0″ type=”external/vmware” class=”stonith”>
<lrm_resource id=”child_DoFencing:2″ type=”external/vmware” class=”stonith”>
<lrm_resource id=”child_DoFencing:0″ type=”external/vmware” class=”stonith”>
<lrm_resource id=”child_DoFencing:3″ type=”external/vmware” class=”stonith”>

接下来找出资源标签和id(在这个例子中是primitve和child_DoFencing)。然后可以简单的执行

cibadmin –delete –crm_xml ‘<primitive id=”child_DoFencing”/>’

不使用XML文件更新配置文件

有些普通的任务可以通过使用高层次的工具来完成,从而避免了读取和编辑xml文件。

拿激活stonith来举例,可以执行

crm_attribute –attr-name stonith-enabled –attr-value true

或者想看看是否哪个节点可以允许运行资源,可以执行

crm_standby –get-value –node-uname somenode

又或者想找出my-test-rsc的当前位置,可以执行

crm_resource –locate –resource my-test-rsc

在沙箱中更改配置文件

经常是被描述为在自动更新配置文件之前预览一遍一系列改变带来的效果。为了这个目的我们创建了crm_shadow命令,这个命令可以创建配置文件的一份“影子”拷贝,同时为所有命令行工具使用做了准备。

在开始,简单引用crm_shadow命令并给一个要创建的配置文件名,接着跟随屏幕上的提示操作。如果不这样做,就会导致你必须更新当前在用的配置文件。

c001n01:~ # crm_shadow –create test
Setting up shadow instance
Type Ctrl-D to exit the crm_shadow shell
shadow[test]:

创建一个新的沙箱

shadow[test] # crm_shadow –which
test

查看哪个影子拷贝是激活的

从现在这点开始,所有集群上执行的命令都自动作用在影子拷贝上了,而不会再去修改真实使用的配置。

shadow[test] # crm_failcount -G -r rsc_c001n01
name=fail-count-rsc_c001n01 value=0
shadow[test] # crm_standby -v on -n c001n02
shadow[test] # crm_standby -G -n c001n02
name=c001n02 scope=nodes value=on
shadow[test] # cibadmin –erase –force
shadow[test] # cibadmin –query
<cib cib_feature_revision=”1″ validate-with=”pacemaker-1.0″ admin_epoch=”0″ crm_feature_set=”3.0″ have-
quorum=”1″ epoch=”112″ dc-uuid=”c001n01″ num_updates=”1″ cib-last-written=”Fri Jun 27 12:17:10 2008″>
<configuration>
<crm_config/>
<nodes/>
<resources/>
<constraints/>
</configuration>
<status/>
</cib>

对影子配置进行修改

一旦你完成了实验,你就可以提交你的更高,或者是在影子状态下废除变更。此外请仔细跟随屏幕指示进行操作。

shadow[test] # crm_shadow –delete test –force
Now type Ctrl-D to exit the crm_shadow shell
shadow[test] # exit
c001n01:~ # crm_shadow –which
No shadow instance provided
c001n01:~ # cibadmin -Q
<cib cib_feature_revision=”1″ validate-with=”pacemaker-1.0″ admin_epoch=”0″ crm_feature_set=”3.0″ have-
quorum=”1″ epoch=”110″ dc-uuid=”c001n01″ num_updates=”551″>
<configuration>
<crm_config>
<cluster_property_set id=”cib-bootstrap-options”>
<nvpair id=”cib-bootstrap-1″ name=”stonith-enabled” value=”1″/>
<nvpair id=”cib-bootstrap-2″ name=”pe-input-series-max” value=”30000″/>

废除改变同时确认真实配置文件未受损

想要获得crm_shadow的全部选项列表,请不加任何参数执行这个命令。

测试你配置文件的更改

我们前面也看到了如何对配置文件的影子拷贝进行一系列的更改。在把这些变动加载到集群之前(例如:crm_shadow –commit mytest –force),通常来讲使用ptest命令来模拟改变效果是明智的。

ptest –live-check -VVVVV –save-graph tmp.graph –save-dotfile tmp.dot

这个工具使用和真实集群一样的库文件,来显示当活动输入的时候都完成了什么。除了输出外还会有大量重要的日志记录,存储在tmp.graph和tmp.dot这两个文件中,两个都是同一件事情的响应—你的集群系统对于你变更操作的响应。在graph文件中存储着完整的流程,包含了所有功能的列表,还有他们的参数和首要事。正因为流程graph并不是非常容易阅读,所以这工具也生成了一个图形化的dot文件来描述相同的信息。

用图表形式描绘流程graph的一个例子

解释Graphviz输出

箭头指示出命令的依赖关系

虚线箭头表示没有在流程图中出现的依存关系

任意颜色的虚线框的行为没组成流程图的部分

绿色框的行为组成了流程图的部分

红色框的行为是集群中的其中一员可能会执行但还没有被执行的

蓝色框的行为是集群中的其中一员认为没必须要执行的

橘黄色字体的是假的或者假装的行为集群用来简化图表的

黑色字体的行为是发送给LRM的

资源行为由{rsc}_{action}_{interval} {node}文字组成

任何一个依赖于红框里的行为的行为都将不被执行

环形了就太糟糕了,这时请将这种情况报告给开发小组

在上面的例子中,出现了一个新的节点,node2,当node2变成在线状态时,集群检查并确认rsc1,rsc2和rsc3没有在他上执行(*_monitor_0条目表示)。一旦开始执行并假定资源并没有在上面激活,接下来可能会在node1上停止rsc1和rsc2并把它们移到node2上。然后这样会出现一些问题,而且集群可能或者不被允许执行stop操作这就意味着同样不能执行start操作。因为种种原因集群可能不会再任何地方启动rsc3.

想获得ptest能支持的更多参数,请使用ptest –help查看。

另外一个,稍微复杂点的流程图,并不期望着你能读懂

我用不用在所有的集群节点上更新配置文件

回答是否定的,任何的变更都会立刻同步到所有活跃的集群节点上。

为了减少带宽,集群仅仅广播你你更改后的结果的那部分增量更新,同时使用md5值来确保每一份拷贝都是一致的。

未完,下期继续………………

注:蚊子这部分看的有点晕,有些名词把握可能不到位,随着后面学习的深入,可能对理解上会有所帮助,之后review的时候再做调整了。

heartbeat的新变化[技术]

蚊子最近很关注heartbeat,在heartbeat的官网上发现了这样的一条提示

CRM现在作为一个被叫做Pacemaker的独立项目来进行维护了,并且现在支持了很多新的特性,包括对OpenAIS集群堆栈的支持。

heartbeat2.1.4成为了最后一个包含了CRM或者叫“版本2资源管理”的一个版本,同时开发和维护作为了Pacemaker项目的一部分来运作,并且CRM的代码将从Heartbeat中移除。

如果需要更多Pacemaker的细节,包括最新的版本,安装细节和文档,请访问http://clusterlabs.org/.

下面先给个Pacemaker的结构图

具体Pacemaker的详细介绍,大家还是看蚊子最近翻译整理的文档吧,应该会对各位有所帮助。

heartbeat2.x-pacemaker Configuration Explained翻译笔记序[原创]

Pacemaker配置手册讲解

上篇文章蚊子是从半截开始翻译的,这篇文章补充完整,这个是文章开头那部分介绍内容,没有更多的技术,只是对Pacemaker的整体介绍。还是那句话,蚊子英文水平太烂,真有翻译不对还望各位指正。

先读我

什么是Pacemaker

Pacemaker是集群资源管理。它利用你的集群基础组件(如OpenAIS或heartbeat)来停止,启动甚至监控你希望集群提供服务的健康状况。

它可以在任何大小规模的集群中工作,伴随使用可靠的模块,管理可以很准确的描述集群中资源的关系。

蚊子世界

集群堆栈概述

在最顶层,集群由三部分组成

集群的核心基础提供消息和成员功能(红色描述)

非集群意识组件(蓝色描述)。在Pacemaker集群中,这一块不仅仅包含了知道如何启动,停止及监控资源的脚本,同时还有一个本地守护进程来掩饰脚本执行不同标准之间带来的差异。

大脑(绿色显示)用来响应和处理从集群(节点的脱离和加入),资源(监控健康),及管理员对于配置文件变更的事件。对于这些事件的响应,Pacemaker将会评估出集群的理想状态同时划分出一个路径用来打包。这可能会包括移动资源,停止节点,甚至是通过远程switches强迫他们离线。

Pacemaker架构

Pacemaker自己由4个关键组件组成(下面颜色的描述和之前那个概念上一样)

CIB(Cluster Information Base集群信息基础)

CRMd(Cluster Resource Management daemon集群资源管理守护进程)

PEngine(PE or Policy EnginePE或者策略引擎)

STONITHd

CIB使用XML替代了集群中的集群配置和所有资源的当前状态。CIB的内在自动在整个集群中保持同步同时被PEngine用来评估集群的理想状态和如何达到这个状态。

指令的列表传递给DC(指派的协调者)。Pacemaker通过选举一个CRMd线程作为主控的方式来收集集群中作出的决策。如果在选举的过程中或者选在一个几点上的时候,失败了,那一个新的就会被很快的建立起来。

DC通过必要的命令来实现PEngine的指示,通过集群消息架构(这个消息架构可以轮流把命令传递给他们的LRMd进程)把命令传递个LRMd(本地资源管理守护进程)或者其他节点上的CRMd。

同级节点奖他们的操作返回汇报给DC,同时基于真实的和期望的结果,将会需要等待前置任务完成再来执行任何响应,或者忽略进程告知PEngine根据意外的结果重新计算理想的集群状态。

在有些情况下关闭节点来保护共享数据或者完全恢复资源是很有必要的。为了这个Pacemaker出现了STONITHd。STONITH是Shoot-The-Other-Node-In-The-Head的缩写,通常用远程电源开关来充当。在Pacemaker中,STONITH设备是一个资源模块(配置在CIB中),使用它们可以很容易监控故障,然而STONITHd关心理解STONITH的拓扑结构这样在client请求把一个节点保护起来STONITHd就可以重启了。

蚊子世界

运行在OpenAIS上的Pacemaker集群子系统

这个手册的作用域

本篇手册的目的更确切的讲是解释使用Pacemaker配置的概念。为了达到最好,更多的关注点放在了CIB配置文件中XML的语句规则上。

因为XML语法的敏感,Pacemaker随之出现了集群shell脚本,python脚本还有基于GUI的工具,然而这些命令并没有完全涵盖在此文档中,恰好因为他们隐藏了XML。

另外要说的就是这篇手册并不是一个手把手教你如何配置一个特定集群系统的文档。尽管可能这类文章将来会写出来,这篇文档的目的是提供建筑的地基,使用它可以构建任何类型的Pacemaker集群。

heartbeat2.x-pacemaker Configuration Explained翻译笔记01[原创]

苦于上次配置heartbeat2.x是遇到的两个问题还没有答案,又加上对于2.x的中文文章比较少,所以,蚊子决定自己来深入学习一下2.x的技术,因为heartbeat版本的更新,所以对于2.x中集群资源管理部分现在起名为pacemake了,我就按照自己的英文程度和理解,把pacemake configuration的英文文档翻译成中文,供大家参考。

强调一点,蚊子英文实在够烂,如有翻译不当的地方,还望高手指出,英文文档下载地址为:

http://clusterlabs.org/mediawiki/images/f/fb/Configuration_Explained.pdf

因为此文档前面部分都是一些简单的介绍,所以这里就先不做翻译了,蚊子先从Configuration Basics部分开始翻译起

基本配置

配置文件的布局

集群配置文件使用XML标记语言而且配置文件被分成了两部分:配置部分和状态监控部分。

状态部分包含了每一个资源在每个节点和建立在数据基础上的历史信息,集群配置可以构建当前完整的集群状态。状态监控部分最可靠的资源就是运行在每个节点上的本地资源管理(lrmd)进程,同时cluster偶尔会进入整个部分。就因为这个,所以这部分是不会写入磁盘的,同时也是坚决不允许管理员修改的。

配置部分包含的更多的是常规的信息,比如cluster选项,资源的列表,哪些资源运行在哪里。在当前文档中配置部分是主要关注的。

配置部分本身就被分成了4部分

Con?guration options (called crm_con?g)
Nodes
Resources
Resource relationships (called constraints)

<cib generated=”true” admin_epoch=”0″ epoch=”0″ num_updates=”0″ have-quorum=”false”>
<configuration>
<crm_config/>
<nodes/>
<resources/>
<constraints/>
</configuration>
<status/>
</cib>

一个空的配置

当前集群的状态

在开始配置一个集群之前呢,还是值得解释一下怎么来查看一个完成配置的。为了这个目的,我们创建了一个crm_mon的工具,这个工具可以显示当前激活集群的状态。这个命令可以显示集群的状态按照节点或者资源,同时既可以用在single-shot模式也可以用在dynamically-updating模式。还有另外一种模式用来显示操作执行(按节点和资源分组)后失败信息的列表。

使用这个工具,你可以检查集群状态是否有误同时还可以看到当你引起或者模拟故障的时候的响应信息。

要想获得这个工具提供的更详细的信息可以执行crm_mon –help命令查看。

============
Last updated: Fri Nov 23 15:26:13 2007
Current DC: sles-3 (2298606a-6a8c-499a-9d25-76242f7006ec)
3 Nodes configured.
5 Resources configured.
============
Node: sles-1 (1186dc9a-324d-425a-966e-d757e693dc86): online
Node: sles-2 (02fb99a8-e30e-482f-b3ad-0fb3ce27d088): standby
Node: sles-3 (2298606a-6a8c-499a-9d25-76242f7006ec): online
Resource Group: group-1
192.168.100.181  (heartbeat::ocf:IPaddr):  Started sles-1
192.168.100.182  (heartbeat:IPaddr):    Started sles-1
192.168.100.183  (heartbeat::ocf:IPaddr):  Started sles-1
rsc_sles-1 (heartbeat::ocf:IPaddr):   Started sles-1
rsc_sles-2 (heartbeat::ocf:IPaddr):   Started sles-3
rsc_sles-3 (heartbeat::ocf:IPaddr):   Started sles-3
Clone Set: DoFencing
child_DoFencing:0  (stonith:external/vmware):  Started sles-3
child_DoFencing:1  (stonith:external/vmware):  Stopped
child_DoFencing:2  (stonith:external/vmware):  Started sles-1

crm_mon的输出示例

============
Last updated: Fri Nov 23 15:26:14 2007
Current DC: sles-3 (2298606a-6a8c-499a-9d25-76242f7006ec)
3 Nodes configured.
5 Resources configured.
============
Node: sles-1 (1186dc9a-324d-425a-966e-d757e693dc86): online
192.168.100.181  (heartbeat::ocf:IPaddr):  Started sles-1
192.168.100.182  (heartbeat:IPaddr):    Started sles-1
192.168.100.183  (heartbeat::ocf:IPaddr):  Started sles-1
rsc_sles-1  (heartbeat::ocf:IPaddr):  Started sles-1
child_DoFencing:2  (stonith:external/vmware):  Started sles-1
Node: sles-2 (02fb99a8-e30e-482f-b3ad-0fb3ce27d088): standby
Node: sles-3 (2298606a-6a8c-499a-9d25-76242f7006ec): online
rsc_sles-2  (heartbeat::ocf:IPaddr):  Started sles-3
rsc_sles-3  (heartbeat::ocf:IPaddr):  Started sles-3
child_DoFencing:0  (stonith:external/vmware):  Started sles-3

crm_mon -n的输出示例

DC(指派控制器)节点负责做出决定,而且当当前的DC挂了的时候,一个新的DC就会从其他剩余节点中被推举出来。DC的选择对管理员来讲并不关心,相对于这个来说,更会在意一下生成的日志。

配置文件如何被更新

更新集群配置文件有三个基本的规则

规则1-坚决不要手动编辑cib.xml文件
规则2-再把第一条规则读一遍
规则3-如果你忽略第一和二条规则,集群会提醒你并且拒绝使用配置文件

现在清楚了怎么能不更新配置文件,我们来解释一下你应该怎么做。

最有用的用来调整配置文件的工具就是cibadmin,它可以直接和运行中的集群系统进行通信。使用cibadmin,用户可以对配置文件的任何部分进行查询,添加,删除,更新或者替换,同时所有改变将立刻生效,并不需要执行什么类似reload的操作。

对于我们来讲,最简单的方法就是使用cibadmin工具将当前的配置文件存到一个临时文件中,然后使用任意一个我们熟悉的xml编辑工具对其进行编辑然后上传成修订后的配置文件。

cibadmin –query > tmp.xml
vi tmp.xml
cibadmin –replace –xml-file tmp.xml

一些好的xml编辑器会利用Relax NG schema来帮助用户检查改动是否有效。通常情况下可以在大部分系统的/usr/lib/heartbeat/pacemaker.rng里找到配置文件的schema描述。

如果你需要修改resources部分,你可以这样做

cibadmin –query –obj_type resources > tmp.xml
vi tmp.xml
cibadmin –replace –obj_type resources –xml-file tmp.xml

这样可以避免修改配置文件的其他任何部分。

未完,下期继续………………

heartbeat2.x技术学习笔记[技术]

heartbeat1.x的技术已经比较熟悉了,只能两台主机,只能监控硬件状况,有限的功能确实很局限,对于2.x的技术来讲有了很好的扩展,最高支持16台主机,可以对于资源程序进行监控等等,具体细节可以去heartbeat的官网查看,我这里不就在赘述了,只把功能上的实现做个总结。

试验环境:vmware6.0 centos4.4 heartbeat2.1.3 mysql-5.1.28

linux01    ip:192.168.202.128
linux02    ip:192.168.202.129
VIP           ip:192.168.202.110

试验目的:1,linux01上的mysql服务down了,会在linux01上恢复 
                    2,linux01意外断电,vip和mysql服务迁移到linux02上

linux01和linux02上的配置除了ha.cf中ucast的配置要指向另一个节点的网卡ip,其他都是一样的,这里只给出linux01上的配置,另外一台请自行调整。

先是ha.cf的配置

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 15
warntime 10
initdead 20
udpport 694
ucast eth0 192.168.202.129
auto_failback on
node    linux01
node    linux02
ping 192.168.202.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

crm yes

然后是haresources文件,但在2.x的模式下已经不在使用这个配置了,之所以这里我拿出来使用是,因为heartbeat提供了一个转换工具,可以根据这个文件生成cib.xml文件,所以我这里还是先编辑这个文件,稍后提供转换办法

linux01 192.168.202.110 mysqld

在最后就是authkeys文件,关于authkeys文件里的3中模式随意用哪种都行的,并把权限设置成600

auth 3
#1 crc
#2 sha1 HI!
3 md5 Hello!

接下来使用转换软件生成cib.xml文件

/usr/lib/heartbeat/haresources2cib.py haresources

这就就会在/var/lib/heartbeat/crm下生成cib.xml文件了,这样两台机器都准备好后,就可以进行测试了

先在两台机器上启动heartbeat软件,执行/etc/init.d/heartbeat start

可以看到linux01上启动了vip和mysql,02上只是启动了

首先在linux01执行/etc/init.d/mysqld stop命令停止mysql服务,然后查看日志,用tail -f的方式,大概2分钟左右的时候,heartbeat就把mysql服务启动起来了,关于mysql服务的监控在cib.xml中可以配置的,默认的interval="120s"。可自行调整

然后来测试linux01 down机,ip和mysql服务自动切换问题

因为我使用的vmware虚拟机,所以关机非常的方便,直接关电就行了,一是观察linux02上的日志,二是观察进程ip服务,发现很快的vip和mysql服务就可以起来了

对于上面的应用效果,我还发现了两个问题,有可能是我对于2.x的理解不够,接下来我会继续深入研究,我的问题是

1,如果我用kill mysql进程的方法,linux01上mysql怎么也不会再被启动起来,这时可以通过手动删除pid文件的方式让heartbeat来自动启动donw掉的mysql,但同时又出现一个问题,就是如果真因为mysql意外终止,但heartbeat调用的mysqld的lsb脚本是不会判断出来的,所以,mysql服务始终不会启动。
2,heartbeat默认配置是监控自己的机器的资源,当资源故障是先尝试在本机恢复的。所以如果linux01上的mysql服务真的因为什么情况没法继续提供服务,heartbeat是用什么机制将服务和vip都迁移到linux02这台正常的机器上。

lvs+HA+squid搭建稳定上网服务[原创]

今天有人在群里喊谁做过lvs+squid,正好以前做过一个,我就把过程整理下来,供大家参考。首先看看拓扑图如下
说下我写这篇文章所用的测试环境,vmvare6.0,模拟两个linux,用的是centos5.1
squid-1(192.168.211.128)
squid-2(192.168.211.130)
Vip(192.168.211.135)
实现方式lvs-dr
1,lvs配置部分
安装lvs所需要的软件

yum -y install heartbeat

yum y install heartbeatldirectord

yum -y install heartbeat-devel

yum y install ipvsadm

配置Ldirector
vi /etc/ha.d/ldirectord.cf设置如下内容,两台机器文件内容相同

# Global Directives

checktimeout=3

checkinterval=1

autoreload=yes

logfile=“/var/log/ldirectord.log”

logfile=“local0”

#emailalert=[email protected]

#emailalertfreq=3600

#emailalertstatus=all

quiescent=yes

# Sample for an http virtual service

virtual=192.168.211.135:3128

real=192.168.211.128:3128 gate

real=192.168.211.130:3128 gate

scheduler=rr

#persistent=600

#netmask=255.255.255.255

protocol=tcp

checktype=negotiate

checkport=3128

配置heartbeat

vi /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

ucast eth0 192.168.211.130 #另外一台这里要设置成另外的ip

auto_failback on

node contos5-1-1 #通过uanme -n得到

node contos5-1-2

ping_group group1 192.168.211.128 192.168.211.130

respawn hacluster /usr/lib/heartbeat/ipfail

这里之所以使用ucast而不用bcast是因为,如果同网段你还有另外的一套lvs的话,bcast广播也会发到这套lvs里,虽说应用上不会给另外一套lvs带来影响,但日志里会出现很多错误

cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/

vi /etc/ha.d/authkeys,将如下两行的注释去掉

# crc adds no security , except from packet corruption.

# Use only on physically secure networks.

#

auth 1

1 crc

#2 sha1

#3 md5

chomd 600 /etc/ha.d/authkeys

vi /etc/ha.d/haresources文件,加入

contos5-1-1 closelo 192.168.211.135 ldirectord::ldirectord.cf startlo

在/etc/ha.d/resource.d下建立closelo脚本,内容如下

#!/bin/sh

VIP=192.168.211.135

case “$1” in

start)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del -host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

stop)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add -host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

*)

echo $“Usage: $0 (start|stop)”

exit 1

;;

esac

/etc/ha.d/resource.d下建立startlo脚本

# ! /bin/sh

VIP=192.168.211.135

case “$1” in

stop)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

start)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

* )

echo $“Usage: $0 (start|stop)”

exit 1

; ;

esac

到此,lvs部分就全部完成了,接下来说squid的设置,具体配置我就不写了,网上这方面的文章很多,我仅仅完成一个可以做正向代理的出来

squid我使用的是3.0stable8
./configure –prefix=/usr/local/squid
make && make install
完成安装后,配置文件内容如下

visible_hostname 2

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl localnet src 172.16.0.0/12 # RFC1918 possible internal network

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

acl purge method PURGE

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow purge localhost

http_access allow localnet

http_access deny all

icp_access allow localnet

icp_access deny all

htcp_access allow localnet

htcp_access deny all

#always_direct allow all

#http_port 80 accel vhost vport

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/var/logs/access.log squid

cache_dir ufs /usr/local/squid/cache 10 2 4

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern . 0 20% 4320

cache_effective_user squid

cache_effective_group squid

然后启动squid,接下来就可以测试了,到此一个可用的而且强健的双机squid就完成了(除非两台机器同时挂掉)

注:每次启动heartbeat前,请先执行 /etc/ha.d/resource.d/closelo脚本,使得lo:o网卡启动,不然这套配置将不起作用了,我目前还没有找到更好的解决办法

如对以上配置有何不明了的还请提出共同讨论