利用ucarp實現虛擬IP故障轉移

一、概述

  1. UCARP簡介
    UCARP允許多個主機共享一個虛擬的ip地址,以提供自動的故障恢復功能,當其中某個主機宕機時,其它的主機會自動接管服務。UCARP是CARP協議(通用地址冗餘協議,最早在OpenBSD上實現)的linux實現版本,同時也能移植到其它多個unix平臺,UCARP的官方網站:http://www.ucarp.org/project/ucarp
    CARP協議的特點在於其非常低的開銷,主機間使用加密數據傳遞信息,並且在冗餘主機之間不需要任何額外的網絡鏈接(在README中有ucarp的簡單部署實例)。

2.配置需求
兩個或多個主機以構成冗餘主機組;
一個共享的虛擬ip地址,用以對外提供可靠的服務,冗餘主機組中的某個主機會對會對這個ip上的服務進行應答;
對於每個主機,需要配置一個真實的ip地址;
一個1-255之間的共享標識符;
一個共享的密碼(使得網絡間傳輸的消息都爲密文);
當冗餘組中某個主機成爲MASTER時執行的腳本程序;
當冗餘組中某個主機不再是MASTER是執行的腳本程序;

3 Ucap具體參數詳解
--inter (-i <if>: bind interface <if> (網絡接口綁定網絡接口)
--srcip=<ip> (-s <ip>: source (real) IP address of that host (源地址真實ip)
--vhid=<id> (-v <id>: virtual IP identifier (1-255) (虛擬ip標識 (1-255))
--pass=<pass> (-p <pass>: password (密碼)
--preempt (-P): becomes a master as soon as possible (以最快的速度成爲主服務器的角色)
--neutral (-n): don't run downscript at start if backup (如果是備份主機,啓動的時候不運行downscript.)
--addr=<ip> (-a <ip>: virtual shared IP address( 共享虛擬ip地址)
--help (-h): summary of command-line options (幫助)
--advbase=<seconds> (-b <seconds>: advertisement frequency (廣播的頻率(秒))
--advskew=<skew> (-k <skew>: advertisement skew (0-255) (不廣播)用來設置公告間隔時間, 公式(以秒計)爲advskew/256+advbase。advbase可以減少網絡流量或設置更長的主力機"輪循"時間(直至備份機來頂替它);advskew設置哪臺熱備份計算機在故障轉移時優先成爲主力機(這是必需的)
--upscript=<file> (-u <file>: run <file> to become a master (運行一個腳本文件,使本服務器成爲主服務器)
--downscript=<file> (-d <file>: run <file> to become a backup (運行一個腳本文件,使本服務器成爲從服務器)
--deadratio=<ratio> (-r <ratio>: ratio to consider a host as dead (認定主機已經死掉的比率(閥值))
--shutdown (-z): call shutdown script at exit (在退出的時候,執行關閉的腳本)
--daemonize (-B): run in background (運行在後臺)
--facility=<facility> (-f): set syslog facility (default=daemon) (設置syslog工具,默認在後臺)

Ucarp參數簡述:
-v vip標識 –p 密碼 –a vip地址 –u 當機器爲升爲master時運行的腳本 –d 當機器降爲slave時運行的腳本 –s心跳ip地址 –P與-k結合最小的爲master機器 –B以daemon方式運行

4.實驗環境
Role hostname real_ip vip gateway OS
master node2 192.168.32.32/24 192.168.32.22/24 192.168.32.254 rhel5.5
slave node3 192.168.32.33/24 192.168.32.22/24 192.168.32.254 rhel5.5

二、安裝配置
1、安裝
[root@node2 ~]# tar -zxf ucarp-1.5.tar.gz #ucarp最好選擇1.2以上版本,1.1以下含有bug
[root@node2 ~]# cd ucarp-1.5
[root@node2 ucarp-1.5]# which gcc #確定gcc
/usr/bin/gcc
[root@node2 ucarp-1.5]# ./configure CC=/usr/bin/gcc --prefix=/usr/local/ucarp
[root@node2 ucarp-1.5]# make && make install

2、配置主服務器(node2)
2.1 編寫機器升爲master時運行的腳本
[root@node2 ~]# vim /etc/master-up.sh
#!/bin/bash
GATEWAY=192.168.32.254
/sbin/ip addr add 192.168.32.22/24 dev eth0
/bin/hostname nodevir2
/sbin/route add default gw $GATEWAY
service httpd start

2.2 編寫機器降爲slave時運行的腳本
[root@node2 ~]# vim /etc/master-down.sh
#!/bin/bash
GATEWAY=192.168.32.254
/sbin/ip addr del 192.168.32.22/24 dev eth0
/bin/hostname node2
/sbin/route add default gw $GATEWAY
service httpd stop

2.3 編寫ucarp運行腳本
[root@node2 ~]# vim /etc/master.sh
#!/bin/bash
/usr/local/ucarp/sbin/ucarp -i eth0 -v 40 -p gw22 -a 192.168.32.22 -u /etc/master-up.sh -d /etc/master-down.sh -s 192.168.32.32 -P -B

2.4 啓動服務
[root@node2 ~]# . /etc/master.sh
[root@node2 ~]# ps -ef | grep ucarp
root 11695 1 0 11:33 ? 00:00:00 /usr/local/ucarp/sbin/ucarp -i eth0 -v 40 -p gw22 -a 192.168.32.22 -u /root/master-up.sh -d /root/master-down.sh -s 192.168.32.32 -P -B
[root@node2 ~]# hostname #hostname切換成功
nodevir2
[root@node2 ~]# ip addr show | grep 22 #master-up.sh腳本生效
inet 192.168.32.22/24 scope global secondary eth0
[root@nodevir2 ~]# ps -ef | grep httpd #httpd服務啓動
root 11726 1 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11727 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11729 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11730 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11731 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11732 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11733 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11734 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
apache 11735 11726 0 11:33 ? 00:00:00 /usr/sbin/httpd
root 11897 6167 0 11:44 pts/1 00:00:00 grep httpd

3.配置備服務器(node3)
3.1 編寫機器升爲master時運行的腳本
[root@node3 ~]# vim /etc/master-up.sh
#!/bin/bash
GATEWAY=192.168.32.254
/sbin/ip addr add 192.168.32.22/24 dev eth0
/bin/hostname nodevir2
/sbin/route add default gw $GATEWAY
service httpd start

3.2 編寫機器降爲slave時運行的腳本
[root@node2 ~]# vim /etc/master-down.sh
#!/bin/bash
GATEWAY=192.168.32.254
/sbin/ip addr del 192.168.32.22/24 dev eth0
/bin/hostname node3
/sbin/route add default gw $GATEWAY
service httpd stop

3.3 編寫ucarp運行腳本
[root@node2 ~]# vim /etc/master.sh
#!/bin/bash
/usr/local/ucarp/sbin/ucarp -i eth0 -v 40 -p gw22 -a 192.168.32.22 -u /etc/master-up.sh -d /etc/master-down.sh -s 192.168.32.33 -P -k 15 -B

3.4 啓動服務
[root@node2 ~]# . /etc/master.sh
root 5678 1 0 11:40 ? 00:00:00 /usr/local/ucarp/sbin/ucarp -v 40 -i eth0 -p gw22 -a 192.168.32.22 -u /root/master-up.sh -d /root/master-down.sh -s 192.168.32.33 -k 15 -B
[root@node3 ~]# ps -ef | grep httpd #httpd服務爲啓動
root 5788 32767 0 11:46 pts/1 00:00:00 grep httpd

三. 故障切換

  1. 主故障
    [root@nodevir2 ~]# kill 5678 #down掉ucarp服務,或重啓服務器

[root@node3 ~]# hostname #hostname切換成功
nodevir2
[root@node3 ~]# ip addr show | grep 22 #虛擬IP切換成功
inet 192.168.32.22/24 scope global secondary eth0
[root@node3 ~]# ps -ef | grep httpd #服務切換成功
root 5824 1 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5826 5824 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5827 5824 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5828 5824 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5829 5824 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5830 5824 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5831 5824 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5832 5824 0 11:47 ? 00:00:00 /usr/sbin/httpd
apache 5833 5824 0 11:47 ? 00:00:00 /

2.主恢復
[root@node2 ~]# . /etc/master.sh
[root@nodevir2 ~]# hostname
nodevir2
[root@node2 ~]# ps -ef | grep httpd
root 11969 1 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11970 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11972 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11973 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11974 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11975 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11976 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11977 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
apache 11978 11969 0 11:46 ? 00:00:00 /usr/sbin/httpd
[root@node2 ~]# ip addr show | grep 22
inet 192.168.32.22/24 scope global secondary eth0

[root@node3 ~]# hostname
node3
[root@node3 ~]# ps -ef | grep httpd
root 6148 32767 0 12:02 pts/1 00:00:00 grep httpd
[root@node3 ~]# ip addr show | grep 22 #成功切換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章