LVS+Keepalived

LVS+Keepalived

一,**简介**

1,**负载均衡的类型**

l 负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载

l 商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载

l 软件负载解决的两个核心问题是:选谁、转发,其中最著名的是 lvs

2,**LVS介绍**

2.1 LVS是什么?

l 英文全称是 Linux Virtual Server,即 Linux 虚拟服务器

l 由 章 文 嵩 博 士 发 起 的 自 由 软 件 项 目 , 它 的 官 方 站 点 是 www.linuxvirtualserver.org

l Linux2.4 内核以后,LVS 已经是 Linux 标准内核的一部分

l 可以将请求分发给后端真实服务器处理

l 有许多比较著名网站和组织都在使用 LVS 架设的集群系统,例如:Linux 的门 户网站(www.linux.com)、向 RealPlayer 提供音频视频服务而闻 名的 Real 公 司(www.real.com )、全球最大的开源网站 (sourceforge.net)等

l 提供了多种调度算法

1) 轮询调度(Round-Robin Scheduling)RR算法

2) 加权轮询调度(Weighted Round-Robin Scheduling)WRR算法

3) 最小连接调度(Least-Connection Scheduling)LC算法

4) 加权最小连接调度(Weighted Least-Connection Scheduling)WLC算法

5) 基于局部性的最少链接(Locality-Based Least Connections Scheduling)LBLC算法

6) 带 复 制 的 基 于 局 部 性 最 少 链 接 ( Locality-Based Least Connections with Replication Scheduling)LBLCR算法

7) 目标地址散列调度(Destination Hashing Scheduling)DH算法

8) 源地址散列调度(Source Hashing Scheduling)SH算法

9) 最短预期延时调度(Shortest Expected Delay Scheduling)SED算法

10) 不 排 队 调 度 ( Never Queue Scheduling )NQ算法

l 有三种转发规则

1) NAT:简单理解,就是数据进出都通过 LVS,性能不是很好。

2) TUNL:简单理解:隧道

3) DR:最高效的负载均衡规则

2.2 lvs的体系结构

l 最前端的负载均衡层,用 Load Balancer 表示

l 中间的服务器集群层,用 Server Array 表示

l 最底端的数据共享存储层,用 Shared Storage 表示

l 在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服 务器提供的高性能服务

 

2.3 lvs的优点

l 抗负载能力强,因为 lvs 工作方式的逻辑是非常之简单,而且工作在网络 4 层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。

l 有完整的双机热备方案,当节点出现故障时,lvs 会自动判别,所以系统整体是非常稳定的。

l 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.

l 很好的可伸缩性(Scalability)

l 很好的可靠性(Reliability)

l 很好的可管理性(Manageability)

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

2.4 lvs的负载均衡机制

l lvs 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之 上

l 传输层上有 TCP/UDP,lvs 支持 TCP/UDP 的负载均衡

l 因为 LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法, 比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效 率是非常高的

l lvs 的转发可以通过修改 IP 地址实现(NAT 模式)

l lvs 的转发还可以通过修改直接路由实现(DR 模式)

2.5 lvs于nginx对比

l 负载度 lvs 优于 nginx

l 稳定度 lvs 优于 nginx

l 服务器性能要求 lvs 优于 nginx

l 网络层数的效率 lvs 优于 nginx ² 网络七层:应用层、会话层、表示层、传输层、网络层、链路层、 物理层

l 功能多少 nginx 优于 lvs

3,**Keepalived介绍**

3.1 什么是keepalived

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说

第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉

3.2 简介

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工

出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时

用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将

务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人

做的只是修复故障的服务器

3.3 工作原理

Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

l Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

l Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

l Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。

l SSL_GET与HTTP_GET相同,但使用SSL连接到远程Web服务器。

l MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。结果必须是0或1.该脚本在导演盒上运行,这是测试内部应用程序的理想方式。可以使用完整路径(即/path_to_script/script.sh)调用可以不带参数运行的脚本。那些需要参数的需要用双引号括起来(即“/path_to_script/script.sh arg 1 … arg n”)

3.4 作用

主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间 failover的实现

3.5 为什么使用keepalived

当我们的服务器意外挂了之后,我们要怎么做?

当然是找一台新的机器,替代现有的机器,然后做新的环境部署,端口映射, 域名解析等等一系列的工作,再将服务重新启动;但是如果这一系列的操作都 是手动完成的,那么等你把这些工作搞好,可能服务已经停止个把小时了,这 会儿估计运营早就提着菜刀架在你脖子上了;

但是如果使用了KeepAlived之后,然后提前将备用机准备好,当主的机器挂掉 之后,自动将VIP给你切换到备用机,并且以邮件的形式告诉你说主服务已经 挂了,你得赶紧恢复起来;这时候你就可以慢慢的去找主服务的问题,这时候 并不会影响到你的正常业务运行。

二,**安装**

1 环境规划

两台webserver

Centos7.6 lvs keepalived 主 192.168.25.31 master

Centos7.6 lvs keepalived 备 192.168.25.32 slave

VIP地址 192.168.25.50

2 配置

2.1 修改两台主机名

25.31:master

25.32:slave

2.2 配置

两台都需要的配置

(1) 在线安装httpd
 [root@master ~]# yum -y install httpd
(2) 设置开机自启动
 [root@master ~]# systemctl enable httpd.service
 
 [root@master ~]# systemctl list-unit-files |grep httpd
 
 httpd.service                                 enabled
(3) 开启http服务
 [root@master ~]# systemctl start httpd.service
(4) 通过浏览器访问http服务,默认端口是80

(5) 创建html文件,写入内容,区分两个节点

Master:

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

node01 service

 

Slave:

 [root@slave ~]# vim /var/www/html/index.html
 
 [root@slave ~]# cat /var/www/html/index.html
 
 node02 service
(6) 创建脚本并写入如下内容,然后赋予权限并启动

在centos7里面需要先执行安装net_tools不然执行脚本时会报错

 [root@slave ~]# yum -y install net-tools
 
 [root@master ~]# vim /etc/init.d/realserver
 
 #!bin/bash
 
 SNS_VIP=192.168.25.100 #定义一个VIP变量,必须跟真实服务在一个网段
 
 source /etc/rc.d/init.d/functions
 
 case "$1" in
 
 start)
 
 echo "start lvs of realserver"
 
 /sbin/ifconfig lo:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 up #增加一个本地路由 lo:0
 
 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
 
 echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
 
 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
 
 echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
 
 ;;
 
 stop)
 
 /sbin/ifconfig lo:0 down
 
 echo "close LVS Directorserver"
 
 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
 
 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
 
 echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
 
 echo "0" >/prco/sys/net/ipv4/conf/all/arp_anounce
 
 ;;
 
 *)
 
 echo "Usage: $0 {start|stop}"
 
 exit 1
 
 esac
 
 [root@master ~]# chmod 777 /etc/init.d/realserver
 
 [root@master init.d]# service realserver start
 
 Starting realserver (via systemctl):                       [ 确定 ]
 
 [root@master ~]# ifconfig

(7) 第二台http也同样做上面的步骤,增加路由,SNS_VIP要跟第一台一样

Master:

 [root@master init.d]# scp realserver root@192.168.25.32:/etc/init.d/

Slave:

 [root@slave init.d]# chmod 777 realserver 
 
 [root@slave init.d]# service realserver start
 
 Reloading systemd:                           [ 确定 ]
 
 Starting realserver (via systemctl):               [ 确定 ]
 
 [root@slave init.d]# ifconfig

(8) 查看系统内核版本,2.4以后就有lvs,不用安装

Master:

[root@master ~]# uname -a

Linux master 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Slave:

[root@slave ~]# uname -a

Linux slave 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 	2019 x86_64 x86_64 x86_64 GNU/Linux
(9) 在两台机器上安装keepalived,做心跳检查用的
[root@master ~]# yum -y install keepalived
(10) 备份keepalived配置文件,然后进行更改
[root@master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@master ~]# vim /etc/keepalived/keepalived.conf

global_defs {                       

#   notification_email {             

#   }

#   smtp_connect_timeout 30

​        router_id LVS_DEVEL             

}

vrrp_instance VI_1 {            

​        state MASTER   				 #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器    

​        interface ens160   			 #指定HA监测网络的接口

​        virtual_router_id 51  			 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的

​        priority 100         			 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级

​        advert_int 1         			 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是       

​	authentication {      		  	 #设置验证类型和密码

​                auth_type PASS  		 #设置验证类型,主要有PASS和AH两种

​                auth_pass 1111  		 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信

​        }

​        virtual_ipaddress {         

​                192.168.25.100 			 #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个

​        }

}

virtual_server 192.168.25.100 80 {  		 #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开

​        delay_loop 6           			 #设置运行情况检查时间,单位是秒

​        lb_algo wrr            			 #设置负载调度算法,这里设置为wrr,即加权轮询调度

​        lb_kind DR        			 #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选这里使用LVSDR模式                 

​        nat_mask 255.255.255.0   

​        persistence_timeout 0    		 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。

​                                		 #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。

​                              			 #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作

​                              			 #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制

 

​        protocol TCP       			 #指定转发协议类型,有TCP和UDP两种                    

​        real_server 192.168.25.31 80 {   	 #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开

​                weight 1       			 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器

​			     		    	 #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源

​                TCP_CHECK {                      #realserver的状态检测设置部分,单位是秒

​                        connect_timeout 10       #表示10秒无响应超时

​                        nb_get_retry 3           #表示重试次数

​                        delay_before_retry 3     #表示重试间隔

​                        connect_port 80

​                }

​        }

​        real_server 192.168.25.32 80 {

​                weight 2

​                TCP_CHECK {

​                        connect_timeout 10

​                        nb_get_retry 3

​                        delay_before_retry 3

​                        connect_port 80

​                }

​        }

}

 

(11) 启动keepalived
[root@master ~]# systemctl start keepalived.service
(12) Slave修改配置文件
[root@slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@slave ~]# vim /etc/keepalived/keepalived.conf

(在slave上只需要修改state MASTER  为state backup和优先级低于master就行)

global_defs {                       

#   notification_email {             

#   }

#   smtp_connect_timeout 30

​        router_id LVS_DEVEL             

}

vrrp_instance VI_1 {            

​        state BACKUP   				

​        interface ens160   			

​        virtual_router_id 51  			

​        priority 90         			 

​        advert_int 1         			 

​	authentication {      		 

​                auth_type PASS  		 

​                auth_pass 1111  		 

​        }

​        virtual_ipaddress {         

​                192.168.25.100 			 

​        }

}

virtual_server 192.168.25.100 80 {  		

​        delay_loop 6           			

​        lb_algo wrr            			 

​        lb_kind DR        			 

​        nat_mask 255.255.255.0   

​        persistence_timeout 0    		 

​                                		 

​                              			 

​                              			 

 

​        protocol TCP       			 

​        real_server 192.168.25.31 80 {   	 

​                weight 1       			 

​			     		    	 

​                TCP_CHECK {                      

​                        connect_timeout 10       

​                        nb_get_retry 3         

​                        delay_before_retry 3  

​                        connect_port 80

​                }

​        }

​        real_server 192.168.25.32 80 {

​                weight 2

​                TCP_CHECK {

​                        connect_timeout 10

​                        nb_get_retry 3

​                        delay_before_retry 3

​                        connect_port 80

​                }

​        }

}

 

(13) 启动keepalived
[root@slave ~]# systemctl start keepalived.service

三,**测试**

1. 访问虚拟IP192.168.25.100 ,查看当前服务器提供的服务

2. 把master的http服务停掉再次访问虚拟ip,故障移除,认为down掉了就会自动切换到备上

[root@master ~]# systemctl stop httpd.service

3. 启动主lvs,自动切换到优先级较高的主上

[root@master ~]# systemctl start httpd.service

4. 测试后,证明主备自动切换,lvs高可用

 

 

原文地址:https://www.cnblogs.com/clllum/p/11792041.html