一、集群的种类:
LB: Load Balancing 负载均衡 LVS、haproxy
HA: High Availability 高可用 heartbeat、RHCS、keepalived
HP: High Performance 高性能
二、LVS概述
LVS 是Linux virtual server的简称,是由中国Linux程序员章文嵩博士发起和领导的,基于Linux系统的服务器LB集群解决方案。Linux 2.6内核起已经安装了ipvs。LVS是调度器,它不真正提供服务,但它接受客户的访问,为整个集群提供一个唯一的入口,来和真实服务器(Real Server)通信。
三、LVS三种模式
VS/NAT: 网络地址转换模式,进站/出站的数据流量经过调度器
VS/DR: 直接路由模式,只有进站的数据流量经过调度器
VS/TUN: 隧道模式,只有进站的数据流量经过调度器
四、关于ipvsadm:
ipvsadm是运行于用户空间、用来与ipvs交互的命令行工具,常见用法如下:
ipvsadm -A|E -t|u service-address [-s scheduler]
ipvsadm -D -t|u service-address
ipvsadm -a|e -t|u service-address -r server-address -g|i|m -w weight
ipvsadm -d -t|u service-address -r server-address
ipvsadm -C
-A|-E | 新增一条Director规则 | 重新编辑一条Director规则 |
-t|-u | 指定VIP:PORT,t是指TCP,u是指UDP |
-s | 指定调度算法 |
-D | 删除一条虚拟服务器规则 |
-a|-e | 新增一条真实服务器规则 | 修改一条真实服务器规则 |
-g|-i|-m | LVS-DR模式(默认) | LVS-TUN模式 | LVS-NAT模式 |
-w | 指定权重值 |
-d | 删除一条真实服务器规则 |
-C | 清除所有规则 |
-L|-l | 查看所有的规则 |
五、部署
VIP(virtual IP): 调度器用来向客户端提供服务的IP
DIP(director IP): 调度器用来和真实服务器通信的IP
RIP(real IP): 真实服务器的IP地址
1. VS-NAT
原理:当用户请求到达director之后,director将请求报文的目标地址(即VIP)改成选定的real server的RIP地址,同时将报文的目标端口也改成选定的real server的相应端口,最后将报文请求发送到指定的real server。在real server处理完请求后,将数据返给director,而director将报文的源地址和源端口改成VIP和相应端口,然后把数据发送给用户,完成整个负载调度过程。
环境: director:VIP 192.168.2.98 DIP 172.16.1.1
real server1(RIP1):172.16.1.100
real server2(RIP2):172.16.1.200
[root@ipvs ~]# grep -i 'ip_vs' /boot/config-2.6.32-358.el6.x86_64 CONFIG_IP_VS=m #可以看到ipvs是以模块化的方式编译在内核中
配置Director:
[root@ipvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #开启IP转发 [root@ipvs ~]# ipvsadm -A -t 192.168.2.98:80 -s wrr [root@ipvs ~]# ipvsadm -a -t 192.168.2.98:80 -r 172.16.1.100:80 -m -w 1 [root@ipvs ~]# ipvsadm -a -t 192.168.2.98:80 -r 172.16.1.200:80 -m -w 2
配置real server:
只需简单配置2台httpd即可,创建index.html分别为WEB1和WEB2。
这样就算完成了LVS-NAT了。
[root@node2 ~]# ab -c 500 -n 2000 http://192.168.2.98/index.html #在client上进行测试 [root@ipvs ~]# ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.2.98:http wrr -> 172.16.1.100:http Masq 1 0 712 -> 172.16.1.200:http Masq 2 0 1380 #在Director上进行状态查看
小结:由于Director既需要接收client请求,又需要帮助real server发送数据,所以Director的负担就会比较重,会成为整个LB集群的性能瓶颈。
2. IPVS-DR
环境: director:VIP 172.16.1.10 DIP 172.16.1.1
real server1(RIP1):172.16.1.100
real server2(RIP2):172.16.1.200
real server配置(两台配置一样):
[root@mysql ~]# ifconfig lo:1 172.16.1.10/32 [root@mysql ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@mysql ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
Director配置:
[root@ipvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@ipvs ~]# ifconfig lo:1 172.16.1.10/32 [root@ipvs ~]# ipvsadm -A -t 172.16.1.10:80 -s wlc [root@ipvs ~]# ipvsadm -a -t 172.16.1.10:80 -r 172.16.1.100:80 -g -w 1 [root@ipvs ~]# ipvsadm -a -t 172.16.1.10:80 -r 172.16.1.200:80 -g -w 2
arp_ignore=1是让网卡收到ARP广播时,不要回应,直接忽略;
arp_announce=2是让网卡不要向外发送ARP广播。
原理:
⑴ 客户端向Director的VIP发出请求
⑵ Director收到请求后,根据负载均衡算法修改报文的目标MAC为其中一台real server的RIP的MAC,将报文发送出去
⑶ real server收到报文发现目标MAC是自己的RIP的MAC,目标IP是VIP,和自己的lo口上的IP一样,于是将报文处理后,以自己的VIP为源IP,client IP为目标IP,发送出去
3. LVS-TUN
由于NAT模式中,Director负担较重,易成为性能瓶颈,而DR模式中,所有群集服务器必须和Director在同一个网段,所以就出现了一个折中的方案---TUN模式,但是TUN模式并不是想象中的那么完美,因为可以跨网段,所以网络的拥堵会导致其性能下降,所以企业中一般还是用DR模式。
原理:当用户请求到达director之后,director将请求报文的目标地址(即VIP)改成选定的real server地址。然后,调度器采用ip隧道技术将用户请求发送到某个real server,而这个real server将直接相应用户的请求,不再经过director。此外,对realserver的地域位置没有要求,可以和director在不在同一网段都可以。
六、LVS的持久连接
无论基于什么样的算法,只要期望源于同一个客户端的请求都由同一台Real server响应时,就需要用到持久连接。当使用LVS的持久连接时,Director会用连接状态追踪hash表(通常被成为持久连接模版)将客户端请求以及对应的real server记录下来,从而确保这个客户端在某段时间内被分配到相同的real server上。
ipvsadm -p timeout 开启持久连接,并指定超时时间,单位为s,默认为300s。如果在指定时间内,用户连接并没有断开,通常会延长120s,直到用户退出为止。为了保证其时效性,Hash table中“连接追踪”信息被定义了“生存时间”。LVS为记录“连接超时”定义了三个计时器:
ipvsadm --set tcp tcpfin udp
tcp TCP的超时时间间隔;
tcpfin TCP握手的超时时间;
udp 无连接的UDP数据包(记录其两次发送数据包的时间间隔);
-Z | 清空计数器 |
-lcn | 查看LVS的连接状态 |
-f | 指定iptables标记 |
-p | 指定持久连接的超时时间 |
持久连接的类型:
Persistent client connections (PCC) | 将同一个客户端的请求始终定向到同一个Real Server上。 |
Persistent port connections (PPC) | 将来自同一个客户端对某个特定服务的请求定位到同一个Real Server上去。 |
Persistent Netfilter Marked Packetpersistence | 用iptables标记来实现将同一个用户对某几个特定端口(如:80和443)的请求,定位到同一台real Server上去。 |
FTP connections | 首先限定FTP的被动模式的端口,将这些端口和21端口用标记关联起来,然后定位到同一台Real Server上。 |
1. PCC配置
[root@ipvs ~]# ipvsadm -C [root@ipvs ~]# ipvsadm -A -t 172.16.1.10:0 -s wlc -p 1200 [root@ipvs ~]# ipvsadm -a -t 172.16.1.10:0 -r 172.16.1.100 -g -w 10 [root@ipvs ~]# ipvsadm -a -t 172.16.1.10:0 -r 172.16.1.200 -g -w 20 [root@ipvs ~]# ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.1.10:0 wlc persistent 1200 -> 172.16.1.100:0 Route 10 0 0 -> 172.16.1.200:0 Route 20 0 10
2. PPC配置
[root@ipvs ~]# ipvsadm -C [root@ipvs ~]# ipvsadm -A -t 172.16.1.10:22 -s nq -p 1200 [root@ipvs ~]# ipvsadm -a -t 172.16.1.10:22 -r 172.16.1.100 -g -w 100 [root@ipvs ~]# ipvsadm -a -t 172.16.1.10:22 -r 172.16.1.200 -g -w 50
3. iptables标记
[root@ipvs ~]# vim /etc/sysconfig/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT #首先在iptables上放行这2个端口 [root@ipvs ~]# service iptables restart [root@ipvs ~]# iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.1.10 --dport 80 -j MARK --set-mark 10 [root@ipvs ~]# iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.1.10 --dport 443 -j MARK --set-mark 10 #为VIP 172.16.1.10的80和443端口都打上标记10,标记只有本机有效 [root@ipvs ~]# ipvsadm -C [root@ipvs ~]# ipvsadm -A -f 10 -s wlc -p 1200 [root@ipvs ~]# ipvsadm -a -f 10 -r 172.16.1.100 -g -w 100 [root@ipvs ~]# ipvsadm -a -f 10 -r 172.16.1.200 -g -w 200
七、LVS+keepalived
keepalived简介
1、keepalived 是lvs 的扩展项目,因此它们之间具备良好的兼容性。
2、通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离。
3、负载均衡器之间的失败切换failover,是通过VRRP(Virtual Router Redundancy Protocol)实现的。
1. 安装keepalived
[root@ipvs ~]# tar xf keepalived-1.2.12.tar.gz [root@ipvs ~]# cd keepalived-1.2.12 [root@ipvs ~]# ./configure --sysconfdir=/etc/ --prefix=/usr/local/keeplived [root@ipvs ~]# make && make install
2. 清空ipvs的所有配置
[root@ipvs ~]# ipvsadm -C
3. 编辑keepalived的配置文件
[root@ipvs ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { baihu@163.com #设置邮件报警的收件地址 } notification_email_from root@localhost #设置邮件报警的发件地址 smtp_server 172.16.1.1 #设置发件的邮件服务器的地址 smtp_connect_timeout 30 #设置连接SMTP服务器的超时时间 router_id LVS_MASTER #运行Keepalived服务器的一个标识 } vrrp_instance VI_1 { state MASTER #指定Keepalived的角色 interface eth0 #对外提供服务的网络接口 virtual_router_id 51 #虚拟路由标识,主备需保持一致 priority 100 #优先级,主应该大于备 advert_int 1 #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。 authentication { auth_type PASS auth_pass 1111 #主从之间的认证类型和密码,类型主要有PASS、AH 两种 } virtual_ipaddress { 172.16.1.10 #虚拟ip 地址,可以理解为LVS的VIP } } virtual_server 172.16.1.10 80 { delay_loop 6 #设置健康检查时间,单位是秒 lb_algo wlc #设置LVS的调度算法 lb_kind DR #设置LVS的工作模式 persistence_timeout 1200 #持久连接的超时时间 protocol TCP #指定上面的80端口为TCP的80端口 real_server 172.16.1.100 80 { weight 1 #指定权重 TCP_CHECK { #指定TCP检查 connect_timeout 3 #连接超时时间 nb_get_retry 3 #重试次数 delay_before_retry 3 #重试间隔 } } real_server 172.16.1.200 80 { weight 2 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
4. 启动keepalived
[root@ipvs ~]# cd /usr/local/keeplived/sbin/ [root@ipvs sbin]# ./keepalived #从服务器上也是这么配置的,改一下主配置文件就可以了
5. 测试
[root@ipvs ~]# ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.1.10:http wlc persistent 1200 -> 172.16.1.100:http Route 1 0 0 -> 172.16.1.200:http Route 2 3 0 [root@ipvs ~]# ifconfig eth0 down [root@ipvs ~]# ifconfig eth0 up #将master提供服务的网卡禁用再启用 [root@ipvs2 ~]# tail -f /var/log/messages Mar 8 21:35:31 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Transition to MASTER STATE Mar 8 21:35:32 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Entering MASTER STATE Mar 8 21:51:39 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Received higher prio advert Mar 8 21:51:39 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Entering BACKUP STATE #在BACKUP服务器上查看主从切换的日志
然后就可以测试了^_^