linux lvs dr源码,LVS+Keepalived DR模式(附脚本)

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

$?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值