负载均衡和高可用集群
负载均衡
【协议层】http重定向协议实现负载均衡
原理:根据用户的http请求计算出一个真实的web服务器地址,并将该web服务器地址写入http重定向响应中返回给浏览器,由浏览器重新进行访问。
【协议层】dns域名解析负载均衡
原理:在DNS服务器上配置多个域名对应IP的记录。例如一个域名www.baidu.com对应一组web服务器IP地址,域名解析时经过DNS服务器的算法将一个域名请求分配到合适的真实服务器上。
【协议层】反向代理负载均衡
原理:反向代理处于web服务器这边,反向代理服务器提供负载均衡的功能,同时管理一组web服务器,它根据负载均衡算法将请求的浏览器访问转发到不同的web服务器处理,处理结果经过反向服务器返回给浏览器。
【网络层】IP负载均衡
原理:在网络层通过修改目标地址进行负载均衡用户访问请求到达负载均衡服务器,负载均衡服务器在操作系统内核进程获取网络数据包,根据算法得到一台真实服务器地址,然后将用户请求的目标地址修改成该真实服务器地址,数据处理完后返回给负载均衡服务器,负载均衡服务器收到响应后将自身的地址修改成原用户访问地址后再讲数据返回回去。
【链路层】数据链路层负载均衡
原理:在数据链路层修改Mac地址进行负载均衡。
负载均衡服务器的IP和它所管理的web 服务群的虚拟IP一致;负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址; 通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问。
主要技术有LVS keepalived nginx反向代理 haproxy
高可用
高可用的三种模式:
【主从方式】 (非对称方式)
工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的一致性通过共享存储系统解决。
【双机双工方式】(互备互援)
工作原理:两台主机同时运行各自的服务工作且相互监测情况,当任一台主机宕机时,另一台主机立即接管它的一切工作,保证工作实时,应用服务系统的关键数据存放在共享存储系统中。
【集群工作方式】(多服务器互备方式)
工作原理:多台主机一起工作,各自运行一个或几个服务,各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其它主机接管。
网站的可用性描述网站可有效访问的特性。网站的高可用架构设计的主要目的就是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问。实现这种高可用架构的主要手段是数据和服务的冗余备份以及失效转移。
主要技术有RHHA pacemaker keepalived haproxy
我们可以做前端使用lvs来做负载均衡,根据lvs的8种调度算法(可设置),分发请求到对应的web服务器集群上。lvs做双机热备,通过keepalived模块能够达到故障自动转移到备份服务器,不间断提供服务。
LVS
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS体系结构与工作原理简单描述,LVS集群负载均衡器接受服务的所有入展客户端的请求,然后根据调度算法决定哪个集群节点来处理回复客户端的请求。
LVS的三种工作模式:
1)VS/NAT模式(Network address translation)
1)客户端请求数据,目标IP为VIP
2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
5)客户端收到的就只能看到VIP\DIP信息。
2)VS/TUN模式(tunneling)
1)客户请求数据包,目标地址VIP发送到LB上。
2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,后续会讲)
3)DR模式(Direct routing)
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。
实验环境:rhel6.3 selinux and iptables disabled
实验主机: 172.25.12.250
调度器服务器(LB)
LB1 172.25.12.11
LB1 172.25.12.12
资源服务器(RS)
web1 172.25.12.13
web2 172.25.12.14
所需rpm 包
ipvsadm
keepalived-1.2.20.tar.gz
server11:
[root@server11 /]yum install -y ipvsadm
[root@server11 /]# ipvsadm -l
[root@server11 /]# ip addr add 172.25.12.100/24 dev eth0 增加虚拟IP
[root@server11 /]# ip addr show eth0 查看虚拟IP
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:25:22:25 brd ff:ff:ff:ff:ff:ff
inet 172.25.12.11/24 brd 172.25.12.255 scope global eth0
inet 172.25.12.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fe25:2225/64 scope link
valid_lft forever preferred_lft forever
[root@server11 /]# ipvsadm -A -t 172.25.12.100:80 -s rr 在调度器上增加轮询策略
[root@server11 /]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.13:80 -g
[root@server11 /]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.14:80 -g
将虚拟IP的请求转给资源服务器
[root@server11 /]# /etc/init.d/ipvsadm save 保存策略
[root@server11 /]# ipvsadm -l 查看策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.12.100:http rr
-> server13:http Route 1 0 0
-> server14:http Route 1 0 0
[root@server11 /]# /etc/init.d/ipvsadm start
ipvsadm: Clearing the current IPVS table: [ OK ]
ipvsadm: Applying IPVS configuration: [ OK ]
server13 server14
配置real server服务器,禁止arp相应的请求
安装httpd服务
[root@server13 ~]# yum install -y httpd
[root@server13 ~]# cd /var/www/html/
[root@server13 html]# ls
[root@server13 html]# vim index.html
[root@server13 html]# /etc/init.d/httpd start
[root@server13 html]# yum install -y arptables_jf.x86_64
[root@server13 html]# ip addr add 172.25.12.100/32 dev eth0 增加虚拟IP
[root@server13 html]# ip addr show eth0
1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:0e:12:25 brd ff:ff:ff:ff:ff:ff
inet 172.25.12.13/24 brd 172.25.12.255 scope global eth0
inet 172.25.12.100/32 scope global eth0
inet6 fe80::5054:ff:fe0e:1225/64 scope link
valid_lft forever preferred_lft forever
[root@server13 html]# arptables -A IN -d 172.25.12.100 -j DROP
[root@server13 html]# arptables -A OUT -s 172.25.12.100 -j mangle –mangle-ip-s 172.25.12.13
屏蔽虚拟IP的请求,当接到调度器发来的虚拟IP时将自己的真实IP广播出去
[root@server13 html]# /etc/init.d/arptables_jf save
Saving current rules to /etc/sysconfig/arptables: [ OK ]
[root@server13 html]# /etc/init.d/arptables_jf start
Flushing all current rules and user defined chains: [ OK ]
Clearing all current rules and user defined chains: [ OK ]
Applying arptables firewall rules: [ OK ]
在真机上测试:
[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server13-</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server13-</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
curl: (7) Failed connect to 172.25.12.100:80; Connection refused
[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
curl: (7) Failed connect to 172.25.12.100:80; Connection refused
当server3出现故障时,上述的实验没有健康检查
server11
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/ 将keepalived主程序加入到环境变量
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ keepalived启动脚本变量引用文件
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ keepalived启动脚本,放到/etc/init.d/目录下就可以使用命令调用
[root@server11 keepalived-1.2.20]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
[root@server11 keepalived-1.2.20]# cd /etc/keepalived/
[root@server11 keepalived]# vim keepalived.conf
[root@server11 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { 指定keepalived在发生事情的时候,发送邮件告
root@localhost 指定为本地用户
}
notification_email_from keepalived@server11 指定发件人
smtp_server 127.0.0.1 发送email的smtp地址
smtp_connect_timeout 30 超时时间
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
}
vrrp_instance VI_1 {
state MASTER 指定当前节点为主节点
interface eth0 绑定虚拟IP的网络接口
virtual_router_id 51 VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1
authentication { 设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { 指定虚拟IP, 两个节点设置必须一样
172.25.12.100
}
}
virtual_server 172.25.12.100 80 {
delay_loop 6
lb_algo rr 调度策略
lb_kind DR 工作模式
# persistence_timeout 50
protocol TCP
real_server 172.25.12.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.12.14 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@server11 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@server11 keepalived]# ip addr show eth0
将serve11的配置发送到server12上
[root@server11 keepalived]# scp -r /usr/local/keepalived/ root@172.25.12.12://usr/local
root@172.25.12.12's password:
keepalived 100% 224KB 224.1KB/s 00:00
keepalived.conf.5 100% 27KB 26.7KB/s 00:00
keepalived.8 100% 4296 4.2KB/s 00:00
genhash.1 100% 1579 1.5KB/s 00:00
keepalived.conf.vrrp.static_ipaddress 100% 591 0.6KB/s 00:00
keepalived.conf.HTTP_GET.port 100% 684 0.7KB/s 00:00
keepalived.conf.fwmark 100% 433 0.4KB/s 00:00
sample.misccheck.smbcheck.sh 100% 323 0.3KB/s 00:00
keepalived.conf.sample 100% 919 0.9KB/s 00:00
keepalived.conf.misc_check 100% 523 0.5KB/s 00:00
keepalived.conf.vrrp 100% 1425 1.4KB/s 00:00
client.pem 100% 1745 1.7KB/s 00:00
root.pem 100% 802 0.8KB/s 00:00
keepalived.conf.vrrp.sync 100% 1742 1.7KB/s 00:00
keepalived.conf.virtualhost 100% 887 0.9KB/s 00:00
keepalived.conf.vrrp.routes 100% 979 1.0KB/s 00:00
keepalived.conf.IPv6 100% 895 0.9KB/s 00:00
keepalived.conf.vrrp.lvs_syncd 100% 1056 1.0KB/s 00:00
keepalived.conf.status_code 100% 842 0.8KB/s 00:00
keepalived.conf.vrrp.rules 100% 477 0.5KB/s 00:00
dh1024.pem 100% 245 0.2KB/s 00:00
keepalived.conf.virtual_server_group 100% 1087 1.1KB/s 00:00
keepalived.conf.SSL_GET 100% 1587 1.6KB/s 00:00
keepalived.conf.misc_check_arg 100% 511 0.5KB/s 00:00
keepalived.conf.quorum 100% 2467 2.4KB/s 00:00
keepalived.conf.vrrp.localcheck 100% 3019 3.0KB/s 00:00
keepalived.conf.SMTP_CHECK 100% 2761 2.7KB/s 00:00
keepalived.conf.vrrp.scripts 100% 1145 1.1KB/s 00:00
keepalived.conf.track_interface 100% 735 0.7KB/s 00:00
keepalived.conf.inhibit 100% 746 0.7KB/s 00:00
keepalived.conf 100% 997 1.0KB/s 00:00
keepalived 100% 1308 1.3KB/s 00:00
keepalived 100% 667 0.7KB/s 00:00
genhash 100% 40KB 40.0KB/s 00:00
server12
yum install ipvsadm -y
[root@server12 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server12 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server12 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server12 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server12 ~]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
[root@server12 ~]# cd /etc/keepalived/
[root@server12 keepalived]# vim keepalived.conf
[root@server12 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@server12
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.12.100
}
}
virtual_server 172.25.12.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 172.25.12.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.12.14 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@server12 keepalived]# /etc/init.d/keepalived start
Starting keepalived:
测试:
[root@localhost day06]# curl 172.25.12.100
轮询server13 和server14的默认主页
当停调一个服务时另外一个网页不能正常显示。
在调度器上查看策略
[root@server12 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.12.100:http rr
-> server13:http Route 1 0 3
-> server14:http Route 1 0 3
[root@server11 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn