LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director
Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real
Server)
- DS:Director Server。指的是前端负载均衡器节点。
- RS:Real Server。后端真实的工作服务器。
- VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
- DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
- RIP:Real Server IP,后端服务器的IP地址。
- CIP:Client IP,访问客户端的IP地址。
1. 轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端
RS 配置和处理能力,非常均衡地分发下去。
2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 –
100。主要是对rr算法的一种优化和补充, LVS
会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3. 最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最少链接 wlc
这个算法比 lc 多了一个权重的概念。
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP
地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP
的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
LVS/DR:
跟 VS/TUN 方法相同,VS/DR 利用大多数 Internet 服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB 相连。
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# vim rhel-source.repo
[root@server1 yum.repos.d]# yum repolist
[root@server1 yum.repos.d]# yum install -y ipvsadm
[root@server1 yum.repos.d]# iptables -L
[root@server1 yum.repos.d]# ipvsadm -l
[root@server1 yum.repos.d]# ipvsadm -A -t 172.25.71.100:80 -s rr ##将server1变成虚拟主机(rr:算法)
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.71.100:80 -r 172.25.71.2:80 -g ##添加到server2服务器
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.71.100:80 -r 172.25.71.3:80 -g ##添加到server3服务器
[root@server1 yum.repos.d]# ip addr ##查看ip
[root@server1 yum.repos.d]# ip addr add 172.25.71.100/24 dev eth0 ##将添加虚拟主机号
[root@server1 yum.repos.d]# ip addr
(1)测试失败
[root@foundation71 Desktop]# curl 172.25.71.100 ##是由于tcp的三次握手无法到达server2和server3
^C
[root@foundation71 Desktop]# curl 172.25.71.100
^C
[root@foundation71 Desktop]#
[root@foundation71 Desktop]# curl 172.25.71.100
^C
在server2和server3添加100的ip保证三次握手可以连接:
[root@server2 html]# ip addr add 172.25.71.100/24 dev eth0 ##添加ip
[root@server2 html]# ip addr ##查看
[root@server3 ~]# ip addr add 172.25.71.100/24 dev eth0
[root@server3 ~]# ip addr
(2)添加ip后测试成功
[root@foundation71 Desktop]# curl 172.25.71.100
bbs.westos.org
[root@foundation71 Desktop]# curl 172.25.71.100
www.westos.org---server2
(3)偶然性
由于三个IP均是100在同一个局域网(vlan)会有偶然性:并不知道server1会不会被一直当作调度器来使用
[root@server1 yum.repos.d]# ip addr
link/ether 52:54:00:23:3d:da brd ff:ff:ff:ff:ff:ff ##server1MAC地址
[root@server2 html]# ip addr
link/ether 52:54:00:8d:d6:27 brd ff:ff:ff:ff:ff:ff ##server2MAC地址
[root@server3 ~]# ip addr
link/ether 52:54:00:3c:aa:41 brd ff:ff:ff:ff:ff:ff ##server3MAC地址
[root@foundation71 Desktop]# arp -an |grep 100 ##由于调度器是server1,最开始有了缓存
? (172.25.71.100) at 52:54:00:23:3d:da [ether] on br0
[root@foundation71 Desktop]# arp -d 172.25.71.100 ##删除缓存
[root@foundation71 Desktop]# ping 172.25.71.100 ##ping虚拟ip
[root@foundation71 Desktop]# arp -an |grep 100 ##查看,是server3MAC地址
? (172.25.71.100) at 52:54:00:3c:aa:41 [ether] on br0
(1)安装服务以及添加策略
server2中安装服务和添加策略:
[root@server2 html]# arptables -A IN -d 172.25.41.100 -j DROP ##添加策略当访问时候直接丢弃
[root@server2 html]# arptables -A OUT -s 172.25.41.100 -j mangle --mangle-ip-s 172.25.41.2 ##出去时候以真实的地址
[root@server2 html]# /etc/init.d/arptables_jf save
[root@server2 html]# /etc/init.d/arptables_jf start
[root@server2 html]# arptables -nL ##查看策略已经添加
[root@server3 ~]# arptables -A IN -d 172.25.41.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.41.100 -j mangle --mangle-ip-s 172.25.41.3
[root@server3 ~]# /etc/init.d/arptables_jf save
[root@server3 ~]# /etc/init.d/arptables_jf start
[root@server3 ~]# arptables -nL
[root@foundation71 Desktop]# vim /etc/hosts ##更改解析文件
172.25.71.100 www.westos.org bbs.westos.org
[root@foundation71 Desktop]# arp -an |grep 100
? (172.25.71.100) at 52:54:00:8d:d6:27 [ether] on br0
[root@foundation71 Desktop]# arp -d 172.25.71.100
[root@foundation71 Desktop]# ping 172.25.71.100
[root@foundation71 Desktop]# arp -an |grep 100
? (172.25.71.100) at 52:54:00:3c:aa:41 [ether] on br0 ##server1 MAC地址
[root@foundation71 Desktop]# arp -d 172.25.71.100
[root@foundation71 Desktop]# ping 172.25.71.100
[root@foundation71 Desktop]# arp -an |grep 100
? (172.25.71.100) at 52:54:00:3c:aa:41 [ether] on br0 ##server1 MAC地址
注意:没有将在解析文件中添加主机ip,实验没有效果
在网页中也可以测试:
如果测试时只有server3的,需要在物理中删除arp 绑定的ip
[root@foundation71 Desktop]# arp -d 172.25.71.100
安装包
ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 home]# yum install ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 home]# rpm -ql ldirectord ##查看配置文件
[root@server1 home]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 home]# cd /etc/ha.d/
[root@server1 ha.d]# ls
[root@server1 ha.d]# vim ldirectord.cf ##编辑配置文件
[root@server1 ha.d]# ipvsadm -C ##清楚缓存策略
[root@server1 ha.d]# ipvsadm -l ##查看
[root@server1 ha.d]# /etc/init.d/ldirectord start
[root@server1 ha.d]# ipvsadm -l
[root@server1 ha.d]# vim /etc/httpd/conf/httpd.conf
Listen 80 ##端口改为80
[root@server1 ha.d]# /etc/init.d/httpd restart
[root@server1 ha.d]# cd /var/www/html
[root@server1 html]# ls
[root@server1 html]# rm -fr *
[root@server1 html]# ls
[root@server1 html]# vim index.html
Server ---此站点正在维修 ##编辑内容
[root@server2 ~]# /etc/init.d/httpd stop ##关闭server2的httpd服务
[root@foundation71 Desktop]# curl 172.25.71.100 ##测试server3
bbs.westos.org
[root@server3 ~]# /etc/init.d/httpd stop ##关闭server3的httpd服务
[root@foundation71 Desktop]# curl 172.25.71.100 ##有了健康维护
server1-----此站点正在维修
[root@server1 html]# /etc/init.d/ldirectord stop
[root@server1 html]# chkconfig ldirectord off
安装包
keepalived-2.0.6.tar.gz ##安装keepalived软件的原因就是防止调度器出现错误导致整个系统崩溃
建立一个子盘server4
(1)制作软连接
在server1中
[root@server1 keepalived-2.0.6]# cd
[root@server1 ~]# ls
[root@server1 ~]# cd keepalived-2.0.6
[root@server1 keepalived-2.0.6]# cd /usr/local
[root@server1 local]# ls
[root@server1 local]# cd keepalived/
[root@server1 keepalived]# ls
[root@server1 keepalived]# pwd
/usr/local/keepalived
[root@server1 keepalived]# cd etc/
[root@server1 etc]# ls
[root@server1 etc]# cd rc.d/
[root@server1 rc.d]# ls
[root@server1 rc.d]# cd init.d/
[root@server1 init.d]# pwd
/usr/local/keepalived/etc/rc.d/init.d
[root@server1 init.d]# ls
[root@server1 init.d]# pwd
/usr/local/keepalived/etc/rc.d/init.d
[root@server1 init.d]# ls
[root@server1 init.d]# chmod +x keepalived
[root@server1 init.d]# ls
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 init.d]# cd ..
[root@server1 rc.d]# ls
[root@server1 rc.d]# cd ..
[root@server1 etc]# ls
[root@server1 etc]# cd keepalived/
[root@server1 keepalived]# ls
[root@server1 keepalived]# pwd
/usr/local/keepalived/etc/keepalived
[root@server1 keepalived]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server1 keepalived]# cd ..
[root@server1 etc]# ls
[root@server1 etc]# cd sysconfig/
[root@server1 sysconfig]# pwd
/usr/local/keepalived/etc/sysconfig
[root@server1 sysconfig]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 sysconfig]# cd ..
[root@server1 etc]# ls
[root@server1 etc]# cd ..
[root@server1 keepalived]# ls
[root@server1 keepalived]# cd sbin/
[root@server1 sbin]# ls
[root@server1 sbin]# pwd
/usr/local/keepalived/sbin
[root@server1 sbin]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 sbin]# which keepalived
[root@server1 sbin]# /etc/init.d/keepalived start ##测试
[root@server1 sbin]# /etc/init.d/keepalived stop ##关闭
[root@server1 local]# cd /usr/local
[root@server1 local]# ls
[root@server1 local]# scp -r keepalived/ [email protected]:/usr/local/ ##传给server4
在server4中:
[root@server4 ~]# cd /usr/local/
[root@server4 local]# ls
[root@server4 local]# cd keepalived/
[root@server4 keepalived]# pwd
/usr/local/keepalived
[root@server4 keepalived]# ld
[root@server4 keepalived]# lsc
-bash: lsc: command not found
[root@server4 keepalived]# ls
[root@server4 keepalived]# cd etc/
[root@server4 etc]# cd rc.d/
[root@server4 rc.d]# cd init.d/
[root@server4 init.d]# ls
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 init.d]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server4 init.d]# /etc/init.d/keepalived start
[root@server4 init.d]# /etc/init.d/keepalived stop
(2)进行高可用负载集群的配置
需要将server2和server3的httpd要打开
[root@server1 ~]# cd keepalived-2.0.6
[root@server1 keepalived-2.0.6]# cd keepalived
[root@server1 keepalived]# cd etc/
[root@server1 etc]# cd keepalived/
[root@server1 keepalived]# ls
[root@server1 keepalived]# vim keepalived.conf ##修改配置文件
[root@server1 keepalived]# /etc/init.d/keepalived start ##打开
[root@server1 keepalived]# scp keepalived.conf [email protected]:/etc/keepalived/
在server4中修改配置文件:
[root@server4 init.d]# cd /etc/keepalived/
[root@server4 keepalived]# ls
[root@server4 keepalived]# ls
[root@server4 keepalived]# vim keepalived.conf
安装邮箱以便查看实验结果:
[root@server1 keepalived]# yum install mailx -y
[root@server3 keepalived]# yum install mailx -y
在server1关闭服务破坏内核使其不能工作:
[root@server1 ~]# /etc/init.d/keepalived stop
[root@server1 ~]# echo c >/proc/sysrq-trigger
物理机测试依旧可以正常工作(由于高可用机制server1坏掉之后server4会出来顶替工作):RS的httpd服务开启才可以
关闭server2的httpd
真机测试的时候不会进行轮询
关闭server3的httpd
真机测试本地不会接替让VS访问