192.168.10.102
查看调度结果,watch
-n 1 ipvsadm -L -n
两台http服务器:
VIP:192.168.10.100
RealServer1:192.168.10.11
RealServer2:192.168.10.12
客户端:
CIP:192.168.10.2
压力测试, ab
-n 10000 192.168.10.100/
下面是脚本源码定义的一些变量,有需要的可心自行修改。
注意:脚本2,脚本4是直接生成配置文件重启仍然生效,脚本3和脚本5只是当前生效重启后需再次运行。
#Define E-mail &
Smtp_Server #定义keepalived.conf中global_defs{ }段中的通知邮箱及邮件SMTP服务器地址,为空则保持默认Mail1=
Mail2=
Mail3=
Smtp_Server=
#Define keepalived "MASTER" or
"BACKUP" #定义keepalived的主备和优先级State_Flag=MASTER
State_Flag_Priority=100
#State_Flag=BACKUP
#State_Flag_Priority=80
#Define Virtual Server IP &
Listen
Port #定义VIP和监听端口
VIP1=192.168.10.100
VIP1_Listen_Port=80
VIP2=
VIP2_Listen_Port=
#Define Real Server IP &
Listen
Port #定义RIP和监听端口
VIP1_RIP1=192.168.10.11
VIP1_RIP1_Listen_Port=80
VIP1_RIP2=192.168.10.12
VIP1_RIP2_Listen_Port=80
VIP1_RIP3=
VIP1_RIP3_Listen_Port=
VIP2_RIP1=
VIP2_RIP1_Listen_Port=
VIP2_RIP2=
VIP2_RIP2_Listen_Port=
VIP2_RIP3=
VIP2_RIP3_Listen_Port=
#Define
Weight #定义RIP权重
Weight_VIP1_RIP1=1
Weight_VIP1_RIP2=2
Weight_VIP1_RIP3=3
Weight_VIP2_RIP1=
Weight_VIP2_RIP2=
Weight_VIP2_RIP3=
#Define Schedule &
Model #定义调度算法(静态算法rr, wrr, dh, sh;动态算法lc, wlc, sed, nq, lblc,
lvlcr)和lvs包转发模型(NAT|DR|TUN),具体的说明请自行man ipvsadm或者man
keepalived.conf 以下是man ipvsadm的简单说明:
three packet-forwarding methods (NAT, tunneling, and direct routing), and
eight loadbalancing algorithms (round robin, weighted round
robin, least-connec-tion, weighted least-connection, locality-based least-connection, locality-based
least-connection with replication, destination-hashing,and source-hashing).Schedule_VIP1=wlc
Mode_VIP1=DR
Schedule_VIP2=
Mode_VIP2=
脚本1:调度器keepalived安装脚本源码:
############################################
#!/bin/bash
#To
install keepalived automatically
#Made by
liujun,2014/08/15
############################################
#Define
system environment PATH
export
PATH=$PATH
#Source
function library
.
/etc/rc.d/init.d/functions
#Define
Keepalived Version
Keepalived_Version=1.2.13
Install_Directory=/usr/local/src
#Install
the build-essential
PACKAGE="kernel-devel
gcc openssl-devel popt-devel libnl-devel
net-snmp-devel"
for i in
$PACKAGE
do
FLAG=$(rpm -qa|grep -w $i)
if [ "$FLAG" == "" ];then
yum -y
install $i
else
echo -e
"\e[32;1m$i\e[0m is installed"
fi
done
echo -e
"\n"
echo -e
"... ...\n"
sleep
1
echo -e
"... ...\n"
echo -e
"\n"
#Build
and install
tar -xvf
keepalived-$Keepalived_Version.tar.gz -C
/usr/local/src
cd
/usr/local/src/keepalived-$Keepalived_Version
./configure \
--prefix=/usr
\
--sysconf=/etc
\
--with-kernel-dir=/usr/src/kernels/$(uname
-r) \
--enable-snmp
\
--enable-sha1
make
&& make install
echo -e
"\n"
echo -e
"\e[31;1mkeepalived\e[0m is
\e[32;1minstalled\e[0m"
echo -e
"\n"
#Autostart on init
3/5
#cp
$Install_Directory/keepalived-$Keepalived_Version/keepalived/etc/init.d/keepalived.init
/etc/rc.d/rc3.d/S99keepalived
#cp
$Install_Directory/keepalived-$Keepalived_Version/keepalived/etc/init.d/keepalived.init
/etc/rc.d/rc5.d/S99keepalived
chkconfig keepalived
on
chkconfig --list
keepalived
###################################################
##########################
#Build
keepalived.conf
##########################
#Define
E-mail & Smtp_Server
Mail1=
Mail2=
Mail3=
Smtp_Server=
#Define
keepalived "MASTER" or "BACKUP"
State_Flag=MASTER
State_Flag_Priority=100
#State_Flag=BACKUP
#State_Flag_Priority=80
#Define
Virtual Server IP & Listen Port
VIP1=192.168.10.100
VIP1_Listen_Port=80
VIP2=
VIP2_Listen_Port=
#Define
Real Server IP & Listen Port
VIP1_RIP1=192.168.10.11
VIP1_RIP1_Listen_Port=80
VIP1_RIP2=192.168.10.12
VIP1_RIP2_Listen_Port=80
VIP1_RIP3=
VIP1_RIP3_Listen_Port=
VIP2_RIP1=
VIP2_RIP1_Listen_Port=
VIP2_RIP2=
VIP2_RIP2_Listen_Port=
VIP2_RIP3=
VIP2_RIP3_Listen_Port=
#Define
Weight
Weight_VIP1_RIP1=1
Weight_VIP1_RIP2=2
Weight_VIP1_RIP3=3
Weight_VIP2_RIP1=
Weight_VIP2_RIP2=
Weight_VIP2_RIP3=
#Define
Schedule & Model
Schedule_VIP1=wlc
Mode_VIP1=DR
Schedule_VIP2=
Mode_VIP2=
mv
/etc/keepalived/keepalived.conf{,.bak}
cat
>/etc/keepalived/keepalived.conf <
!
Configuration File for keepalived
global_defs
{
notification_email {
${Mail1:-acassen@firewall.loc}
${Mail2:-failover@firewall.loc}
${Mail3:-sysadmin@firewall.loc}
}
notification_email_from
Alexandre.Cassen@firewall.loc
smtp_server ${Smtp_Server:-192.168.200.1}
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1
{
state $State_Flag
interface eth0
virtual_router_id 51
priority $State_Flag_Priority
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
$VIP1
$VIP2
}
}
virtual_server $VIP1
$VIP1_Listen_Port {
delay_loop 6
lb_algo $Schedule_VIP1
lb_kind $Mode_VIP1
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server $VIP1_RIP1 $VIP1_RIP1_Listen_Port {
weight $Weight_VIP1_RIP1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server $VIP1_RIP2 $VIP1_RIP2_Listen_Port {
weight $Weight_VIP1_RIP2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
! real_server $VIP1_RIP3 $VIP1_RIP3_Listen_Port {
! weight $Weight_VIP1_RIP3
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
}
!virtual_server
$VIP2 $VIP2_Listen_Port {
! delay_loop 6
! lb_algo $Schedule_VIP2
! lb_kind $Mode_VIP2
! nat_mask 255.255.255.0
! persistence_timeout 50
! protocol TCP
!
! real_server $VIP2_RIP1 $VIP2_RIP1_Listen_Port {
! weight $Weight_VIP2_RIP1
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
! real_server $VIP2_RIP2 $VIP2_RIP2_Listen_Port {
! weight $Weight_VIP2_RIP2
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
! real_server $VIP2_RIP3 $VIP1_RIP3_Listen_Port {
! weight $Weight_VIP2_RIP3
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
!}
HERE
echo -e
"\n"
/etc/init.d/keepalived
start
sleep
1
echo -e
"\n"
/etc/init.d/keepalived
restart
###################################################
脚本2:调度器子接口及路由配置脚本(永久生效)
############################################
#!/bin/bash
#To
contribute to lvs_dr
#Made by
liujun,2014/08/11
############################################
#Define
system environment PATH
export
PATH=$PATH
#Source
function library
.
/etc/rc.d/init.d/functions
#Define
Variable
Sysconfig_Dir=/etc/sysconfig/network-scripts
VIP=192.168.10.100
Eth=lo
Eth_Child_Num=0
#################
#Define
functions
#################
network_restart()
{
echo -e
"\e[31;1mNetworking\e[0m \e[32;1mrestart\e[0m\n"
/etc/init.d/network
restart
}
start_begin()
{
echo -e
"\e[31;1mActiving\e[0m
\e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mAdding\e[0m route rules to
\e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mChanging\e[0m \e[32;1mkernel
args\e[0m\n"
echo -e
"... ..."
sleep
0.5
}
start_end()
{
sleep
0.5
echo -e
"\n"
echo -e
"ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is
\e[31;1mactived!\e[0m\n$(ifconfig
$Eth:$Eth_Child_Num)"
echo -e
"\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route -ne|grep
$VIP)"
echo -e
"\e[31;1mKernel args\e[0m has been \e[32;1mattached!\e[0m\n$(sysctl
-p 2>/dev/null|grep arp_)"
}
stop_begin()
{
echo -e
"\e[31;1mRemoving\e[0m route rules from
\e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mInactiving\e[0m \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mRestoring\e[0m \e[32;1mkernel
args\e[0m\n"
echo -e
"... ..."
}
stop_end()
{
sleep
0.5
echo -e
"\n"
echo -e
"The \e[31;1mroute rules\e[0m is
\e[32;1mremoved\e[0m\r"
echo -e
"The ifcfg-\e[31;1m$Eth:$Eth_Child_Num\e[0m is
\e[32;1minactived\e[0m\r"
echo -e
"\e[31;1mKernel args\e[0m has been \e[32;1mrestored!\e[0m\n$(sysctl
-p >/dev/null 2>&1|grep arp_)"
sleep
0.5
}
status()
{
echo -e
"\n"
if [
"$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == ""
];then
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is
\e[31;1minactived!\e[0m\n"
echo -e "\e[31;1mNo route \e[0m to
\e[32;1m$Eth:$Eth_Child_Num\e[0m\n"
echo -e "\e[31;1mKernel args\e[0m is
\e[32;1mrequired!\e[0m\n"
else
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is
\e[31;1mactived!\e[0m\n$(ifconfig
$Eth:$Eth_Child_Num)"
echo -e "\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route
-ne|grep $VIP)"
echo -e "\e[31;1mKernel args\e[0m has been
\e[32;1mattached!\e[0m\n$(sysctl -p 2>/dev/null|grep
arp_)"
fi
}
start()
{
#Build
/etc/sysconfig/network-scripts/ifcfg-lo:0
start_begin
if ! [
-f $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num ];then
cat > $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num
<
DEVICE=$Eth:$Eth_Child_Num
BOOTPROTO=static
IPADDR=$VIP
NETMASK=255.255.255.255
BROADCAST=$VIP
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
HERE
fi
#Build
/etc/sysconfig/network-scripts/route-lo:0
if ! [
-f $Sysconfig_Dir/route-$Eth:$Eth_Child_Num ];then
cat
>$Sysconfig_Dir/route-$Eth:$Eth_Child_Num
<
$VIP dev $Eth:$Eth_Child_Num
HERE
fi
#Modify
kernel args
if [
"$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == ""
];then
echo
"
net.ipv4.conf.lo.arp_ignore
= 1
net.ipv4.conf.all.arp_ignore
= 1
net.ipv4.conf.lo.arp_announce
= 2
net.ipv4.conf.all.arp_announce
= 2">>/etc/sysctl.conf
fi
network_restart
start_end
}
stop()
{
stop_begin
rm -rf
$Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num >/dev/null
2>&1
rm -rf
$Sysconfig_Dir/route-$Eth:$Eth_Child_Num >/dev/null
2>&1
sed -i
'/net.ipv4.conf.lo.arp_ignore = 1/ d'
/etc/sysctl.conf
sed -i
'/net.ipv4.conf.all.arp_ignore = 1/ d'
/etc/sysctl.conf
sed -i
'/net.ipv4.conf.lo.arp_announce = 2/ d'
/etc/sysctl.conf
sed -i
'/net.ipv4.conf.all.arp_announce = 2/ d'
/etc/sysctl.conf
stop_end
network_restart
}
#How to
use
case $1
in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
echo -e
"########################################################"
echo -e "\n\n\n\n\n\n\n\n\n"
echo -e
"########################################################"
start
;;
status)
status
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m
\e[34;1m{start|stop|restart|status}\e[0m"
exit 1
;;
esac
exit
$?
脚本3:调度器子接口及路由配置脚本(临时生效)
############################################
#!/bin/bash
#To
contribute to lvs_dr
#Made by
liujun,2014/08/11
############################################
#Define
system environment PATH
export
PATH=$PATH
#Source
function library
.
/etc/rc.d/init.d/functions
VIP=192.168.10.100
#Define function
start()
{
ifconfig eth0:0 $VIP netmask 255.255.255.255 broadcast $VIP
up
route add -host $VIP dev eth0:0
echo -e "Derector \e[32;1mstarted\e[0m"
}
stop()
{
route del -host $VIP dev eth0:0
ifconfig eth0:0 down
echo -e "Derector \e[31;1mstopped\e[0m"
}
case $1
in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m
\e[34;1m{start|stop|restart}\e[0m"
exit 1
;;
esac
exit
$?
脚本4:RealServer子接口,路由配置及内核参数修改脚本(永久生效)
############################################
#!/bin/bash
#modify
kernel args to contribute to lvs_dr
#Made by
liujun,2014/08/11
############################################
#Define
system environment PATH
export
PATH=$PATH
#Source
function library
.
/etc/rc.d/init.d/functions
#Define
Variable
Sysconfig_Dir=/etc/sysconfig/network-scripts
VIP=192.168.10.100
Eth=lo
Eth_Child_Num=0
#################
#Define
functions
#################
network_restart()
{
echo -e
"\e[31;1mNetworking\e[0m \e[32;1mrestart\e[0m\n"
/etc/init.d/network
restart
}
start_begin()
{
echo -e
"\e[31;1mActiving\e[0m
\e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mAdding\e[0m route rules to
\e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mChanging\e[0m \e[32;1mkernel
args\e[0m\n"
echo -e
"... ..."
sleep
0.5
}
start_end()
{
sleep
0.5
echo -e
"\n"
echo -e
"ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is
\e[31;1mactived!\e[0m\n$(ifconfig
$Eth:$Eth_Child_Num)"
echo -e
"\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route -ne|grep
$VIP)"
echo -e
"\e[31;1mKernel args\e[0m has been \e[32;1mattached!\e[0m\n$(sysctl
-p 2>/dev/null|grep arp_)"
}
stop_begin()
{
echo -e
"\e[31;1mRemoving\e[0m route rules from
\e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mInactiving\e[0m \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep
0.5
echo -e
"\e[31;1mRestoring\e[0m \e[32;1mkernel
args\e[0m\n"
echo -e
"... ..."
}
stop_end()
{
sleep
0.5
echo -e
"\n"
echo -e
"The \e[31;1mroute rules\e[0m is
\e[32;1mremoved\e[0m\r"
echo -e
"The ifcfg-\e[31;1m$Eth:$Eth_Child_Num\e[0m is
\e[32;1minactived\e[0m\r"
echo -e
"\e[31;1mKernel args\e[0m has been \e[32;1mrestored!\e[0m\n$(sysctl
-p >/dev/null 2>&1|grep arp_)"
sleep
0.5
}
status()
{
echo -e
"\n"
if [
"$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == ""
];then
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is
\e[31;1minactived!\e[0m\n"
echo -e "\e[31;1mNo route \e[0m to
\e[32;1m$Eth:$Eth_Child_Num\e[0m\n"
echo -e "\e[31;1mKernel args\e[0m is
\e[32;1mrequired!\e[0m\n"
else
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is
\e[31;1mactived!\e[0m\n$(ifconfig
$Eth:$Eth_Child_Num)"
echo -e "\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route
-ne|grep $VIP)"
echo -e "\e[31;1mKernel args\e[0m has been
\e[32;1mattached!\e[0m\n$(sysctl -p 2>/dev/null|grep
arp_)"
fi
}
start()
{
#Build
/etc/sysconfig/network-scripts/ifcfg-lo:0
start_begin
if ! [
-f $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num ];then
cat > $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num
<
DEVICE=$Eth:$Eth_Child_Num
BOOTPROTO=static
IPADDR=$VIP
NETMASK=255.255.255.255
BROADCAST=$VIP
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
HERE
fi
#Build
/etc/sysconfig/network-scripts/route-lo:0
if ! [
-f $Sysconfig_Dir/route-$Eth:$Eth_Child_Num ];then
cat
>$Sysconfig_Dir/route-$Eth:$Eth_Child_Num
<
$VIP dev $Eth:$Eth_Child_Num
HERE
fi
#Modify
kernel args
if [
"$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == ""
];then
echo
"
net.ipv4.conf.lo.arp_ignore
= 1
net.ipv4.conf.all.arp_ignore
= 1
net.ipv4.conf.lo.arp_announce
= 2
net.ipv4.conf.all.arp_announce
= 2">>/etc/sysctl.conf
fi
network_restart
start_end
}
stop()
{
stop_begin
rm -rf
$Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num >/dev/null
2>&1
rm -rf
$Sysconfig_Dir/route-$Eth:$Eth_Child_Num >/dev/null
2>&1
sed -i
'/net.ipv4.conf.lo.arp_ignore = 1/ d'
/etc/sysctl.conf
sed -i
'/net.ipv4.conf.all.arp_ignore = 1/ d'
/etc/sysctl.conf
sed -i
'/net.ipv4.conf.lo.arp_announce = 2/ d'
/etc/sysctl.conf
sed -i
'/net.ipv4.conf.all.arp_announce = 2/ d'
/etc/sysctl.conf
stop_end
network_restart
}
#How to
use
case $1
in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
echo -e
"########################################################"
echo -e "\n\n\n\n\n\n\n\n\n"
echo -e
"########################################################"
start
;;
status)
status
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m
\e[34;1m{start|stop|restart|status}\e[0m"
exit 1
;;
esac
exit
$?
脚本5:RealServer子接口,路由配置及内核参数修改脚本(临时生效)
############################################
#!/bin/bash
#modify
kernel args to contribute to lvs_dr
#Made by
liujun,2014/08/11
############################################
#Define
system environment PATH
export
PATH=$PATH
#Source
function library
.
/etc/rc.d/init.d/functions
VIP=192.168.10.100
#Define function
start()
{
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up
>/dev/null 2>&1
route add -host $VIP dev lo:0 >/dev/null
2>&1
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2
>/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo -e "RealServer \e[32;1mstarted\e[0m"
}
stop()
{
route del -host $VIP dev lo:0 >/dev/null
2>&1
ifconfig lo:0 down >/dev/null 2>&1
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 0
>/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo -e "RealServer \e[31;1mstopped\e[0m"
}
case $1
in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m
\e[34;1m{start|stop|restart}\e[0m"
exit 1
;;
esac
exit
$?