首页 > 系统服务 > 负载均衡高可用

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

之前在蚊子的《》一篇文章中,介绍了使用heartbeatlvs和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 {
     admin@example.com
   }
   notification_email_from admin@example.com
   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的搭配,被广泛用于linux下的高可用(HA)方案中,蚊子的这篇文章是建立在上一篇《drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据》之上的,对于上一篇中不足和潜在问题予以改正。如果有需要在线操作的请以这篇为准。

此篇文章还是介绍如何在已经含有数据的分区或硬盘上搭建drbdheartbeat高可用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的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[root@linux01 ~]# mkfs.ext3 /dev/VG/data

挂载分区
[root@linux01 ~]# mount /dev/VG/data  /data/

初始化数据库

[root@linux01 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库中,如下
[root@linux01 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分区
[root@linux01 ~]# umount /data/

4,备份分区前1M空间

[root@linux01 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空间

[root@linux01 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磁盘

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

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

确认drbd是否启动
[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 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
[root@linux01 mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 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,恢复分区第一分区,这也是保证数据还在的关键一步

[root@linux01 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服务

[root@linux01 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下

[root@linux02 ~]# 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

扩展分区
[root@linux02 ~]# lvextend –l +1 /dev/VG/data

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

[root@linux02 ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 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

[root@linux02 ~]# 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

[root@linux02 ~]# 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高可用的方式了,目前稳定运行一周了。

阅读全文

今天蚊子我来说说drbdmetadata,同时感谢“系统架构师群”中的sigma,多亏了和他的讨论,让我对drbd理解又更深了一步。

DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了

a,DRBD设备的大小
b,产生的标识
c,活动日志
d,快速同步的位图

metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的

内部meta data

内部metadata存放在同一块硬盘或分区的最后的位置上

优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。

外部meta data

外部的metadata存放在和数据磁盘分开的独立的块设备上

优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了

如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了。

可以通过下面的命令来计算metadata需要占用的扇区数

Cs是数据磁盘的扇区数

你可以使用"blockdev –getsz device.”命令查到扇区数,cho $(( $(blockdev –getsize64 device) / 512))这个方法更可信一点,支持块设备大小超过2TB

Ms也是用扇区数描述的,如果要转化成MB,就除以2048

下面的公式可以近似得到metadata占用的容量,直接用MB表示,而不是扇区数

以上内容基本来自官方文档,下面说说蚊子理解,先看一张图

 

蚊子要说的是在已有数据的硬盘或分区上做drbd的内容,图中绿,蓝,红三色的部分是原含有数据的分区,其中绿色部分是前1M的内容,用于记录已有数据分区的分区表,按蚊子前面的文章,此处需要先备份绿色的部分,然后对绿,蓝,红三色的空间进行create-md操作,这时会在蓝色区域的最后部分创建metadata,也就是红色的部分,这是蚊子继续做的操作是将备份的绿色部分使用dd命令写回drbd0,这时问题也就出现了,绿色部分记录的磁盘大小是绿蓝红三色总共的大小,而创建drbd的metadata后,drbd认为我可以使用的空间是绿蓝两色的,虽然按蚊子前面的文档mount上可以使用,但如果磁盘快用完的时候,对于文件系统ext3来说,还有空间,但对于drbd来说已经写不进去了,就会产生潜在的问题。

下面来看看正确的做法。看图

步骤:

1,先dd备份绿色部分
2,根据上面的公式计算出metadata占用容量
3,使用lvm给分区扩容
4,dd清空分区绿色部分
5,创建metadata
6,使用dd命令在drbd块设备上恢复备份的绿色部分

经过这几步,隐患就消除了,因为绿色部分只包括蓝和绿的总和空间大小

下面来看看在一块新的硬盘或分区上创建drbd块设备的图

这个图相当于是一块新的分区或硬盘,蓝黄就是硬盘或分区的总容量,在创建完metadata以后,实际可用容量就只有蓝色部分了。

这也就是为什么官方文档上说,如果现有设备不支持扩容或文件系统不支持shrinking就只能使用外部metadata的缘故了

阅读全文

随着两篇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的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[root@linux01 ~]# mkfs.ext3 /dev/VG/data

挂载分区
[root@linux01 ~]# mount /dev/VG/data  /data/

初始化数据库

[root@linux01 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库中,如下
[root@linux01 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分区
[root@linux01 ~]# umount /data/

2,备份分区第一扇区

[root@linux01 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,清空分区第一扇区

[root@linux01 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磁盘

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

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

确认drbd是否启动
[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 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
[root@linux01 mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 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,恢复分区第一分区,这也是保证数据还在的关键一步

[root@linux01 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服务

[root@linux01 mysql]# /etc/init.d/drbd restart
Restarting all DRBD resources: .

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

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

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

[root@linux02 ~]# 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

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

[root@linux02 ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 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

[root@linux02 ~]# 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

[root@linux02 ~]# 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高可用复制》一文中,蚊子试验了在一块含有数据的新硬盘上保证不破坏原有数据的前提下建立drbd复制,结果是成功的,同时,蚊子又留了一个问题,让我们回顾一下这个问题:

“蚊子这个试验是使用的一块独立硬盘做的测试,所以头1024字节就是这块硬盘的第一个扇区,如果要是在原有的一块大硬盘的一个独立分区里做的话,不知道这个头1024字节是那部分数据,这样做会不会有问题。”

带着这个问题,昨晚蚊子用虚拟机做了一个实验。

试验目的:在已有硬盘的不同分区上建立drbd复制,同时保证原有数据不丢失,不损坏。
试验环境:vmware模拟环境
192.168.211.128(linux01) CentOS release 5.3 (Final) 留出512M用于建立drbd
192.168.211.129(linux02) CentOS release 5.3 (Final) 留出512M用于建立drbd
drbd-8.3.4版本源码编译安装
试验步骤:

请参考《在已有数据的的硬盘上创建drbd高可用复制》这篇文章,这里不再赘述,唯一可能不同的地方就是不在需要创建pv和vg,直接把空余的512Mb硬盘创建一个lv就行了。

结论:经过蚊子试验,按照上篇的方法,同样可以在保证原有分区数据的情况下建立起drbd复制,有兴趣的朋友可以亲自去试验。同样如果需要在生产环境这样操作请做好相应的备份。

提出问题:

对于这个实验,蚊子同样也有一个疑问,因为创建的数据只有几k而已,如果是在一个装满数据的硬盘或者分区,不知道蚊子这样的方法是否可行,有条件的朋友可以测试一下。

阅读全文

关注drbd也有段时间了,不过蚊子一直没时间亲自操刀过,最近需要解决数据库备份的问题,所以有时间亲自实践了一下。

网上搜了很多资料都说drbd必须在一个干净的block设备上创建,但我的数据库已经在线运行了,所以这种办法可能不太合适,所以自己研究了一下如何在不影响原有数据的情况下配置drbd。今天算是小有成绩了,特来给大家分享一下。

试验目的:在已有数据的硬盘上创建drbd复制
试验环境:vmware模拟环境
192.168.211.128(linux01) CentOS release 5.3 (Final)
192.168.211.129(linux02) CentOS release 5.3 (Final)
drbd-8.3.4版本源码编译安装

试验步骤:

1,添加需要同步的硬盘

首先在虚拟机上为每个系统添加一块新的独立的虚拟硬盘,大小512MB,然后每台机器上执行以下相同的操作

pvcreate /dev/sdb
vgcreate vgtest /dev/sdb
lvcreate -l 127 -n data vgtest

2,格式化分区

然后在linux02并且仅在这台机器上将新建的lv格式化成ext3格式的分区,另外一台机器不用

[root@linux02 ~]# mkfs.ext3 /dev/vgtest/data
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
130048 inodes, 520192 blocks
26009 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
64 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

3,创建文件

将格式化好的分区mount到/data目录下,并在此目录下创建5个有内容的文件,并卸载/data分区,操作如下

[root@linux02 ~]# mount /dev/vgtest/data /data/
[root@linux02 ~]# cd /data/
[root@linux02 data]# for ((i=0;i<=4;i++))
> do
> echo “00$i”>$i
> done
[root@linux02 data]# ll
total 17
-rw-r–r– 1 root root     4 Oct 20 13:45 0
-rw-r–r– 1 root root     4 Oct 20 13:45 1
-rw-r–r– 1 root root     4 Oct 20 13:45 2
-rw-r–r– 1 root root     4 Oct 20 13:45 3
-rw-r–r– 1 root root     4 Oct 20 13:45 4
[root@linux02 data]# cd
[root@linux02 ~]# umount /data/

4,备份头1024自己的数据

为了实现在已经有数据的硬盘上创建drbd,蚊子现在备份/dev/vgtest/data分区的头1024字节的数据,操作如下

dd if=/dev/vgtest/data of=/root/back bs=1M count=1

5,创建drbd相应的设备

下面就来开始创建相应的drbd相关的设备及相应的配置

配置如下:

global {

usage-count yes;
}

common {
syncer { rate 10M; }
}

resource r0 {

protocol C;

handlers {
pri-on-incon-degr “echo o > /proc/sysrq-trigger ; halt -f”;

pri-lost-after-sb “echo o > /proc/sysrq-trigger ; halt -f”;

local-io-error “echo o > /proc/sysrq-trigger ; halt -f”;

outdate-peer “/usr/lib/heartbeat/drbd-peer-outdater -t 5”;

}

startup {

}

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/vgtest/data;
address    192.168.211.128:7788;
meta-disk  internal;

}

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

两台主机上的drbd.conf配置文件相同。下面就可以启动drbd了

linux01上的操作

[root@linux01 ~]# dd if=/dev/zero of=/dev/vgtest/data bs=1M count=1
[root@linux01 ~]# modprobe drbd

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

[root@linux01 ~]# drbdadm up r0
可以通过查看/proc/drbd来确认现在drbd的状态,显示如下

[root@linux01 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-16 20:22:50
0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r—-
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:520140

linux02上的操作

[root@linux02 ~]# modprobe drbd
[root@linux02 ~]# drbdadm create-md r0
[root@linux02 ~]# drbdadm up r0
查看状态如下

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-20 12:08:30
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r—-
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:520140

现在可以看到,两台设备都是从设备,现在需要设置一台机器为主设备,因为我们在linux01上创建了文件,所以由linux01担当primary设备,操作如下

[root@linux01 ~]# drbdsetup /dev/drbd0 primary –o
查看状态如下

[root@linux01 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-16 20:22:50
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r—-
ns:186368 nr:0 dw:0 dr:186368 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:333772
[======>………….] sync’ed: 36.3% (333772/520140)K
finish: 0:00:32 speed: 10,236 (9,808) K/sec

由此看到当前设备已经变成primary了

再来看看linux02上的变化

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-20 12:08:30
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r—-
ns:0 nr:520140 dw:520140 dr:0 al:0 bm:32 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

这样在linux01上/dev/drbd0就已经是可写的设备了,如果是一块新的硬盘,就可以对drbd0设备进行格式化的操作了,但由于我们已经在linux01上创建了数据,为了保留数据,我们不能进行格式化,现在就需要用到刚才备份出来的头1024字节的数据了,操作如下

[root@linux01 ~]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.203191 seconds, 5.2 MB/s

然后mount到/data目录看下

[root@linux01 ~]# mount /dev/drbd0 /data/
执行之后并没有报错,使用df看下状态

[root@linux01 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7744976   3900480   3444728  54% /
/dev/sda1               101086     12075     83792  13% /boot
tmpfs                    62800         0     62800   0% /dev/shm
/dev/drbd0              503780     10550    467221   3% /data

可以看到,已经可以成功mount使用了。

6,检查原有数据是否存在

现在就来验证一下原有创建的数据是否存在吧,操作如下

[root@linux01 ~]# ll /data/
total 22
-rw-r–r– 1 root root     4 Oct 16 20:25 0
-rw-r–r– 1 root root     4 Oct 16 20:25 1
-rw-r–r– 1 root root     4 Oct 16 20:25 2
-rw-r–r– 1 root root     4 Oct 16 20:25 3
-rw-r–r– 1 root root     4 Oct 16 20:25 4
drwx—— 2 root root 12288 Oct 16 20:25 lost+found

由此看到,原来/data目录下的数据还是存在的,看下文件的内容

[root@linux01 ~]# cat /data/3
003

内容也是存在的

到此,在原有数据的硬盘上创建drbd就已经成功了,接下来测试同步数据是否成功

7,测试同步数据

由上可知,原数据保留下来了,那么新的数据和原有数据是否可以同步到linux02上呢,下面就来验证一下,操作如下

先在linux01上创建数据文件5

[root@linux01 ~]# echo “005”>/data/5
[root@linux01 ~]# cat /data/5
005

卸载/data目录
[root@linux01 ~]# umount /data/

将linux01上的drbd0设置为secondary
[root@linux01 ~]# drbdsetup /dev/drbd0 secondary
[root@linux01 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-16 20:22:50
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r—-
ns:521197 nr:0 dw:1057 dr:521249 al:3 bm:34 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将linux02上的drbd0设置为primary
[root@linux02 ~]# drbdsetup /dev/drbd0 primary -o
[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-20 12:08:30
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—-
ns:0 nr:521197 dw:521197 dr:0 al:0 bm:32 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

mount到/data目录上
[root@linux02 ~]# mount /dev/drbd0 /data/
[root@linux02 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7744976   2878792   4466416  40% /
/dev/sda1               101086     12073     83794  13% /boot
tmpfs                    62800         0     62800   0% /dev/shm
/dev/drbd0              503780     10551    467220   3% /data

查看/data目录下数据
[root@linux02 ~]# ll /data/
total 24
-rw-r–r– 1 root root     4 Oct 16 20:25 0
-rw-r–r– 1 root root     4 Oct 16 20:25 1
-rw-r–r– 1 root root     4 Oct 16 20:25 2
-rw-r–r– 1 root root     4 Oct 16 20:25 3
-rw-r–r– 1 root root     4 Oct 16 20:25 4
-rw-r–r– 1 root root     4 Oct 16 20:39 5
drwx—— 2 root root 12288 Oct 16 20:25 lost+found
[root@linux02 ~]# cat /data/5
005
[root@linux02 ~]# cat /data/4
004

到此,蚊子对于在已有数据的硬盘上创建drbd同步的测试就做完了,这样看来就算硬盘上已有数据,也是可行的。有兴趣的朋友可以亲自尝试一下,正式环境操作前请做好备份工作。但在我试验的时候蚊子我还是有个疑问的。

蚊子这个试验是使用的一块独立硬盘做的测试,所以头1024字节就是这块硬盘的第一个扇区,如果要是在原有的一块大硬盘的一个独立分区里做的话,不知道这个头1024字节是那部分数据,这样做会不会有问题。

带着这个问题,蚊子还有有第二版的测试文档的。另外安装官方文档,如果硬盘已有数据,建议使用external meta data。

阅读全文

网上看到了这篇文章,对于drbd概念的理解还是很有帮助的。

DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

    在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。

底层设备支持

    DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在商脉内创建文件系统。DRBD所支持的底层设备有以下这些类:

    1、一个磁盘,或者是磁盘的某一个分区;

    2、一个soft raid 设备;

    3、一个LVM的逻辑卷;

    4、一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;

    5、其他任何的块设备。

    配置简介

    1、全局配置项(global)

        基本上我们可以做的也就是配置usage-count是yes还是no了,usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http协议发送信息到linbit公司的服务器上面。

    2、公共配置项(common)

        这里的common,指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等。

    3、资源配置项(resource)

        resource项中配置的是drbd所管理的所有资源,包括节点的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。每一个resource中都需要配置在每一个节点的信息,而不是单独本节点的信息。实际上,在drbd的整个集群中,每一个节点上面的 drbd.conf文件需要是完全一致的。

        另外,resource还有很多其他的内部配置项:

        net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等。

        startup:启动时候的相关设置,比如设置启动后谁作为primary(或者两者都是primary:become-primary-on both)

        syncer:同步相关的设置。可以设置“重新”同步(re-synchronization)速度(rate)设置,也可以设置是否在线校验节点之间的数据一致性(verify-alg 检测算法有md5,sha1以及crc32等)。数据校验可能是一个比较重要的事情,在打开在线校验功能后,我们可以通过相关命令(drbdadm verify resource_name)来启动在线校验。在校验过程中,drbd会记录下节点之间不一致的block,但是不会阻塞任何行为,即使是在该不一致的 block上面的io请求。当不一致的block发生后,drbd就需要有re-synchronization动作,而syncer里面设置的rate 项,主要就是用于re-synchronization的时候,因为如果有大量不一致的数据的时候,我们不可能将所有带宽都分配给drbd做re- synchronization,这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口,但是我们的磁盘 IO能力每秒只有50M,那么实际的处理能力就只有50M,一般来说,设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re- synchronization是比较合适的(官方说明)。另外,drbd还提供了一个临时的rate更改命令,可以临时性的更改syncer的rate 值:drbdsetup /dev/drbd0 syncer -r 100M。这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后,你需要通过 drbdadm adjust resource_name 来让drbd按照配置中的rate来工作。

资源管理

    1、增加resource的大小:

    当遇到我们的drbd resource设备容量不够的时候,而且我们的底层设备支持在线增大容量的时候(比如使用lvm的情况下),我们可以先增大底层设备的大小,然后再通过 drbdadm resize resource_name来实现对resource的扩容。但是这里有一点需要注意的就是只有在单primary模式下可以这样做,而且需要先在所有节点上都增大底层设备的容量。然后仅在primary节点上执行resize命令。在执行了resize命令后,将触发一次当前primary节点到其他所有secondary节点的re-synchronization。

    如果我们在drbd非工作状态下对底层设备进行了扩容,然后再启动drbd,将不需要执行resize命令(当然前提是在配置文件中没有对disk参数项指定大小),drbd自己会知道已经增大了容量。

    在进行底层设备的增容操作的时候千万不要修改到原设备上面的数据,尤其是drbd的meta信息,否则有可能毁掉所有数据。

    2、收缩resource容量:

    容量收缩比扩容操作要危险得多,因为该操作更容易造成数据丢失。在收缩resource的容量之前,必须先收缩drbd设备之上的容量,也就是文件系统的大小。如果上层文件系统不支持收缩,那么resource也没办法收缩容量。

    如果在配置drbd的时候将meta信息配置成internal的,那么在进行容量收缩的时候,千万别只计算自身数据所需要的空间大小,还要将drbd的meta信息所需要的空间大小加上。

    当文件系统收缩好以后,就可以在线通过以下命令来重设resource的大小:drbdadm — –size=***G resize resource_name。在收缩的resource的大小之后,你就可以自行收缩释放底层设备空间(如果支持的话)。

    如果打算停机状态下收缩容量,可以通过以下步骤进行:

        a、在线收缩文件系统

        b、停用drbd的resource:drbdadm down resourcec_name

        c、导出drbd的metadata信息(在所有节点都需要进行):drbdadm dump-md resource_name > /path_you_want_to_save/file_name

        d、在所有节点收缩底层设备

        e、更改上面dump出来的meta信息的la-size-sect项到收缩后的大小(是换算成sector的数量后的数值)

   f、如果使用的是internal来配置meta-data信息,则需要重新创建meta-data:drbdadm create-md resource_name

   g、将之前导出并修改好的meta信息重新导入drbd(摘录自linbit官方网站的一段导入代码):

    drbdmeta_cmd=$(drbdadm -d dump-md test-disk)

            ${drbdmeta_cmd/dump-md/restore-md} /path_you_want_to_save/file_name
        h、启动resource:drbdadm up resource_name

磁盘损坏

    1、detach resource

        如果在resource的disk配置项中配置了on_io_error为pass_on的话,那么drbd在遇到磁盘损坏后不会自己detach底层设备。也就是说需要我们手动执行detach的命令(drbdadm detach resource_name),然后再查看当前各节点的ds信息。可以通过cat /proc/drbd来查看,也可以通过专有命令来查看:drbdadm dstat resource_name。当发现损坏的那方已经是Diskless后,即可。如果我们没有配置on_io_error或者配置成detach的话,那么上面的操作将会由自动进行。

        另外,如果磁盘损坏的节点是当前主节点,那么我们需要进行节点切换的操作后再进行上面的操作。

    2、更换磁盘

        当detach了resource之后,就是更换磁盘了。如果我们使用的是internal的meta-data,那么在换好磁盘后,只需要重新创建 mata-data(drbdadm create-md resource_name),再将resource attach上(drbdadm attach resource_name),然后drbd就会马上开始从当前primary节点到本节点的re-synchronisation。数据同步的实时状况可以通过 /proc/drbd文件的内容获得。

        不过,如果我们使用的不是internal的meta-data保存方式,也就是说我们的meta-data是保存在resource之外的地方的。那么我们在完成上面的操作(重建meta-data)之后,还需要进行一项操作来触发re-synchnorisation,所需命令为:drbdadm invalidate resource_name 。

   节点crash(或计划内维护)

    1、secondary节点

        如果是secondary接待你crash,那么primary将临时性的与secondary断开连接,cs状态应该会变成WFConnection,也就是等待连接的状态。这时候primary会继续对外提供服务,并在meta-data里面记录下从失去secondary连接后所有变化过的 block的信息。当secondary重新启动并连接上primary后,primary –> secondary的re-synchnorisation会自动开始。不过在re-synchnorisation过程中,primary和 secondary的数据是不一致状态的。也就是说,如果这个时候primary节点也crash了的话,secondary是没办法切换成 primary的。也就是说,如果没有其他备份的话,将丢失所有数据。

    2、primary节点

        一般情况下,primary的crash和secondary的crash所带来的影响对drbd来说基本上是差不多的。唯一的区别就是需要多操作一步将 secondary节点switch成primary节点先对外提供服务。这个switch的过程drbd自己是不会完成的,需要我们人为干预进行一些操作才能完成。当crash的原primary节点修复并重新启动连接到现在的primary后,会以secondary存在,并开始re- synchnorisation这段时间变化的数据。

        在primary节点crash的情况下,drbd可以保证同步到原secondary的数据的一致性,这样就避免了当primary节点crash之后,secondary因为数据的不一致性而无法wcitch成primary或者即使切换成primary后因为不一致的数据无法提供正常的服务的问题。

    3、节点永久性损坏(需要更换机器或重新安装相关软件的情况)

        当某一个节点因为硬件(或软件)的问题,导致某一节点已经无法再轻易修复并提供服务,也就是说我们所面对的是需要更换主机(或从OS层开始重新安装)的问题。在遇到这样的问题后,我们所需要做的是重新提供一台和原节点差不多的机器,重新开始安装os,安装相关软件,从现有整提供服务的节点上copy出 drbd的配置文件(/etc/drbd.conf),创建meta-data信息,然后启动drbd服务,以一个secondary的身份连接到现有的 primary上面,后面就会自动开始re-synchnorisation。

    split brain的处理

    split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。

    如果我们在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,具体解决策略是根据配置中的设置来进行的。

    如果没有配置split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,我们就可以通过以下操作来恢复了:

    a、首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:

        drbdadm secondary resource_name

        drbdadm — –discard-my-data connect resource_name

    b、在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)

        drbdadm connect resource_name

    当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始。

meta data存放地点的比较

    1、internal meta-data(meta-data和数据存放在同一个底层设备之上)

    优点:一旦meta-data创建之后,就和实际数据绑在了一起,在维护上会更简单方便,不用担心meta-data会因为某些操作而丢失。另外在硬盘损坏丢失数据的同时,meta-data也跟着一起丢失,当更换硬盘之后,只需要执行重建meta-data的命令即可,丢失的数据会很容易的从其他节点同步过来。

    缺点:如果底层设备是单一的磁盘,没有做raid,也不是lvm等,那么可能会造成性能影响。因为每一次写io都需要更新meta-data里面的信息,那么每次写io都会有两次,而且肯定会有磁头的较大寻道移动,因为meta-data都是记录在dice设备的最末端的,这样就会造成写io的性能降低。

    2、external meta data(meta-data存放在独立的,与存放数据的设备分开的设备之上)

    优点:与internal meta-data的缺点完全相对,可以解决写io的争用问题。

    缺点:由于meta-data存放在与数据设备分开的地方,就意味着当磁盘损坏更换磁盘之后,必须手动发起全量同步的操作。也就是管理维护会稍微麻烦那么一点点,很小的一点点。

    如果我们希望在已经存在数据的设备上面建立drbd的资源,并且不希望丢失该设备上面的数据,又没办法增大底层设备的容量,而且上层文件系统又没办法收缩的话,我们就只能将meta data创建成external方式。

阅读全文

快速删除部分配置文件

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

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的官网上发现了这样的一条提示

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

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

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

下面先给个Pacemaker的结构图

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

阅读全文

苦于上次配置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

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

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

阅读全文