####LVS-DR模式负载均衡构建配置###
1.过程
client -> VS -> RS -> client(VS只做调度,RS为虚拟服务器)
DR模式:直接由路由,通过改写请求报文的目的MAC地址,将请求发送给真实的服务器,服务器将相应消息直接发送给客户端
2.原理详情
(1)通过在调度器VS上修改数据包的目的MAC地址实现转发,注意源地址是CIP,目的地址仍然是VIP,(CIP(CMAC)-> VIP(VM -> RM,在二层链路层改变了MAC地址来定位))
(2)请求的报文经过调度器,而服务器响应处理后的报文无需经过调度器,因而并发访问量大时使用效率很高(和NAT模式相比)
(3)因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器只能在同一个局域网里面
(4)服务器主机需要绑定VIP地址在lo接口上,且需要配置ARP抑制
(5)服务器节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让服务器直接出网就可以
(6)因为DR模式的调度器只做MAC地址的改写,所以调度器就不能改写目标端口,那么服务器就得使用和VIP相同的端口提供服务
3.实验环境及其基本操作
关闭iptables和selinux
开启封装好base之后,创建的四个虚拟机
rhel6.5
VS: vm1 172.25.254.1
RS1: vm2 172.25.254.2
RS2: vm3 172.25.254.3
vip 172.25.254.100
<1>.VS
(1)vim /etc/yum.repos.d/rhel-source.repo ##重新配置yum源文件,配置成更高级的yum源仓库。
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.77/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[HighAvailability] ##高可用
name=HighAvailability
baseurl=http://172.25.254.77/rhel6.5/HighAvailability
gpgcheck=0
[LoadBalancer] ##负载均衡
name=LoadBalancer
baseurl=http://172.25.254.77/rhel6.5/LoadBalancer
gpgcheck=0
==========================================================
出现的错误:
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release在编写yum源的配置文件的时候,这一行不能删除,否则会报错
==========================================================
(2)下载ipvsadm (在LVS调度器上安装)
ipvsadm 的命令参数:
-A 增加一台虚拟设备
-a 添加真实服务器的操作 -t tcp服务地址 -s 调度算法(10中调度算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq) -r 对应的真实ip -g rh(路由) rr 调度算法:轮询
yum install ipvsadm -y
ipvsadm -L ##查看是否写入策略
ipvsadm -A -t 172.25.254.100:80 -s rr ## -s调度算法,默认为wlc加权调度算法
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -g
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g
ipvsadm -ln ##查看写入的策略
/etc/init.d/ipvsadm save ##保存写好的策略
ip addr add 172.25.254.100/24 dev eth0 ##临时增加
ip addr
<2>.RS后端真实服务器的配置
注意:RS上也必须有vip才可以建立连接
RS1:
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html/
vim index.html
<h1>vm2-westos.com</h1>
ip addr add 172.25.254.100/24 dev eth0 ##临时增加
ip addr
RS2:
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html/
vim index.html
<h1>vm3-westos.com</h1>
ip addr add 172.25.254.100/24 dev eth0 ##临时增加
ip addr
<3>.客户端测试
发现连接到的ip(VS和RS的ip都一样)是随机的,因为三台server在统一VLAN下具有相同的VIP,故不能保证每次都访问到调度器
curl 172.25.254.100 ##这里出现的是轮询的情况,是因为绑定的是 server1上的MAC地址,所以会出现轮询的效果
<h1>vm2-westos.com</h1>
<h1>vm3-westos.com</h1>
<h1>vm2-westos.com</h1>
<h1>vm3-westos.com</h1>
<h1>vm2-westos.com</h1>
<h1>vm3-westos.com</h1>
以上情况,server1,2,3都有可能被访问到
如果绑定的MAC地址是server1,则在server2,3轮询
如果绑定的MAC地址是sever2或sever3的,那么会发现,在测试端根本不会出现轮询,而是直接去了MAC绑定的后端服务器 (显然这样在企业中是不允许的)
arp -an |grep 100 ##查看绑定的MAC地址的信息
? (172.25.254.100) at 52:54:00:50:cc:71 [ether] on br0 ##这里绑定的是server1的MAC地址
arp -d 172.25.254.100 ## 删除掉刚才的绑定的策略,重新访问
curl 172.25.254.100 ##这里出现的就是客户端直接绑定了后端服务器的MAC地址,因此访问的时候就不会出现轮询的效果。显然这样是不被允许的。
<h1>vm2-westos.com</h1>
<h1>vm2-westos.com</h1>
<h1>vm2-westos.com</h1>
arp -an |grep 100 ##出现的是 vm2/vm3的信息
<4>.为了让客户端通过VS访问服务器,需要给RS设置ARP抑制,来禁止客户端直接访问服务器
为了解决刚才的情况,要求只绑定 server 1 的MAC地址,因此需要对 server2/server3 上的VIP进行隐藏,即ARP抑制。
在RS上:
yum install arptables_jf -y ##为arptables网络的用户控制过滤的守护进程
arptables -A IN -d 172.25.254.100 -j DROP ##当网内广播需要172.25.254.100这个ip时,它丢弃所有网内的请求
arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2 ##当它自身需要在网内发包时,伪装为自己原本的ip172.25.64.2
## -A控制arp协议,IN添加策略,mangle转换
/etc/init.d/arptables_jf save
cat /etc/sysconfig/arptables ##此文件存有arptables的记录,关掉之后,重启记录依旧存在
<5>.再一次客户端测试
先删除现有的绑定的MAC地址
arp -d 172.25.254.100
curl 172.25.254.100
arp -d 172.25.254.100 ##多次down掉连接,查看绑定的MAC地址是否会改变
curl 172.25.254.100
arp -an |grep 100 ##查看地址信息,依旧是VS的MAC地址
4.VS对后端没有健康检查
注意:因为没有健康检查,所以当一个后端的服务器down掉之后,服务端通过VS访问某服务器的时候,还是会能访问到,这就会出现错误
解决方法一:使用ldirectord
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y ##在LVS调度器上安装健康检查
rpm -ql ldirectord
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d ##配置文件的母板拷到/etc/ha.d/
cd /etc/ha.d
vim ldirectord.cf ##编辑文件内容
virtual=172.25.254.100:80 ##VIP 地址和端口号
real=172.25.254.2:80 gate ##指定RealServer地址和端口,同时设定LVS工作模式,gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
real=172.25.254.3:80 gate
fallback=127.0.0.1:80 gate ##当所有的real server节点不能工作时,web服务重定向到本地的80端口的默认发布页面上。
service=http ##指定服务类型,对http服务做负载均衡
scheduler=rr ##指定调度算法,这里是rr(轮叫)算法
#persistent=600
#netmask=255.255.255.255
protocol=tcp ##指出该服务使用的协议:tcp、udp 或 fwm
checktype=negotiate ##指定Ldirectord的检测类型,默认为negotiate
checkport=80 ##指出健康检查使用的端口
request="index.html"
#receive="Test Page"
#virtualhost=www.x.y.z
ipvsadm -C ##清理规则
ipvsadm -ln ##查看是否清除规则
/etc/init.d/ldirectord restart ##再次开启服务,又可以加载出规则
yum install httpd -y
cd /var/www/html/
vim index.html
<h1>系统维护中。。。</h1>
<1>在客户端测试
关闭两个服务器的http服务
重新开起一个虚拟机vm4
curl 172.25.254.100
<h1>系统维护中。。。</h1>
注意:访问的是本地的httpd的发布目录,因此表示监测成功
解决方法二:使用keepalived
/etc/init.d/ldirectord stop ##应用之前先关掉上一个服务
(1)下载keepalived的压缩文件
tar zxf keepalived-2.0.6.tar.gz
./configure --with-init=SYSV --prefix=/usr/local/keepalived/ ##将文件转成二进制文件
make ##编译
make install
(2)创建软链接
cd /usr/local/keepalived/etc/rc.d/init.d
ls
chmod +x keeppalived
ln -s /usr/local/keepalived/etc/rc.d/init.d/keeppalived /etc/init.d
cd ..
cd ..
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig
ln -s /usr/local/keepalived/etc/keepalived /etc
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
ll /etc/sysconfig/keepalived ##查看软链接是否做好
cd /usr/local
scp -r keepalived/ vm4:/usr/local
(将上面的创建链接操作再执行一遍)
(3)配置keepalived文件
cd /etc/keepalived/
vim keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
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.254.100
}
}
virtual_server 172.25.254.100 80 {
##VS的VIP,服务启动生效时自动添加
delay_loop 6 ##对后端健康检查的时间
lb_algo rr ##调度算法
lb_kind DR ##模式为DR模式
#persistence_timeout 50
protocol TCP
real_server 172.25.254.2 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
scp keepalived.conf vm4:/etc/keepalived/
注意:因为虚拟机vm4是用来做备用VS的,是为了防止当VS(vm1)挂掉的时候,不会导致服务器瘫痪。当vm1 down掉以后,vm4就可以立即接替vm1的工作
(4)客户端测试
当vm1,2,3,4都开启的时候
用真机访问,是通过主VS访问服务器的
当vm1,4开启,2,3关闭http服务的时候
用真机访问的是VS的httpd的发布文件
当vm2,3,4开启,1关闭http服务的时候
服务不会中断,vm4会接替vm1的工作,查看的是vm4的地址信息
5.vm1和vm4互为主备
一个当被用的虚拟机,会有点浪费资源。所以,当服务很多的时候,可以将服务分开来当主备,这样两个服务器可以同时工作,并且互为主备
cd /etc/keepalived/
vim keepalived.conf
更改配置文件图片,如下:
/erc/init.d/keepalived start