LVS的DR工作模式,是目前生产环境中最常用的一种工作模式,网上的资料也是最多的,有的文章对DR工作模式的讲解还是比较透彻的。这里我们通过图文的方式再向您介绍一下DR的工作模式
上图反映了DR模式的整个工作过程,同样为了简单起见,这里的Real Server也只画了一个。如果是多个Real Server的话,LVS会通过调度算法来决定发往哪台Real Server。LVS-DR工作模式的几个关键点在于:
1).被Real Server处理后形成的响应报文,不再回发到LVS节点,而是直接路由给中心交换机然后发送出去。省去了LVS-NAT方式中的LVS回发过程。
2)LVS节点只会改写链路层的报文封装,对网络层和传输层报文是不进行改写的。
先来说一说上图的工作原理:
1、同样的,我们为了演示整个生产环境中,从机房中心交换机收到一个数据报文后开始讲解。中心交换机同样采取的IP映射方式。但是与 LVS-NAT方式不一样,Real Server在机房的中心交换机上也需要绑定一个外网映射。这样保证Real Server回发的响应报文能够被发送到外网。
2、LVS节点接收到请求报文后,会改写报文的数据链路层格式。将Target Mac改写成Real Server的Mac,但是网络层和传输层报文不会改写,然后重新回发给交换机。这里就涉及一个问题,现在target Mac和Destination IP的对应关系的错误的,这个数据报文到了交换机后,由于这种错位的关系,是不能进行三层交换的,只能进行二层交换(一旦进行IP交换,数据报文的验证就 会出错,被丢弃)。所以LVS-DR方式要求Real Server和LVS节点必须在同一个局域网内,或者这样说更确切:LVS节点需要找到一个二层链路,将改写了Mac地址的报文发送给Real Server,而不能进行三层交换的校验。这样来看,实际上LVS节点和Real Server界面不一定要在同一个子网,您用一个独立网卡独立组网,传送报文也是可行的。
3、通过二层交换,数据被发送到Real Server节点。那么Real Server节点怎么来判断这个包的正确性呢?首先当然是传输层TCP/IP报文校验没有问题,LVS-NAT没有改写TCP/IP,当然校验就没有问题 (除非报文本身就存在问题);然后是链路层的MAC地址能够被识别,这时就是回环IP的功劳了。对于Real Server节点来说,192.168.100.10这个VIP就是自己的回环IP,绑定的MAC也就是被LVS替换后的target mac。那么Real Server会认为这个包是在本机运行的某一个应用程序通过回环IP发给自己的,所以这个包不能被丢弃,必须处理。
4、被处理后的生成的响应报文,被直接发送给网管。这个就没有太多的解释的了,只要保证Real server的默认路由设置成到核心交换机的192.168.100.1就OK了。另外,需要说明的是,由于LVS-DR模式并没有更改原有的IP报文和TCP报文,所以LVS-DR模式本身是不支持端口映射的,实际上在日常使用实践中,我们一般使用Nginx做端口映射,因为: 灵.活.。
LVS-DR工作模式的优点在于:
1).解决了LVS-NAT工作模式中的转发瓶颈问题,能够支撑规模更大的负载均衡场景
2)比较耗费网外IP资源,机房的外网IP资源都是有限的,如果在正式生产环境中确实存在这个问题,可以采用LVS-NAT和LVS-DR混合使用的方式来缓解。
·
LVS-DR当然也有缺点:
1)配置工作较LVS-NAT方式稍微麻烦一点,您至少需要了解LVS-DR模式的基本工作方式才能更好的指导自己进行LVS-DR模式的配置和运行过程中问题的解决。
2)由于LVS-DR模式的报文改写规则,导致LVS节点和Real Server节点必须在一个网段,因为二层交换是没法跨子网的。但是这个问题针对大多数系统架构方案来说,实际上并没有本质限制。
·
1.安装ipvsadm
修改yum 源,否则安装不了
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.27.250/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.27.250/rhel6.5/HighAvailability
enabled=1
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.27.250/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.27.250/rhel6.5/ResilientStorage
enabled=1
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.27.250/rhel6.5/ScalableFileSystem
enabled=1
gpgcheck=0
[root@server1 ~]# yum install -y ipvsadm
[root@server1 ~]# ipvsadm -A -t 172.25.27.100:80 -s rr # -t是表示指定虚拟服务为tcp服务,形式为host[:port], rr表示轮询
[root@server1 ~]# ipvsadm -a -t 172.25.27.100:80 -r 172.25.27.2:80 -g # -a是添加一个real server
[root@server1 ~]# ipvsadm -a -t 172.25.27.100:80 -r 172.25.27.3:80 -g
[root@server1 ~]# ipvsadm -l #查看策略
[root@server1 ~]# ipvsadm -ln
[root@server1 ~]# /etc/init.d/ipvsadm save #保存策略使其生效
[root@server1 ~]# ip addr add 172.25.27.100/24 dev eth0 #添加real_server ip
开启real_server 的apache
[root@server2 ~]# /etc/init.d/httpd start
[root@server3 ~]# /etc/init.d/httpd start
[root@server2 ~]# ip addr add 172.25.27.100/32 dev eth0 #在real_server上添加 ip
在物理主机上测试:
[kiosk@foundation27 ~]$ arp -e 172.25.27.100 #查看访问的100的mac地址
通过对比mac 地址,可知访问的是server1
[root@foundation27 kiosk]# arp -d 172.25.27.100 #清除APR缓存
[root@foundation27 kiosk]# curl 172.25.27.100
发现此时访问的直接是real_server 主机,没有经过lvs调度器
因此,必须在real_server上增加策略,使其只能通过lvs调度器访问real_server ip
[root@server3 ~]# arptables -A IN -d 172.25.27.100 -j DROP #将所有访问172.25.27.100 的请求都丢弃掉
[root@server3 ~]# arptables -A OUT -s 172.25.27.100 -j mangle --mangle-ip-s 172.25.27.3 #只允许172.25.27.3 (即本机)访问172.25.27.100
[root@server3 ~]# /etc/init.d/arptables_jf save #保存规则
测试:
此时,再清除ARP缓存后,重新访问real_server ip ,发现现在是通过lvs调度器来获取的
当其中一台real_server 主机关掉后,测试
发现此时的lvs调度器没有健康检查,仍然在轮询访问,使有的访问被拒绝,在实际的网站访问时,会造成一定的损失,并使用户的体验变差。
Ldirectord 实现lvs健康检查
ldirectord用来实现LVS负载均衡资源在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各RealServer的运行状态,一旦发现某RealServer运行异常时,还可以将其从IPVS表中移除。
ldirectord 进程通过向RealServer的RIP发送资源访问请求并通过由RealServer返回的响应信息来确定RealServer的运行状态。在 Director上,每一个VIP需要一个单独的ldirectord进程。如果RealServer不能正常响应Director上 ldirectord的请求,ldirectord进程将通过ipvsadm命令将此RealServer从IPVS表中移除。而一旦 RealServer再次上线,ldirectord会将其重新添加至IPVS表中
[root@server1 ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# ls
resource.d shellfuncs
[root@server1 ha.d]# rpm -ql ldirectord
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 ha.d]# vim ldirectord.cf
virtual=172.25.27.100:80 # 此项用来定义LVS服务及其使用的VIP和PORT
real=172.25.27.2:80 gate # 定义RealServer,语法:real=RIP:port gate|masq|ipip [weight]
real=172.25.27.3:80 gate
fallback=127.0.0.1:80 gate # 定义RealServer,语法:real=RIP:port gate|masq|ipip [weight]
service=http # 定义基于什么服务来测试RealServer;
scheduler=rr # 调度算法为rr
#persistent=600 # 持久连接超时时间;
#netmask=255.255.255.255
protocol=tcp # 定义此虚拟服务用到的协议;
checktype=negotiate # ldirectord进程用于监控RealServer的方法;{negotiate|connect|A number|off}
checkport=80 # 指健康检查使用的端口;
request="index.html" # 检查RealServer用到的页面
receive="Test Page" # 检查RealServer用到的页面内容
virtualhost=www.x.y.z
[root@server1 ha.d]# /etc/init.d/ipvsadm stop
[root@server1 ha.d]# /etc/init.d/ldirectord start
[root@server1 ha.d]# ipvsadm -L #查看规则
此时,两台real_server 都正常工作着
[root@server3 ~]# /etc/init.d/httpd stop
当server3上的apache 关掉后
[root@server1 ha.d]# ipvsadm -L
此时调度器已经检测到了,此时再访问不会再出现以前那种拒绝被连接的状况
当两台real_server 的apache 都关掉,即宕机后
提供当后端RS全部宕掉后,返回的fallback页面,为本机httpd服务
[root@server1 html]# echo "此页面正在维护" > /var/www/html/index.html
[root@server1 html]# /etc/init.d/httpd start
由于只有一个调度器,当调度器主机宕机后,所有服务都不能正常访问,为了实际中造成损失,我们必须准备台备用的调度器,来应对这种危机
Keepalived 高可用集群管理
源码安装Keepalived
[root@server1 ~]# /etc/init.d/ldirectord stop #由于ldirectord 与Keepalived
冲突,必须将ldirectord停掉
[root@server1 ~]# /etc/init.d/ldirectord stop
Stopping ldirectord... Success
由于ldirectord 开机自启,所以必须将其开机自启关掉
[root@server1 ~]# chkconfig --list ldirectord
ldirectord 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:启用 6:关闭
[root@server1 ~]# chkconfig ldirectord off
[root@server1 ~]# chkconfig --list ldirectord
ldirectord 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@server1 ~]# tar zxf keepalived-1.3.6.tar.gz
[root@server1 ~]# cd keepalived-1.3.6
[root@server1 ~]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
[root@server1 ~]# make
[root@server1 ~]# make install
root@server1 etc]# cd /usr/local/keepalived/etc/rc.d/init.d/
[root@server1 init.d]# ls
Keepalived
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/ #做软连接
[root@server1 init.d]# cd /etc/keepalived/
[root@server1 keepalived]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 keepalived]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 keepalived]# cd /usr/local/keepalived/etc/rc.d/init.d/
[root@server1 init.d]# chmod +x keepalived #加可执行权限
[root@server1 keepalived]# cd /etc/keepalived
[root@server1 keepalived]# vim keepalived.conf
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
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 {
172.25.27.100
}
}
virtual_server 172.25.27.100 80 { ##虚拟主机
delay_loop 6
lb_algo rr
lb_kind DR ##是使用的DR模型
# persistence_timeout 50 ##先将此注释掉,可以更加直观的感受到两台rs使用的DR进行的轮转
protocol TCP
real_server 172.25.27.2 80 { ##real_server主机地址和端口两台rs均是使用的80端口
weight 1 ##权重是可以自己进行修改的,在实际使用中,权重使用的不一样是因为,权重较重一方的服务器性能更加好
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.27.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@server1 keepalived]# /etc/init.d/keepalived start
[root@server1 keepalived]# ipvsadm -l
Keeplived 高可用
找台新的主机按照前面步骤布置keeplived ,可直接将server1的keeplived 配置文件复制过来,进行稍作修改
[root@server4 keepalived]# vim keepalived.conf #修改state 和 priority
vrrp_instance VI_1 {
state BACKUP #将状态由原来的master 改为备用
interface eth0
virtual_router_id 51
priority 50 #更改优先级,使其和server1上的优先级不同,避免若一台主机挂掉以后,若优先级是一致的,等原来的主机恢复后,会因为优先级是一致的而导致争抢,同时操作电脑上的同一台文件,而导致脑裂。
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
[root@server4 keepalived]# /etc/init.d/keepalived start
查看ip 可知此时ip 在server1上,即现在访问的是server1
[root@server1~]#echo c > /proc/sysrq-trigger #故意让系统崩溃,实现宕机的目的
测试并查看IP 和mac 地址,发现此时服务已经完全有server4接管,从而实现了lvs集群高可用。