lvs+keepalived实现高可用负载均衡

一、lvs


1.名词解释
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
2.lvs的技术简介
以下引用自百度百科
【1】技术简介
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
【2】集群采用三层结构
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区。
3.三种 IP 负载均衡技术
lvs+keepalived实现高可用负载均衡_第1张图片
在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。

二、keepalived


1.作用
主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

**三、LVS(IP负载均衡)+Keepalived的部署**

这里我们采用VS/DR
实验环境: rhel6
server1: 172.25.70.1
server2: 172.25.70.2
server3: 172.25.70.3
server4: 172.25.70.4

server1为调度服务器(vs),server2和server3为rs(真实的后端服务器),server4为keepalived备机
1.利用ipvsadm
利用ipvsadm内核功能,(不需要开启,用户层面需要控制这个服务,调用脚本来保存)策略)

  • 所需软件:ipvsadm-1.26-2.el6.x86_64 (配置yum源) 添加如下:
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.70.250/rhel6.5/HighAvailability
gpgcheck=0


[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.70.250/rhel6.5/ResilientStorage
gpgcheck=0


[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.70.250/rhel6.5/ScalableFileSystem
gpgcheck=0


[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.70.250/rhel6.5/LoadBalancer
gpgcheck=0
  • 安装
[root@server1 ~]# yum install ipvsadm -y
  • 调度服务器(vs)做如下配置(server1)
[root@server1 ~]# ip addr add 172.25.70.100/24 dev eth0   #添加一个vip
[root@server1 ~]# ipvsadm -A -t 172.25.70.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.3:80 -g

添加一个vip(调度服务器的虚拟ip)以及为该vip绑定两个rs(真实的后端服务器)的ip,他们的监听端口都为80

  • 在rs上做下面配置(server2&&server3)
    我们在真实的服务器上自然也需要添加vip,但是需要安装arptables_jf插件,然后在该插件上做一些策略,使得ip地址为vip的数据包,在进入rs的时候被丢弃,并且rs的数据包在出去的时候广播的是自己真实的ip而不是vip
[root@server2 ~]# yum install arptables_jf -y

[root@server2 ~]# arptables -A IN -d 172.25.70.100 -j DROP
[root@server2 ~]# arptables -A OUT -s  172.25.70.100 -j mangle --mangle-ip-s 172.25.70.2
[root@server2 ~]# ip addr add 172.25.70.100/24 dev eth0
server3同理
  • 在server2&&serer3的apache的默认发布目录下分别编辑这样的页面
[root@server2 ~]# vim /var/www/html/index.html 

the page from server2

[root@server3 ~]# vim /var/www/html/index.html

the page from server3

  • 测试,通过访问vip看是否能在rs键实现轮循
[root@foundation70 kiosk]# curl 172.25.70.100

the page from server3

[root@foundation70 kiosk]# curl 172.25.70.100

the page from server2

测试成功,同时我们可以查看该vip的访问对应哪一台服务器的mac地址

[root@foundation70 kiosk]# arp -an | grep 100
? (172.25.70.100) at 52:54:00:ff:a3:61 [ether] on br0
You have new mail in /var/spool/mail/kiosk

lvs+keepalived实现高可用负载均衡_第2张图片
如你所料,对应的是vs的mac地址,具体原理可以参见这篇博客(我感觉不可能有人家写的具体详细~~)

2.keepalived的安装和部署

  • 安装keepalived
    需要的材料:keepalived-1.3.6.tar.gz libnfnetlink-devel-1.0.0-1.el6.x86_64.rp
[root@server1 ~]# tar -zxf keepalived-1.3.6.tar.gz
[root@server1 ~]# yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm openssl-devel libnl-devel iptables-devel -y
[root@server1 ~]# cd keepalived-1.3.6
[root@server1 keepalived-1.3.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV        #编译检查
[root@server1 keepalived-1.3.6]# make
[root@server1 keepalived-1.3.6]# make install
  • 做4个软连接,方便后续操作
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ 
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 keepalived-1.3.6]# chmod +x /etc/init.d/keepalived  #为启动脚本加上可执行权限
  • 由于我们接下来修改的keepalived的配置文件,会给我们自动添上vip,所以我们先把之前做实验的vip删除
[root@server1 keepalived-1.3.6]# ip addr del 172.25.70.100/24 dev eth0
  • 检查一下server1的iptables的策略,如果出现下图策略,则删除
    lvs+keepalived实现高可用负载均衡_第3张图片
  • 更改keepalived的配置文件
[root@server1 keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
        2721671190@qq.com    #接收警报的 email 地址,可以添加多个
   }
   notification_email_from  keepalived@server1.example.com #设置邮件的发送地址
   smtp_server 127.0.0.1     #设置 smtp server 地址
   smtp_connect_timeout 30   #设置连接 smtp 服务器超时时间
   router_id LVS_DEVEL       #load balancer 的标识 ID,用于 email 警报
}

vrrp_instance VI_1 {
    state MASTER             #该服务器的状态为master
    interface eth0           #高可用监测的网络接口
    virtual_router_id 51     #主、备机的 virtual_router_id 必须相同,取值 0-255
    priority 100             #主机的优先级,备份机改为 50,主机优先级一定要大于备机
    advert_int 1             #主备之间的通告间隔秒数
    authentication {         #主备切换时的验证
        auth_type PASS       #设置验证类型,主要有 PASS 和 AH 两种
        auth_pass 1111       #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信
    }
virtual_ipaddress {          #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个
        172.25.70.100
    }
}

virtual_server 172.25.70.100 80 {     #定义虚拟服务器
    delay_loop 6                      #每隔 6 秒查询 realserver 状态
    lb_algo rr                        #lvs 调度算法,这里使用轮叫
    lb_kind DR                        #LVS 是用 DR 模式
    #persistence_timeout 50
    protocol TCP                      #指定转发协议类型,有 tcp 和 udp 两种

    real_server 172.25.70.2 80 {      #realserve 的状态检测设置部分,单位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒无响应超时
                nb_get_retry 3        #重试次数
                delay_before_retry 3  #重试间隔
        }
    }
real_server 172.25.70.3 80 {          #realserve 的状态检测设置部分,单位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒无响应超时
                nb_get_retry 3        #重试次数
                delay_before_retry 3  #重试间隔
        }
    }
}

注意:persistence_timeout 表示会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在 50 秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受 50 秒的时间限制。

[root@server1 keepalived]# /etc/init.d/keepalived restart   #重启服务

我们说keepalived可以自动添加vip,并具有安全检查的功能,即后端的服务器挂掉,可以检测出来,来测试一下
成功添加上vip
lvs+keepalived实现高可用负载均衡_第4张图片
自动安全检查

[root@server2 ~]# /etc/init.d/httpd stop  #down掉后端一台服务器
[root@server1 keepalived]# ipvsadm -Ln    #在活跃的rs中没有server2的ip
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.70.100:80 rr
  -> 172.25.70.3:80               Route   1      0          0         

这样我们在测试机上就只能访问到server3的apache网页信息

[root@foundation70 keepalived]# curl 172.25.70.100

the page from server3

[root@foundation70 keepalived]# curl 172.25.70.100

the page from server3

而如果没有keepalived,后端一台服务器挂掉结果

[root@server1 keepalived]# /etc/init.d/keepalived  stop
[root@server2 ~]# /etc/init.d/httpd stop
[root@foundation70 keepalived]# curl 172.25.70.100   #结果是都不能访问
curl: (7) Failed connect to 172.25.70.100:80; No route to host
You have new mail in /var/spool/mail/kiosk

3.高可用
我们假设这么一种情况,如果部署keepalived的服务器(即本实验的server1挂掉)那么很显然,我们后端的服务器将都不能访问,为了解决这种问题,下面实验我们要做主备模式的keepalived,实现高可用。

  • 在server4上安装keepalived,直接拷贝server1上的keepalived
[root@server1 local]# scp -r keepalived/ server4:/usr/local/
  • 为server4做四个软连接并加上启动脚本的执行权限
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# chmod +x /etc/init.d/keepalived 
  • 更改配置文件,只需要更改state和priorit
[root@server4 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
        2721671190@qq.com    #接收警报的 email 地址,可以添加多个
   }
   notification_email_from  keepalived@server1.example.com #设置邮件的发送地址
   smtp_server 127.0.0.1     #设置 smtp server 地址
   smtp_connect_timeout 30   #设置连接 smtp 服务器超时时间
   router_id LVS_DEVEL       #load balancer 的标识 ID,用于 email 警报
}

vrrp_instance VI_1 {
    state ABCKUP             #该服务器的状态为master
    interface eth0           #高可用监测的网络接口
    virtual_router_id 51     #主、备机的 virtual_router_id 必须相同,取值 0-255
    priority 50              #主机的优先级,备份机改为 50,主机优先级一定要大于备机
    advert_int 1             #主备之间的通告间隔秒数
    authentication {         #主备切换时的验证
        auth_type PASS       #设置验证类型,主要有 PASS 和 AH 两种
        auth_pass 1111       #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信
    }
virtual_ipaddress {          #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个
        172.25.70.100
    }
}

virtual_server 172.25.70.100 80 {     #定义虚拟服务器
    delay_loop 6                      #每隔 6 秒查询 realserver 状态
    lb_algo rr                        #lvs 调度算法,这里使用轮叫
    lb_kind DR                        #LVS 是用 DR 模式
    #persistence_timeout 50
    protocol TCP                      #指定转发协议类型,有 tcp 和 udp 两种

    real_server 172.25.70.2 80 {      #realserve 的状态检测设置部分,单位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒无响应超时
                nb_get_retry 3        #重试次数
                delay_before_retry 3  #重试间隔
        }
    }
real_server 172.25.70.3 80 {          #realserve 的状态检测设置部分,单位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒无响应超时
                nb_get_retry 3        #重试次数
                delay_before_retry 3  #重试间隔
        }
    }
}
[root@server4 ~]# /etc/init.d/keepalived  start
Starting keepalived:                                       [  OK  ]
  • 为servre4上安装ipvsadm,同server1
[root@server4 ~]# yum install ipvsadm -y
  • 测试
[root@server4 ~]# ipvsadm -Ln     #策略因为配置文件自动添加
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.70.100:80 rr
  -> 172.25.70.2:80               Route   1      0          0         
  -> 172.25.70.3:80               Route   1      0          0         
[root@server1 local]# /etc/init.d/keepalived stop  #挂掉server1的keepalived
[root@foundation70 keepalived]# curl 172.25.70.100  #成功访问server2&&server3,并且是轮叫模式

the page from server3

[root@foundation70 keepalived]# curl 172.25.70.100

the page from server2

[root@foundation70 keepalived]# arp -an | grep 100   #查看该vip处于的mac地址
? (172.25.70.100) at 52:54:00:5f:de:54 [ether] on br0
You have new mail in /var/spool/mail/kiosk

和server4的mac地址一致。证明server4的keepalived生效
lvs+keepalived实现高可用负载均衡_第5张图片

打开master的keepalived服务

[root@server1 local]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]

再次访问server2&&server3,并查看mac地址,发现mac地址改变
lvs+keepalived实现高可用负载均衡_第6张图片
来验证一下是否为serevr1的mac地址
lvs+keepalived实现高可用负载均衡_第7张图片
证明主备模式的作用,当master恢复的时候,由于权值比较大的关系,所以是通过master的作用将数据包传递给后端的rs。

你可能感兴趣的:(lvs+keepalived实现高可用负载均衡)