Keepalived+LVS实现前端高可用负载均衡


配置实例需要了解的知识:    
keepalived的工作机制: 最初keepalived目的是为LVS提供高可用的功能.ipvs wrapper是专门生成ipvs规则的组件.当director出现故障的时候keepalived可以将提供集群的IP地址、lvs规则转移到其他的节点上.并且检测后端rs服务的health check的健康检查。    
VRRP工作原理:

1、路由器使用VRRP后,根据优先级确定自己的备份组中的角色,成为master路由器的会定期发送VRRP通告报文,通知备份组内的其他路由器自己工作正常,backup路由器则启动定时器等待通告报文的到来。

2、在抢占方式下,当backup路由器收到vrrp通告报文后,会和自己的优先级比较,如果大于通告报文的优先级,则成为master路由器。

3、在非抢占下,如果master没有出现故障,备份组中的路由器始终保持master或backup状态,backup路由器即使随后被配置了比master路由器还高的优先级也不会成为master路由器。

4、如果backup的定时器超时后仍未收到master的vrrp通告报文,则master被判为出现故障,backup都会认为自己是master并对外发送vrrp通告报文,备份组内的路由器根据优先级选举出master,承担报文的转发功能。

实例规划如图:

wps_clip_image-32458

1、两个director节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致

[root@node1 ~]#hostname node1.yangyaru.com
[root@node1 ~]#vim /etc/sysconfig/network

wps_clip_image-15870

[root@node2 ~]#hostname node2.yangyaru.com
[root@node2 ~]#vim /etc/sysconfig/network

wps_clip_image-32347

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0


wps_clip_image-3077

[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0

wps_clip_image-32461

[root@node1 ~]# vim /etc/hosts

wps_clip_image-26619

[root@node2 ~]# vim /etc/hosts

wps_clip_image-17443

2、建立基于ssh通话密钥(要使用Xshell软件连接主机),两个节点都要创建密钥发送到对方的主机上。  
Node1节点上创建密钥文件。

[root@node1~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
将基于密钥通话的公钥传递给node2节点,第一次需要输入node2的登录密钥。
[root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
Node2节点上创建密钥文件。
[root@node2~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
将基于密钥通话的公钥传递给node1节点,第一次需要输入node1的登录密钥。
[root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

3、时间同步

[root@node1 ~]# service ntpd stop  #如果系统启动了ntpd服务器就先停止时间同步服务器哈
[root@node1 ~]# chkconfig ntpd off  #让它开机自动启动也关闭
[root@node1 ~]# chkconfig --list ntpd   #检查是够开始自动启动关闭
[root@node1 ~]# ntpdate 172.16.0.1  #让两个节点的时间都以172.16.0.1的地址一样。
11 May 15:12:45 ntpdate[29501]: adjust time server 172.16.0.1 offset 0.000326 sec
[root@node1 ~]# which ntpdate   查看同步时间的命令ntpdate的绝对路径是在哪里
[root@node1 ~]# crontab -e      #制定一个任务计算每个5分钟就同步下时间,添加如下一行。
*/5 * * * * sbin/ntpdate 172.16.0.1 &> /dev/null
[root@node1 ~]# scp /var/spool/cron/root node2:/var/spool/cron  #将时间同步复制到另外一个节点上
[root@node2 ~]# service ntpd stop  #停止时间同步服务器
[root@node2 ~]# chkconfig ntpd off  #让它开机自动启动也关闭
[root@node2 ~]# chkconfig --list ntpd
[root@node2 ~]# ntpdate 172.16.0.1  #让两个节点的时间都以172.16.0.1的地址一样。

前端两个Director节点安装配置keepalived,下载好的包放在附件中。在安装keepalived依赖于其他包,所以使用yum安装。

Node1的配置:

[root@node1 ~]# yum -y --nogpgcheck  localinstall  keepalived-1.2.7-5.el5.i386.rpm
[root@node1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_schedown {
Script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 2
weight -2
}
vrrp_script chk_httpd {
script "killall -0 httpd"
interval 2
weight -2
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id  67 #定义虚拟路由组id号.
priority 101          #定义该物理路由的优先级
adver_int 1  #master路由的多久通告一次的时间
authentication {
auth_type  PASS
auth_pass  yangyaru
}  #定义通告信息的认证方式
track_interface {
eth0
}
virtual_ipaddress {
172.16.20.111 dev eth0 label eth0:0  #如果有多个配置多个虚拟地址
}
track_script {
chk_httpd
chk_schedown
}
notify_master "/etc/keepalived/notify.sh -n master -a 172.16.20.111"
notify_backup  "/etc/keepalived/notify.sh -n backup -a 172.16.20.111"
notify_fault  "/etc/keepalived/notify.sh -n fault  -a 172.16.20.111"
virtual_server 172.16.20.111  80 {
delay_loop 6   #获取某服务的等待时间
lb_algo rr     #调度的方式
lb_kind DR   #实现LVS的模式DR NAT
nat_mask 255.255.0.0
# persistence timeout 50  #持久连接
protocol TCP
# sorry_server 127.0.0.1 80   #sorry_server是用于定义所有realserver均出现故障时所用的服务器。
}
real_server 172.16.20.3  80 {
weight 1
HTTP_GET {
url{
path /
status_code 200
}
connect_timeout 2       #连接时间
nb_get_retry 3          #重试时间
delay_before_retry 1    #延迟时间
}
}
real_server 172.16.20.5 80 {
weight 1
HTTP_GET {
url{
path /
status_code 200
}
TCP_CHECK {
connect_port 80
bindto 172.16.20.5
}
connect_timeout 2       #连接时间
nb_get_retry 3          #重试时间
delay_before_retry 1    #延迟时间
}
}
}


#定义那个虚拟路由组,一个物理设备可以提供多个组。  

Notify.sh的脚本的内容是:

#!/bin/bash
# Author: MageEdu <[email protected]>
# description: An example of notify script
# Usage: notify.sh -m|--mode {mm|mb} -s|--service SERVICE1,... -a|--address VIP  -n|--notify {master|backup|falut} -h|--help
#contact='root@localhost'
helpflag=0
serviceflag=0
modeflag=0
addressflag=0
notifyflag=0
contact='root@localhost'
Usage() {
echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] <-a|--address VIP>  <-n|--notify {master|backup|falut}>"
echo "Usage: notify.sh -h|--help"
}
ParseOptions() {
local I=1;
if [ $# -gt 0 ]; then
while [ $I -le $# ]; do
case $1 in
-s|--service)
[ $# -lt 2 ] && return 3
serviceflag=1
services=(`echo $2|awk -F"," '{for(i=1;i<=NF;i++) print $i}'`)
shift 2 ;;
-h|--help)
helpflag=1
return 0
shift
;;
-a|--address)
[ $# -lt 2 ] && return 3
addressflag=1
vip=$2
shift 2
;;
-m|--mode)
[ $# -lt 2 ] && return 3
mode=$2
shift 2
;;
-n|--notify)
[ $# -lt 2 ] && return 3
notifyflag=1
notify=$2
shift 2
;;
*)
echo "Wrong options..."
Usage
return 7
;;
esac
done
return 0
fi
}
#workspace=$(dirname $0)
RestartService() {
if [ ${#@} -gt 0 ]; then
for I in $@; do
if [ -x /etc/rc.d/init.d/$I ]; then
/etc/rc.d/init.d/$I restart
else
echo "$I is not a valid service..."
fi
done
fi
}
StopService() {
if [ ${#@} -gt 0 ]; then
for I in $@; do
if [ -x /etc/rc.d/init.d/$I ]; then
/etc/rc.d/init.d/$I stop
else
echo "$I is not a valid service..."
fi
done
fi
}
Notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`, vrrp transition, `hostname` changed to be $1."
echo $mailbody | mail -s "$mailsubject" $contact
}

5、Node2的安装配置:

[root@node2 ~]# yum -y --nogpgcheck  localinstall  keepalived-1.2.7-5.el5.i386.rpm
[root@node2 ~]# scp  /etc/keepalived/keepalived.conf node2:/etc/keepalived/keepalived.conf
[root@node2 ~]# vim /etc/keepalived/keepalived.conf
state  MASTER改为BACKUP
priority  101 改为100
其他不动

6、node1和node2都安装ipvsadm并启动起来。

[root@node1 ~]#yum -y install ipvsadm
[root@node1 ~]#service ipvsadm start
[root@node2 ~]#yum -y install ipvsadm
[root@node2 ~]#service ipvsadm start

后端RS的配置步骤:

1、关闭selinux

[root@rs1 ~]#setenforce 0
[root@rs1 ~]#vim /etc/sysconfig/selinux
修改一行为
SELINUX=permissive
节点node2配置一样。

2、时间同步下:和前面的一样,使用172.16.0.1主机的时间。

3、安装httpd服务:

[root@rs1 ~]#yum -y install httpd
[root@rs1 ~]#service httpd start
[root@rs2 ~]#yum -y install httpd
[root@rs2 ~]#service httpd start

4、给两个RS提供页面,这里我们使用不同的页面做测试。

[root@rs1 ~]#echo “rs3.yangyaru.com”  > /var/www/html/index.html
[root@rs2 ~]#echo “rs5.yangyaru.com”  > /var/www/html/index.html

5、配置rs1和rs2为负载均衡DR模式集群服务。    

[root@rs1 ~]#cd /proc/sys/net/
[root@rs1 ~]#sysctl -w net.ipv4.conf.lo.arp_announce=2
[root@rs1 ~]#sysctl -w net.ipv4.conf.all.arp_announce=2
[root@rs1 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]#ifconfig lo:0 172.16.20.111 netmask 255.255.255.255 broadcast 172.16.20.111 up
[root@rs1 ~]#route add -host 172.16.20.111 dev lo:0

rs2和rs1一样。

调试过程:  
1、node1和node2开启keepalived服务    

[root@node1 ~]#service keepalived start
[root@node2 ~]#service keepalived start

查看下两个node节点的ip地址

[root@node1 ~]#ip addr show
[root@node1 ~]#ipvsadm -L -n
[root@node2 ~]#ip addr show
[root@node2 ~]#ipvsadm -L -n


可以看到我们的vip运行在node1上。    

wps_clip_image-27140

wps_clip_image-1279

客户端访问测试下我们的页面.

wps_clip_image-6947

再刷新下页面测显示rs2的页面.    

wps_clip_image-15529

当我们的后端两个界面都出现故障时.我们使用node1页面上的错误页面放回给用户.    

Node1和node2都安装httpd提供错误页面的返回.    

[root@node1 keepalived]# yum -y install httpd
[root@node2 keepalived]# yum -y install httpd
[root@node1 keepalived]# echo “error” > /var/www/html/index.html
[root@node2 keepalived]# echo “error” > /var/www/html/index.html


后端rs关闭httpd服务模拟故障.    

[root@rs1~]# service httpd stop
[root@rs2~]# service httpd stop


此前我们看下前端node节点的规则.    

wps_clip_image-8369

客户端就会访问到错误的页面.    

wps_clip_image-32126
简单的配置到这里就已经结束了.^_^

你可能感兴趣的:(高可用,keepalived,LVS,负载均衡)