前言介绍:负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录
LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。
LVS原理:
1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
LVS组成:
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1.ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
LVS相关术语:
1. DS:Director Server。指的是前端负载均衡器节点。
2. RS:Real Server。后端真实的工作服务器。
3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5. RIP:Real Server IP,后端服务器的IP地址。
6. CIP:Client IP,访问客户端的IP地址。
lvs三种工作模式和8中调度算法:
(3钟模式):Tun NAT DR
(8中算法):轮叫调度 rr;加权轮叫 wrr;最少链接 lc;加权最少链接 wlc;基于局部性的最少连接调度算法 lblc;复杂的基于局部性最少的连接算法 lblcr;目标地址散列调度算法 dh;源地址散列调度算法 sh;
最常用:RR WLC
RR:这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
WLC:这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
这个算法比 lc 多了一个权重的概念。(LVS具体介绍看连接:
https://blog.csdn.net/Ki8Qzvka6Gz4n450m/article/details/79119665)
本文介绍DR模型:
1、实验环境
4台节点
Keepalived1 + lvs1(Director1):192.168.163.135
Keepalived2 + lvs2(Director2):192.168.163.136
Real server1:192.168.163.140
Real server2:192.168.163.141
VIP:192.168.163.88
1:下载RPM软件包 http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26-1.src.rpm
2:安装 rpm -ivh ipvsadm-1.26-1.src.rpm 包
3:yum install ipvsadm 安装软件
4:执行 ipvsadm 看是否有下面输出说明安装成功
5:执行命令 lsmod|grep ip_vs 检查当前加载的内核模块,看是否存在 ip_vs 模块
注 1、只有执行 ipvsadm 以后,才会在内核加载 ip_vs 模块
修改系统参数vi /etc/sysctl.conf 修改:
net.ipv4.ip_forward = 1 #原来是0,需要改成1,启用路由转发功能
net.ipv4.conf.all.send_redirects = 0 #新增,为了避免网络内的ARP解析出现异常,应该关闭linux内核的ICMP重定向参数响应。 net.ipv4.conf.default.send_redirects = 0 #新增
net.ipv4.conf.eth0.send_redirects = 0 #新增,如果有多个网卡启用,都需关闭
使用 sysctl -p 命令使上述参数设置立即生效
LVS调优,
增大LVS并发连接量 在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为: options ip_vs conn_tab_bits=20
然后在命令行里输入以下命令即生效: modprobe -r ip_vs service ipvsadm restart
通过ipvsadm -Ln 查看得知(size = 4096 )变成 (size = 1048576)
二。安装Keepalived(主备都要安装)
1.安装环境: yum install kernel-devel kernel-headers openssl-devel openssl popt popt-devel gcc gcc-c++ -y
2.下载安装keepalived-*.tar.gz(官网地址:http://www.keepalived.org/download.html,主备都要安装)
可直接YUM 安装。
查看LVS调度状态及各服务器接收请求数:ipvsadm -Ln查看
查看Keepalived状态,可以通过查看主备系统日志/var/log/messages
三:LVS服务端:LVS+KEEPALIVED 结合使用的:直接在配置文件配置就行了:
主服务器:
[root@node03 keepalived]# cat keepalived.conf
! Configuration: command not found
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id NodeA
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.163.88
}
}
virtual_server 192.168.163.88 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.163.143 80 {
weight 1
HTTP_GET {
url {
path /index.jsp
digest d56cb3910a67c34951a4341aea30ecda
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.163.140 80 {
weight 1
HTTP_GET {
url {
path /index.jsp
digest d56cb3910a67c34951a4341aea30ecda
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备服务器:
[root@node04 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id NodeA
}
vrrp_instance VI_1 {
state backup
interface eth0
virtual_router_id 51
priority 96
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.163.88
}
}
virtual_server 192.168.163.88 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.163.143 80 {
weight 1
HTTP_GET {
url {
path /index.jsp
digest d56cb3910a67c34951a4341aea30ecda
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.163.140 80 {
weight 1
HTTP_GET {
url {
path /index.jsp
digest d56cb3910a67c34951a4341aea30ecda
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置文件解析:
vrrp_instance VI_1 :定义名
virtual_server 192.168.163.88 80 : 这里配置虚拟服务器 (192.168.163.88 为虚拟IP, 监听80端口)客户端就访问这个地址。
delay_loop :健康检查时间间隔,单位是秒。
lb_algo :负载均衡调度算法,互联网应用常使用 wlc 或 rr。
lb_kind :负载均衡转发规则。一般包括 DR,NAT,TUN3 种,在我的方案中,都使用DR 的方式。
persistence_timeout. :会话保持时间,单位是秒。这个会话是网络7层传输协议中的(第三层)会话。比如我们把它设置为60,那么客户端60秒内访问LVS虚拟服务器的请求都会被转到到同1个后台服务器节点。如果设置为0,那么每次请求都会根据配置的调度情况进行分发。
转发协议 protocol. 一般有 tcp 和 udp 两种。实话说,我还没尝试过 udp 协议类的转发。
real_server 192.168.163.140 80 : 这里配置真实服务器的地址与端口。
weight 1 :权重,不解释了。一般都是机器性能好的高一些,低的小一些。
HTTP_GET:配置健康检查
url {
path /index.jsp 健康检查的页面
digest 625eddd79c61cf84c71c0c17448f8093 根据页面计算出的MD5的值,这个值一定不能随便写,不然keepliv
}
下面说一下如何计算digest
我的keepalived的安装目录在 /usr/local/keepalive/
进入到/usr/bin/
./genhash -s 192.168.1.107 -p 8080 -u /index.jsp
通过上诉命令计算digest 然后写到配置文件上就可以了。
connect_timeout 5 :连接超时时间
nb_get_retry 3 :重连次数
delay_before_retry 3 :重连间隔时间
connect_port 8080 :检测端口
keepalived的2个节点执行如下命令,开启转发功能:
# echo 1 > /proc/sys/net/ipv4/ip_forward
两台rs:
[root@node02 keepalived]# cat lvs_br_rs.sh
#!/bin/bash
ipv=/sbin/ipvsadm
vip=192.168.163.88
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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
两节点启动httpd服务:systemctl start httpd
验证:
访问http://192.168.163.88:80
1.关闭主keeplived服务,自动切换,依旧访问。
2关闭140的httpd服务,依旧访问143的服务。
3.根据RR算法,1:1访问后端服务。