负载均衡
我们都知道Ngnix可以做反向代理来实现负载均衡。但是如果ngnix挂了岂不是就完蛋了。所以,我们需要同时实现负载均衡和高可用。
反向代理(软件负载均衡)一般有下面几种技术
- apache httpd
- ngnix 号称能支持5W以上高并发连接,3W并发连接的情况下是apache httpd的10倍。这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型。Apache所采用的select网络I/O模型非常低效。(apache httpd内心独白:嫌我年老珠黄就直说,不要装作我的我的event MPM不存在行么)
- lvs,现在已经是linux内核的一部分。意味着你可以在任意linux服务器上部署LVS。
- HAProxy,LVS的竞品。
当然,你也可以不用反响代理来实现负载均衡。即硬件负载均衡,比如F5。
下面我们重点讲基于LVS的高可用方案。
高可用
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现,因此在介绍keepalived之前,先介绍一下虚拟IP和VRRP的原理。
虚拟IP
我们知道一般的IP地址是和物理网卡绑定的,而VIP相反,是不与实际网卡绑定的的IP地址。当外网的上的一个机器,通过域名访问某公司内网资源时,内网的DNS服务器会把域名解析到一个VIP上。当外网主机经过域名解析得到这个VIP后,就将数据包发往这个VIP。但是在内网中,这个VIP是不与具体的设备相连接的,所以外网发过来的目的地址是VIP的IP数据包,究竟会到哪台机器呢?
其实,这个在内网的过程是,通过ARP协议来完成的。也就是说这个VIP可以映射到的MAC地址是可以控制的。VIP在内网中被动态的映射到不同的MAC地址上,也就是映射到不同的机器设备上,那么就可以起到负载均衡的效果啦。
VRRP
同一网段内的所有主机都设置一条相同的、以网关为下一跳的缺省路由。主机发往其他网段的报文将通过缺省路由发往网关,再由网关进行转发,从而实现主机与外部网络的通信。当网关发生故障时,本网段内所有以网关为缺省路由的主机将无法与外部网络通信,仅能实现内部主机间通信。缺省路由为用户的配置操作提供了方便,但是对缺省网关设备提出了很高的稳定性要求。增加出口网关是提高系统可靠性的常见方法,此时如何在多个出口之间进行选路就成为需要解决的问题。而VRRP正好解决了此问题。
VRRP:Virtual Router Redundancy Protocol,虚拟路由冗余协议。VRRP说白了就是实现地址漂移的,是一种容错协议,在提高可靠性的同时,简化了主机的配置。该协议能够实现将可以承担网关功能的一组路由器加入到备份组中,形成一台虚拟路由器,由VRRP的选举机制决定哪台路由器承担转发任务,局域网内的主机只需将虚拟路由器配置为缺省网关。
下面就是一个简单的ngnix+keepalive的方案。
主流互联网公司的方案
- 首先,注册一个域名 www.gaodaliang.com
- 然后为DNS中这个域名添加一个CNAME记录,解析到www.internal.gaodaliang.com
- 然后DNS中,www.internal.gaodaliang.com配置一个A记录,解析道某个具体的虚拟IP地址。
- 流量会打到LVS server上。根据具体的访问路径和负载均衡规则,通过ARP协议的切面,使之翻译为对应的服务器的mac地址。