一,**简介**
1,**负载均衡的类型**
l 负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载
l 商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载
l 软件负载解决的两个核心问题是:选谁、转发,其中最著名的是 lvs
2,*
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高可用