keepalived简介

keepalived是分布式部署解决系统高可用的软件,结合lvs(LinuxVirtual Server)使用,解决单机宕机的问题。

keepalived是一个基于VRRP协议来实现IPVS的高可用的解决方案。对于LVS负载均衡来说,如果前端的调度器direct发生故障,则后端的realserver是无法接受请求并响应的。因此,保证前端direct的高可用性是非常关键的,否则后端的服务器是无法进行服务的。而我们的keepalived就可以用来解决单点故障(如LVS的前端direct故障)问题。keepalived的主要工作原理是:运行keepalived的两台服务器,其中一台为MASTER,另一台为BACKUP,正常情况下,所有的数据转换功能和ARP请求响应都是由MASTER完成的,一旦MASTER发生故障,则BACKUP会马上接管MASTER的工作,这种切换时非常迅速的。

LVS简介

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,LVS工作在ISO模型中的第四层,由于其工作在第四层,因此与iptables类似,必须工作在内核空间上。因此lvs与iptables一样,是直接工作在内核中的,叫ipvs,主流的linux发行版默认都已经集成了ipvs,因此用户只需安装一个管理工具ipvsadm即可。

IPVS中实现了三种负载均衡技术:

1、VS/NAT --- Virtual Server via Network Address Translation

通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端真实服务器;真实服务器的响应报文通过调度器时,报文源地址被重写再返回给客户,完成整个负载调度过程。但通常在流量比较大的情况下会造成调度器的瓶颈。因为服务数据的返回必须通过调度器出去。

2、VS/TUN --- Virtual Server via IP Tunneling

采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器 把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。但是目前支持TUN 只有Linux系统

3、VS/DR --- Virtual Server via Direct Routing

VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术 可极大地提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上。也就是说,在这种结构中,数据从外部到内部真实服务器的访问会通过调度器进来,但是真实服务器对其的应答不是通过调度器出去。 即在大多数情况下,真实服务器可以通过各自的网关或者专用的网关对数据进行外发,从而降低调度器负载。

LVS的负载调度算法

针对不同的网络服务和配置需要,LVS调度器提供多种不同的负载调度算法,其中最常用的四种算法包括轮询、加权轮询、最少连接和加权最少连接。

1、轮询( RoundRobin):

将收到的访问请求按照顺序轮流分配给群集中的各节点(真实服务器)。

2、加权轮询( WeightedRoundRobin):

根据真实服务器的处理能力轮流分配收到的访问请求,调度器可以自动查询各节点的负载情况,并动态调整其权重。这样可以保证处理能力强的服务器承担更多的访问流量。

3、最少连接( LeastConnections):

根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。

4、加权最少连接(WeightedLeastConnections):

在服务器节点的性能差异较大的情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大比例的活动连接负载。

LVS优点:

1、抗负载能力强

因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的 lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和 cpu方面基本无消耗。

2、配置性低

这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。

3、工作稳定

因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定的。

4、无流量

上面已经有所提及了。lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。

5、基本上能支持所有应用

因为lvs工作在4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等等。

注:LVS需要手工动态增加命令,所以需要Keepalived来实现自动配合。

Lvs+keepalive负载均衡架构

Centos7搭建lvs+keepalive负载均衡集群_第1张图片

实验环境

系统版本:centos7x3.10.0-514.el7.x86_64

Keepalived版本:keepalived.x86_64 0:1.3.5-6.el7(yum)

Lvs版本:ipvsadm-1.27-7.el7(yum)

Nginx版本:nginx-1.14.0

关闭防火墙并禁止开机自启

systemctl stop firewalld.service
systemctl disable firewalld

关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

重启 reboot

安装Keepalived+Lvs的master主机

IP:192.168.152.170
主要组件: keepalived lvs(ipvsadm)
主要依赖包: gcc openssl openssl-devel

1、安装master组件和依赖包

yum -y install keepalived ipvsadm gcc openssl openssl-devel

2、备份keepalived配置文件

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup

3、编辑keepalived配置文件

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
router_id lvs_clu_1
}
virrp_sync_group Prox {
group {
mail
}
}
vrrp_instance mail {
state MASTER
interface ens33
lvs_sync_daemon_interface ens33
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.152.100
}
}
virtual_server 192.168.152.100 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.152.168 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.152.169 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

Centos7搭建lvs+keepalive负载均衡集群_第2张图片
Centos7搭建lvs+keepalive负载均衡集群_第3张图片

4、开启路由转发

1)添加配置文件

echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf

2)刷新配置

sysctl –p

5、重启keepalived服务并设置开机自启

1)重启keepalived

systemctl restart keepalived

2)开机自启keepalived

systemctl enable keepalived

注:如果服务启动不起来,并报错/usr/lib64/perl5/CORE/libperl.so: file too short,那就必须先升级perl,然后在重新安装这些步骤哦!

6、查看服务

ipvsadm -l
Centos7搭建lvs+keepalive负载均衡集群_第4张图片

安装Keepalived+Lvs的backup主机

IP:192.168.152.91
主要组件: keepalived lvs(ipvsadm)
主要依赖包: gcc openssl openssl-devel

1、安装master组件和依赖包

yum -y install keepalived ipvsadm gcc openssl openssl-devel

2、备份keepalived配置文件

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup

3、编辑keepalived配置文件

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
router_id lvs_clu_1
}
virrp_sync_group Prox {
group {
mail
}
}
vrrp_instance mail {
state backup
interface ens33
lvs_sync_daemon_interface ens33
virtual_router_id 50
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.152.100
}
}
virtual_server 192.168.152.100 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.152.168 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.152.169 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

Centos7搭建lvs+keepalive负载均衡集群_第5张图片
Centos7搭建lvs+keepalive负载均衡集群_第6张图片

4、开启路由转发

1)添加配置文件

echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf

2)刷新配置

sysctl –p

5、重启keepalived服务并设置开机自启

1)重启keepalived

systemctl restart keepalived

2)开机自启keepalived

systemctl enable keepalived

注:如果服务启动不起来,并报错/usr/lib64/perl5/CORE/libperl.so: file too short,那就必须先升级perl,然后在重新安装这些步骤哦!

6、查看服务

ipvsadm -l
Centos7搭建lvs+keepalive负载均衡集群_第7张图片

安装web1和web2的主机

web1的IP:192.168.152.168
web2的IP:192.168.152.169
主要组件:nginx
主要依赖包:gcc gcc-c++ pcre pcre-devel zlib zlib-devel

1、安装web1的依赖包

yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel

2、下载nginx压缩包到服务器

wget https://nginx.org/download/nginx-1.14.0.tar.gz

3、安装nginx

1)解压nginx压缩包

tar zxf nginx-1.14.0.tar.gz

2)进入解压目录

cd nginx-1.14.0

3)配置nginx

./configure
Centos7搭建lvs+keepalive负载均衡集群_第8张图片

4)编译安装nginx

make && make install
Centos7搭建lvs+keepalive负载均衡集群_第9张图片

4、编写nginx启动脚本

vi /etc/init.d/nginx

注:脚本太长这里就不写了,可以访问nginx启动脚本查看!

5、给予启动脚本执行权限

chmod +x /etc/init.d/nginx

6、启动nginx服务

1)设置开机自启

chkconfig nginx on

2)启动nginx

/etc/init.d/nginx start

3)重启nginx

/etc/init.d/nginx restart

4)查看nginx服务启动状态

chkconfig --list

5)查看nginx服务是否开启

netstat -antupl | grep nginx

7、修改内核参数

vi /etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.ip_forward = 0

Centos7搭建lvs+keepalive负载均衡集群_第10张图片

8、添加虚拟IP地址

vi /etc/sysconfig/network-scripts/ifcfg-lo

TYPE=Ethernet
OTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.152.100
NETMASK=255.255.255.255

Centos7搭建lvs+keepalive负载均衡集群_第11张图片

9、添加路由

1)临时添加

routeadd -host 192.168.152.100 dev lo:0

2)永久添加

vi /etc/sysconfig/network-scripts/route-lo:0

193.192.168.152.100 dev lo:0

注:我这里不用添加,因为我用的IP为同一网段所以不添加也行!

实验性能测试

1、先测试高可用性能,首先将keepalived的master主机关闭,看看虚拟IP是否自跳转到keepalived的backup主机上。

2、测试负载均衡性能,首先将其中web的master主机关闭,继续访问是否能访问到web的backup主机,如果可以说明没问题。

3、同时测试高可用和负载均衡,如果当lvs的master主机宕机,自动跳到lvs的backup主机,访问web,同时将后端web的master主机干掉,看看访问是否正常。