LVS-DR模式+ldirectord+keepalived+tun隧道模式+wrr权重

什么是LVS

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。

三种工作模式的介绍

1、nat
简单来说就是传统的 NAT,进出流量都需要经过调度器,调度器会选择一个目的服务器,将进入流量的目标IP改写为负载均衡到的目标服务器,同时源IP地址也会改为调度器IP 地址。机制简单,但限制大,IPVS需要维护每个映射关系,而且进出入流量都需要经过调度器,实际上这个会成为瓶颈。
2、dr
,即Direct Routing模式。这种模式中,调度器直接重写进入包的mac地址,将其改为选定的目标服务器的mac地址,这样就可以到达服务器。但这样的话需要要求 IPVS服务器需要和真实服务器在同一局域网内,且真实服务器必须有真实网卡(这样重写了mac地址的报文才可以才可以到达该服务器)
在这里插入图片描述
3、tun
即IP Tunneling模式。这种模式中,调度器将进入的包重新包成一个IP包,然后发送给选定的目的服务器,目的服务器处理后,直接将应答发送给客户(当然该重新封装的报文的源IP
地址还是要填成调度器的)。

算法

轮训算法 加权轮训算法 最小连接算法 加权最下连接算法 …
LVS Scheduling Method LVS的调度方法:
1.Fixed Scheduling Method 静态调服方法
(1).RR 轮询
(2).WRR 加权轮询
(3).DH 目标地址hash
(4).SH 源地址hash
2.Dynamic Scheduling Method 动态调服方法
(1).LC 最少连接
(2).WLC 加权最少连接
(3).SED 最少期望延迟
(4).NQ 从不排队调度方法
(5).LBLC 基于本地的最少连接
(6).LBLCR 带复制的基于本地Keepalived
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现 。IPVS通常与keepalived配合使用,后者也是LVS项目的子项目之一,用于检测服务器的状态。
在lvs体系中,Keepalived主要有如下3个功能:
1 管理LVS负载均衡软件
2 实现对LVS集群节点的健康检查功能
3 作为系统网络服务的高可用功能
即 Keepalived 实现了 heartbeat + ldirectord 的功能。
配置过程
实验环境需求:

物理机:172.25.3.250

server1:172.25.3.1 --VS

server2:172.25.3.2 --VS

server3:172.25.3.3 --RS

server4:172.25.3.4 --RS
1.实现负载均衡
在server1上面进行部署
为了避免后续安装软件出现问题,先将yum源配置具体化,如下所是

 
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.3.250/rhel6.5
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
 
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.3.250/rhel6.5/LoadBalancer
gpgcheck=0
 
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.3.250/rhel6.5/HighAvailability
gpgcheck=0
 
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.3.250/rhel6.5/ResilientStorage
gpgcheck=0
 
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.3.250/rhel6.5/ScalableFileSystem
gpgcheck=0
[root@server1 ~]# yum install ipvsadm -y                  ##安装管理集群服务ipvsadm
[root@server1 ~]# ip addr add 172.25.3.100/24 dev eth0    ##临时添加ip(vip)
[root@server1 ~]# ipvsadm -A -t 172.25.3.100:80 -s rr   ## rr轮询模式
[root@server1 ~]# ipvsadm -a -t 172.25.3.100:80 -r 172.25.3.3:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.3.100:80 -r 172.25.3.4:80 -g  
                                  #vip添加RS地址,并设置为D模式 -r:RS地址,-g:DR模式
 
[root@server1 ~]# /etc/init.d/ipvsadm save                ##保存ipvsadm操作

在这里插入图片描述
server3–RS

[root@server3 ~]#  vim /var/www/html/index.html            #编写默认发布文件
[root@server3 ~]# ip addr add 172.25.3.100/32 dev eth0     ##Realserver同样添加虚拟ip地址,与调度器虚拟ip地址一致
[root@server3 ~]# yum install arptables_jf -y              ##安装arp防火墙 arp防火墙用来屏蔽数据包,拦截ip冲突,因为虚拟机与real server的地址一致,所以进入real server时需要把虚拟ip DROP掉,即拦截real server的虚拟ip
[root@server3 ~]# arptables -A IN -d 172.25.3.100 -j DROP  ##拒绝客户端访问realserver的虚拟ip,只要输入进来直接DROP掉
[root@server3 ~]# arptables -A OUT -s 172.25.3.100 -j mangle --mangle-ip-s 172.25.3.3
                                                           ##由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能
[root@server3 ~]# /etc/init.d/arptables_jf save

server4–RS

[root@server4 ~]#  vim /var/www/html/index.html            #编写默认发布文件
[root@server4 ~]# ip addr add 172.25.3.100/32 dev eth0     ##Realserver同样添加虚拟ip地址,与调度器虚拟ip地址一致
[root@server4 ~]# yum install arptables_jf -y              ##安装arp防火墙 arp防火墙用来屏蔽数据包,拦截ip冲突,因为虚拟机与real server的地址一致,所以进入real server时需要把虚拟ip DROP掉,即拦截real server的虚拟ip
[root@server4 ~]# arptables -A IN -d 172.25.3.100 -j DROP  ##拒绝客户端访问realserver的虚拟ip,只要输入进来直接DROP掉
[root@server4 ~]# arptables -A OUT -s 172.25.3.100 -j mangle --mangle-ip-s 172.25.3.4
                                                           ##由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能
[root@server4 ~]# /etc/init.d/arptables_jf save

客户端测试
在这里插入图片描述
可以看到在访问虚拟IP100的时候,两个real server依次轮询。当关掉一个real server时,可以看到,会出现访问失败的情况,所以需要有一个检测功能,能够及时勘察出来,避免不好的用户体验。
2.ldirectord实现lvs健康检查

[root@server1 ~]# yum install ldirectord-3.9.5-3.1.x86_64.rpm
##安装服务 [root@server1 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm ##查找配置文件 [root@server1 ~]# cd /etc/ha.d/ [root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf . [root@server1 ha.d]#
vim ldirectord.cf ##修改配置文件
virtual=172.25.3.100:80
real=172.25.3.3:80 gate
real=172.25.3.4:80 gate
fallback=127.0.0.1:80 gate ##server2、3服务down后,访问本机80端口
service=http
scheduler=rr ##调度模式:轮询
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80 ##端口
request=“index.html” ##文件 [root@server1 ha.d]# /etc/init.d/ldirectord start 开启服务

客户端测试:
server3 up
server4 up
在这里插入图片描述

server down,server4up在这里插入图片描述
3、keepalived部署实现heartbeat + ldirectord 的功能

[root@server1 ~]# /etc/init.d/ldirectord stop [root@server1 ~]#
chkconfig ldirectord off
##关闭ldirectord服务,否则会与keepalived冲突 lftp 172.25.3.250:/pub> get keepalived-1.4.3.tar.gz #获取keepalived安装包 [root@server1 ~]# tar
zxf keepalived-1.4.3.tar.gz [root@server1 ~]# cd keepalived-1.4.3 yum
install gcc [root@server1 keepalived-1.4.3]# ./configure
–prefix=/usr/local/keepalived --with-init=SYSV [root@server1 keepalived-1.4.3]# make [root@server1 keepalived-1.4.3]# make
install ##安装keepalived,可能需要安装依赖性服务 [root@server1 ~]# yum
install openssl-devel.x86_64 -y ##解决依赖性
[root@server1 ~]# cd /usr/local/keepalived/etc/rc.d/init.d/
[root@server1 init.d]# chmod +x keepalived
[root@server1 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc
[root@server1 local]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 local]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 local]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 init.d]# vim /etc/keepalived/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 56
priority 100 ##数值要大于BACKUP的
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.129.100
} } virtual_server 172.25.3.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR # persistence_timeout 50
protocol TCP

real_server 172.25.3.3 80 {
    weight 1
    TCP_CHECK {
        connect_timeout 3
        retry 3
        delay_before_retry 3
    }
}

real_server 172.25.3.4 80 {
    weight 1
    TCP_CHECK {
        connect_timeout 3
        retry 3
        delay_before_retry 3
    }
} }

开启服务并重新加载:keepalived

[root@server1 ~]# /etc/init.d/keepalived start [root@server1 ~]#
/etc/init.d/keepalived reload

将server1的配置文件复制给server2

[root@server1 ~]# scp -r /usr/local/keepalived/
[email protected]:/usr/local/ [root@server1 ~]# scp -r
/etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/

对server2的进行backup部署

vim /etc/yum.repos.d/rhel-source.repo ##配置完整的yum源 yum install -y
ipvsadm ##安装服务 yum install openssh -y ln -s
/usr/local/keepalived/etc/keepalived/ /etc/ ln -s
/usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ln -s
/usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ ln -s
/usr/local/keepalived/sbin/keepalived /sbin/ cd
/usr/local/keepalived/etc/rc.d/init.d chmod +x keepalived vim
/etc/keepalived/keepalived.conf
##需修改内容 vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 12
priority 50 #必须小于master
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.0.100
} }
[root@server4 ~]# /etc/init.d/keepalived start [root@server4 ~]# /etc/init.d/keepalived reload [root@server2 ~]# /etc/init.d/httpd
start [root@server3 ~]# /etc/init.d/httpd start

客户端测试
当server1的keepalived关闭时,server为backup自动替补上来
在这里插入图片描述

隧道模式

在这里插入图片描述
隧道模式
做之前清楚原有规则ipvsadm -C

server1
1.modprobe ipip
2.ip addr del 172.25.3.100/32 dev eth0 #删除原来的etho里的vip
3. ip addr add 172.25.3.100/24 dev tunl0 #将vip加到隧道里
4.ip link set up tunl0
5.ipvsadm -A -t 172.25.3.100:80 -s rr
6. ipvsadm -a -t 172.25.3.100:80 -r 172.25.7.2 -i #-i隧道模式
7. ipvsadm -a -t 172.25.3.100:80 -r 172.25.7.3 -i
8.ipvsadm -ln

server2

  1. ip addr del 172.25.3.100/32 dev eth0
  2. modprobe ipip
  3. ip addr add 172.25.3.100/32 dev tunl0
  4. ip link set up tunl0
  5. sysctl -a|grep rp_filter #查看一下,将所有1变为0
  6. sysctl -w net.ipv4.conf.all.rp_filter=0
  7. sysctl -w net.ipv4.conf.default.rp_filter=0
  8. sysctl -w net.ipv4.conf.eth0.rp_filter=0
  9. sysctl -w net.ipv4.conf.tunl0.rp_filter=0
  10. sysctl -a|grep rp_filter #检查一下
  11. sysctl -p
    在这里插入图片描述
    在这里插入图片描述
    server3
  12. ip addr del 172.25.7.100/32 dev eth0
  13. modprobe ipip
  14. ip addr add 172.25.7.100/32 dev tunl0
  15. ip link set up tunl0
  16. sysctl -a|grep rp_filter #查看一下,将所有1变为0
  17. sysctl -w net.ipv4.conf.all.rp_filter=0
  18. sysctl -w net.ipv4.conf.default.rp_filter=0
  19. sysctl -w net.ipv4.conf.eth0.rp_filter=0
  20. sysctl -w net.ipv4.conf.tunl0.rp_filter=0
  21. sysctl -a|grep rp_filter #检查一下
  22. sysctl -p

测试结果可以看到是两个服务轮回出结果

发布了57 篇原创文章 · 获赞 0 · 访问量 1316

猜你喜欢

转载自blog.csdn.net/weixin_45674039/article/details/103674803