LVS+keepalived配置说明

linuxlogo

一.部署LVS 

1.1 LVS端配置 

1.1.1安装LVS(两台安装方法相同) 

1.1.2 手工配置LVS 

1.2 RS端配置 

1.2.1手工配置RS端绑定 

1.2.2 抑制ARP响应 

1.2.3 ARP抑制参数说明 

1.3 一键配置脚本(仅供娱乐使用) 

1.3.1 LVS端一键配置脚本 

1.3.2 RS端一键配置脚本 

1.3.3 LVS端健康检查脚本 

1.3.4 LVS端高可用脚本 

1.4 ipvsadm常用参数组合 

1.5 导致负载不均衡的可能原因 

1.6 LVS故障排错理论 

二. 部署keepalived 

2.1 keepalived的安装(两台LVS都装) 

2.2 keepalived的配置 

2.2.1 本次实验的配置文件LVS-01 

2.2.2 本次实验的配置文件LVS-02 

2.2.3 keepalived配置文件简单注释 

2.2.4 双主配置的配置文件参考 

2.3 高可用脑裂问题及解决方案 

 

声明:以下配置是LVS-DR模式的,生产环境以下的四台设备一般都应该是双网卡,分内外网,这边为了实验,而且就在一个局域网,所以省去了内网的配置。

 

拓扑图

222

环境

主机名 IP地址 业务 系统版本
LVS-01 192.168.1.141 lvs+keepalived CentOS release 6.4(Final)  2.6.32-358.el6.x86_64
LVS-02 192.168.1.142 lvs+keepalived CentOS release 6.4(Final)  2.6.32-358.el6.x86_64
web-01 192.168.1.143 httpd(test) CentOS release 6.4(Final)  2.6.32-358.el6.x86_64
web-02 192.168.1.144 httpd(test) CentOS release 6.4(Final)  2.6.32-358.el6.x86_64
192.168.1.145 VIP

 

部署web

略,这里是为了测试,直接yum 安装,其中web-01访问的内容为abc, web-02访问的内容为123。

 

一.部署LVS

1.1 LVS端配置

1.1.1安装LVS(两台安装方法相同)

yum install libnl* popt* -y

ln -s /usr/src/kernels/2.6.32-358.el6.x86_64/ /usr/src/linux

ll /usr/src/

mkdir -p /application/tools

cd /application/tools

wget  http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

tar zxf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make

make install

ipvsadm

lsmod |grep ip_vs

 

#注意:

①ln命令的链接路径要和uname -r输出结果内核版本对应,工作中如果安装虚拟化可以有多个内核路径。如果kernels目录下没有uname -r输出信息名的目录,需要安装 yum install kernel-devel -y

②ipvsadm-1.26适用于内核2.6.28及之后的内核版本。

③yum install libnl* popt* -y是安装依赖包

④lsmod |grep ip_vs 出现了ip_vs等信息,证明安装成功了。

⑤CentOS5.X安装LVS,使用1.2.4版本,不要用1.2.6.

1.1.2 手工配置LVS

①配置LVS虚拟IP(VIP)

ifconfig eth0:0 192.168.1.145/24 up

ifconfig eth0:0 #检查

②手工执行配置添加LVS服务并增加两台RS

ipvsadm -C #清空配置列表

ipvsadm -A -t 192.168.1.145:80 -s wrr  #添加虚拟IP,使用加权轮询算法

ipvsadm -a -t 192.168.1.145:80 -r 192.168.1.143 -g -w 1  #使用DR模式,添加一个RS

ipvsadm -a -t 192.168.1.145:80 -r 192.168.1.144 -g -w 1

③删除方法

ipvsadm -D -t 192.168.1.145:80 -s wrr

ipvsadm -d -t 192.168.1.145:80 -r 192.168.1.143:80

 

1.2 RS端配置

1.2.1手工配置RS端绑定

绑定VIP

ifconfig lo:145 192.168.1.145 netmask 255.255.255.255 up  #<==注意:子网掩码的特殊。

route add -host 192.168.1.145 dev lo

ifconfig lo:145

1.2.2 抑制ARP响应

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

1.2.3 ARP抑制参数说明

arp_ignore-INTEGER

定义对目标地址为本地IP的ARP询问不同的应答模式

0-(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求。

1-只回答目标IP地址是来访网络接口本地地址的ARP查询请求。

2-只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。

3-不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。

4-7-保留未使用。

8-不回应所有(本地地址)的arp查询。

 

arp_announce-INTEGER

对网络接口上,本地IP地址发出的,ARP回应,做出相应级别的限制,确定不同程度的限制,宣布对来自本地源IP地址发出ARP请求的接口。

0-(默认)在任意网络接口(eth0,eth1,lo)上的任何本地地址

1-尽量避免不在该网络接口子网段的本地地址做出ARP回应,当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用,此时会检查来访IP是否所有接口上的子网段内ip之一。如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。

2-对查询目标是用最适合的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址,首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的可能接受到该ARP回应的网络接口来进行发送,限制了使用本地的VIP地址作为优先的网络接口。

1.3 一键配置脚本(仅供娱乐使用)

1.3.1 LVS端一键配置脚本

#!/bin/sh

#

[ -f "/etc/init.d/functions" ] && . /etc/init.d/functions

#

RSIP=(

192.168.1.143

192.168.1.144

)

VIP=(

192.168.1.145

)

#

start(){

#clear ipvs-list

/sbin/ipvsadm -C

#add LVS VIP and scheduling algorithm

for ((i=0;i<${#VIP[*]};i++))

do

/sbin/ifconfig eth0:$i ${VIP[$i]}/24 up  >/dev/null 2>&1

/sbin/ipvsadm -A -t ${VIP[$i]}:80 -s wrr   >/dev/null 2>&1

#add RSIP

for ((n=0;n<${#RSIP[*]};n++))

do

/sbin/ipvsadm -a -t ${VIP[$i]}:80 -r ${RSIP[$n]}:80 -g -w 1

done

done

}

#

stop(){

#clear ipvs-list

/sbin/ipvsadm -C

#clear VIP

for ((i=0;i<${#VIP[*]};i++))

do

/sbin/ifconfig eth0:$i ${VIP[$i]}/24 down

done

}

#

case "$1" in

start)

start

if [ $? -eq 0 ];then

action "ipvs start sucess"  /bin/true

else

action "ipvs start failed " /bin/false

fi

;;

stop)

stop

if [ $? -eq 0 ];then

action "ipvs stop sucess"  /bin/true

else

action "ipvs stop failed " /bin/false

fi

;;

*)

echo "USAGE:$0 {start|stop}"

esac

1.3.2 RS端一键配置脚本

#!/bin/sh

[ -f "/etc/init.d/functions" ] && . /etc/init.d/functions

VIP=(

192.168.1.145

)

start(){

#bind VIP

for ((i=0;i<${#VIP[*]};i++))

do

/sbin/ifconfig lo:$i ${VIP[$i]} netmask 255.255.255.255 up  >/dev/null 2>&1

done

#ARP restrain

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

}

 

stop(){

for ((i=0;i<${#VIP[*]};i++))

do

/sbin/ifconfig lo:$i ${VIP[$i]} netmask 255.255.255.255 down

done

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

}

 

case "$1" in

start)

start

if [ $? -eq 0 ];then

action "ipvs start sucess"  /bin/true

else

action "ipvs start failed " /bin/false

fi

;;

stop)

stop

if [ $? -eq 0 ];then

action "ipvs stop sucess"  /bin/true

else

action "ipvs stop failed " /bin/false

fi

;;

*)

echo "USAGE:$0 {start|stop}"

esac

1.3.3 LVS端健康检查脚本

#!/bin/sh

RSIP=(

192.168.1.143

192.168.1.144

)

VIP=192.168.1.145

while true

do

for((i=0;i<${#RSIP[*]};i++))

do

OPEN=`nmap ${RSIP[$i]} -p 80 |grep open|wc -l`

LIST=`/sbin/ipvsadm -Ln |grep -w "${RSIP[$i]}"|wc -l`

if [ $OPEN -eq 0 -a $LIST -eq 1 ];then

/sbin/ipvsadm -d -t $VIP:80 -r ${RSIP[$i]}:80   >/dev/null 2>&1

echo "${RSIP[$i]} is down" >>/tmp/downlist

elif [ $OPEN -eq 1 -a $LIST -eq 0 ];then

/sbin/ipvsadm -a -t $VIP:80 -r ${RSIP[$i]}:80 -g -w 1   >/dev/null 2>&1

echo "${RSIP[$i]} is up"  >>/tmp/uplist

fi

done

sleep 2

done

1.3.4 LVS端高可用脚本

#!/bin/sh

#

RSIP=(

192.168.1.143

192.168.1.144

)

VIP=(

192.168.1.145

)

#

start(){

#clear ipvs-list

/sbin/ipvsadm -C

#add LVS VIP and scheduling algorithm

for ((i=0;i<${#VIP[*]};i++))

do

/sbin/ifconfig eth0:$i ${VIP[$i]}/24 up

/sbin/ipvsadm -A -t ${VIP[$i]}:80 -s wrr

#add RSIP

for ((n=0;n<${#RSIP[*]};n++))

do

/sbin/ipvsadm -a -t ${VIP[$i]}:80 -r ${RSIP[$n]}:80 -g -w 1  >/dev/null 2>&1

done

done

}

 

while true

do

ping -c 2 192.168.1.141 >/dev/null 2>&1

if [ $? -ne 0 ];then

start

echo "LVS-01:192.168.1.141 is down" >> /tmp/downlist

/sbin/arping -U -I eth0 192.168.1.145  >/dev/null 2>&1

break

fi

sleep 2

done

 

1.4 ipvsadm常用参数组合

ipvsadm -Ln --stats

ipvsadm -Lnc

ipvsadm -Ln --thersholds

ipvsadm -Ln --timeout

 

1.5 导致负载不均衡的可能原因

  • LVS自身的会话保持参数设置(-p 300,persistent 300)。优化:大公司尽量用cookies替代sesson。
  • LVS调度算法设置,例如:rr,wrr,wlc,lc算法。
  • 后端RS节点的会话保持参数,例如:apache的keepalive参数。
  • 访问量较少的情况,不均衡的现象更明显。
  • 用户发送的请求时间长短,和请求资源多少大小。

1.6 LVS故障排错理论

  • 调度器上LVS调度规则及IP的正确性。
  • RS节点上VIP绑定和ARP抑制的检查。

生产处理思路:

①对绑定的VIP做实时监控,出问题报警或者自动处理后报警。

②把绑定的VIP做成配置文件,例如:vi /etc/sysconfig/network-scripts/lo:0。

ARP抑制的配置思路:

①如果是单个VIP,那么可以用stop传参设置0.如果RS端有多个VIP绑定,此时,即使是停止VIP绑定也一定不要置0.

  • RS节点上自身提供服务的检查。
  • 辅助排除工具有tcpdump,ping等
  • 负载均衡和反向代理集群的三角形排查理论:

 

 

 

 

  • 部署keepalived

2.1 keepalived的安装(两台LVS都装)

yum install openssl* popt* -y

ln -s /usr/src/kernels/2.6.32-358.el6.x86_64/ /usr/src/linux

ll /usr/src/

mkdir -p /application/tools

cd /application/tools

wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz  #以往稳定版为1.1.17

tar zxf keepalived-1.1.19.tar.gz

cd keepalived-1.1.19

./configure --sysconf=/etc

make

make install

cp /usr/local/sbin/keepalived  /usr/sbin/keepalived

/etc/init.d/keepalived start
ps -ef|grep keep
/etc/init.d/keepalived stop

 

规范启动====./configure --sysconf=/etc

/bin/cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

/bin/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

mkdir /etc/keepalived

/bin/cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

/bin/cp /usr/local/sbin/keepalived /usr/sbin/

/etc/init.d/keepalived start

ps -ef|grep keep

/etc/init.d/keepalived stop

 

2.2 keepalived的配置

2.2.1 本次实验的配置文件LVS-01

[root@home-01 keepalived]# cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

router_id LVS_01

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.145/24

}

}

#

virtual_server 192.168.1.145 80 {

delay_loop 6

lb_algo wrr

lb_kind DR

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

 

real_server 192.168.1.143 80 {

weight 1

TCP_CHECK {

connect_timeout 8

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

 

real_server 192.168.1.144 80 {

weight 1

TCP_CHECK {

connect_timeout 8

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

 

2.2.2 本次实验的配置文件LVS-02

[root@lvs-02 scripts]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

router_id LVS_02

}

 

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.145/24

}

}

#

virtual_server 192.168.1.145 80 {

delay_loop 6

lb_algo wrr

lb_kind DR

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

 

real_server 192.168.1.143 80 {

weight 1

TCP_CHECK {

connect_timeout 8

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

 

real_server 192.168.1.144 80 {

weight 1

TCP_CHECK {

connect_timeout 8

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

 

2.2.3 keepalived配置文件简单注释

例:

1  ! Configuration File for keepalived

2

3  global_defs {

4     notification_email {

5          49000448@qq.com

6     }

7     notification_email_from Alexandre.Cassen@firewall.loc

8     smtp_server 127.0.0.1

9     smtp_connect_timeout 30

10     router_id LVS_oldboy01

11  }

全局定义块部分:主要设置keepalived的通知机制和标识

①第4-9行是email通知参数,作用:当LVS发生切换或RS等有故障时,会发邮件报警。这里可选配置,notification,email.指定keepalived发生事件时,需要发给的email地址,可以多个,每行一个。

②smtp_server指定发送邮件的 smtp服务器,如果本机开启了sendmail,就可以使用上面默认配置实现邮件发送。

③第10行是LVS负载均衡器标识(router-id)。在一个局域网内,它应该是唯一的。

④大括号“{}”。用来分隔定义块,因此必须成对出现。如果漏写了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

 

12

13  vrrp_instance VI_1 {

14      state MASTER

15      interface eth0

16      lvs_sync_daemon_inteface eth2

17      virtual_router_id 51

18      priority 100

19      advert_int 1

20      authentication {

21          auth_type PASS

22          auth_pass 1111

23      }

24      virtual_ipaddress {

25        10.0.0.29/24

26      }

27  }

VRRP定义块

①第13行为VRRP实例vrrp_instance,每个VRRP实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。

②第14行实例状态state,只有MASTER和BACKUP两种状态, 并且需要大写这些单词。其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态由BACKUP变换成MASTER,当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到BACKUP状态。

③第15行,通信接口interface,对外提供服务的网络接口,如eth0,eth1,当前主流的服务器有2个或2个以上的网络接口,在选择服务接口时,一定要搞清楚了。

④第16行,lvs_sync_daemon_interface.负载均衡器之间的监控接口,类似于HA HearBeat的心跳线,注意还需要配置主机路由。例:route add -host 对端心跳网卡IP dev eth2.

⑤第17行为虚拟路由标识virtual_router_id,这个标识是一个数字,并且同一个vrrp实例使用唯一的标识。即同一个vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的, 同时整个keepalived内是唯一的。

⑥第18行为优先级priority,这是一个数字,数值越大,优先级越高。在同一个vrrp_instance里,MASTER的优先级高于BACKUP。若MASTER的priority值为150,那么BACKUP的priority只能是149或更小的数值。

⑦第19行同步通知间隔advert_int。MASTER与BACKUP负载均衡器之间同步检测的时间间隔,单位为秒。

⑧第20-23行,验证authentication.包含验证类型和验证密码。类型主要有PASS,AH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一VRRP实例MASTER与BACKUP使用相同的密码才能正常通信,这里官方推荐明文即可。

⑨第24-26行,定义虚拟IP地址池。

 

28  #

29  virtual_server 10.0.0.29 80 {

30      delay_loop 6

31      lb_algo wrr

32      lb_kind DR

33      nat_mask 255.255.255.0

34      persistence_timeout 50

35      protocol TCP

36

37      real_server 10.0.0.17 80 {

38          weight 1

39          TCP_CHECK {

40          connect_timeout 8

41          nb_get_retry 3

42          delay_before_retry 3

43          connect_port 80

44          }

45      }

46

47      real_server 10.0.0.18 80 {

48          weight 1

49          TCP_CHECK {

50          connect_timeout 8

51          nb_get_retry 3

52          delay_before_retry 3

53          connect_port 80

54          }

55      }

56  }

 

2.2.4 双主配置的配置文件参考

主:

! Configuration File for keepalived

 

global_defs {

notification_email {

49000448@qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 10.0.0.1

smtp_connect_timeout 30

router_id LVS_19

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 19

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.29/24

}

}

 

vrrp_instance VI_2 {

state BACKUP

interface eth0

virtual_router_id 16

priority 50

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.28/24

}

}

 

备:

! Configuration File for keepalived

 

global_defs {

notification_email {

49000448@qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 10.0.0.1

smtp_connect_timeout 30

router_id LVS_16

}

 

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 19

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.29/24

}

}

vrrp_instance VI_2 {

state MASTER

interface eth0

virtual_router_id 16

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.28/24

}

}

 

 

2.3 高可用脑裂问题及解决方案

(1)、导致裂脑发生的原因

1、高可用服务器之间心跳链路故障,导致无法相互检查心跳

2、高可用服务器上开启了防火墙,阻挡了心跳检测

3、高可用服务器上网卡地址等信息配置不正常,导致发送心跳失败

4、其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等

(2)、防止裂脑一些方案

1、加冗余线路

2、检测到裂脑时,强行关闭心跳检测(远程关闭主节点,控制电源的电路fence)

3、做好脑裂的监控报警

4、报警后,备节点在接管时设置比较长的时间去接管,给运维人员足够的时间去处理(人为处理)

5、启动磁盘锁,正在服务的一方锁住磁盘,裂脑发生时,让对方完全抢不走"共享磁盘资源"

磁盘锁存在的问题:

使用锁磁盘会有死锁的问题,如果占用共享磁盘的一方不主动"解锁"另一方就永远得不到共享磁盘,假如服务器节点突然死机或崩溃,就不可能执行解锁命令,备节点也就无法接管资源和服务了,有人在HA中设计了智能锁,正在提供服务的一方只在发现心跳全部断开时才会启用磁盘锁,平时就不上锁


发表评论

登录 后发表评论.