LVS(linux virtual server,linux 虚拟服务器),由如下三部分组成:html
负载均衡层(load balance): 位于整个集群的最前端,由一台或多台负载调度器(Director Server)组成。 其上安装了 LVS 的核心模块 IPVS,负责把用户请求分发给服务器群组层的应用服务器(Real Server)。 同时还有监控模块(Ldirectord),用于监测各个 Real Server 服务的健康状况,当 real server 不可用时, 将其从路由表中剔除,待主机恢复后从新加入。前端
服务器群组(Server Array): 由一组实际运行应用服务的主机组成。每一个 Real Server 之间经过高速 LAN 相连。linux
数据共享存储(Shared Storage): 为全部 Real Server 提供共享存储空间和内容一致性的存储区域,通常由磁盘阵列设备组成。nginx
IPVS: 安装于 Director Server 上,并在 Director Server 上虚拟出一个 VIP(Virtual IP)。 用户的访问请求经过 VIP 到达负载调度器,而后由负载调度器从 Real Server 列表中选取一个服务节点响应用户的请求。web
VS/NAT(Virtual Server via Network Address Translation): 当用户请求到达调度器时,调度器将请求报文的目标地址和端口地址改写 成选定的 Real Server 的相应地址和端口,并将请求报文发送给选定的 Real Server。当 Real Server 返回数据时,还须要再次将报文的源地址和端口更改成 VIP 和相应的端口后,再发送给用户。 由于请求和响应报文都须要通过 Director Server 重写,因此当高并发时,调度器的处理能力将会成为瓶颈。算法
VS/TUN (Virtual Server via IP Tunneling): 也就是 IP 隧道技术实现虚拟服务器。调度器采用 IP 隧道技术将用户请求转发到某个 Real Server,而这个 Real Server 将直接响应用户的请求,再也不通过前端调度器,此外,对 Real Server 的地域位置没有要求,能够和 Director Server 位于同一个网段,也能够是独立的一个网络。因为在 TUN 方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提升。ubuntu
VS/DR(Virtual Server via Direct Routing): 也就是用直接路由技术实现虚拟服务器。VS/DR 经过改写请求报文的 MAC 地址,将请求发送到 Real Server,而 Real Server 将响应直接返回给客户,免去了 VS/TUN 中的 IP 隧道开销。这种方式是三种负载调度机制中性能最高、最好的,可是必需要求 Director Server 与 Real Server 都有一块网卡连在同一物理网段上。vim
上面咱们谈到,负载调度器是根据各个服务器的负载状况,动态地选择一台 Real Server 响应用户请求,那么动态选择是如何实现呢,其实也就是咱们这里要说的负载调度算法, 根据不一样的网络服务需求和服务器配置,IPVS 实现了以下八种负载调度算法,这里咱们详细讲述最经常使用的四种调度算法,剩余的四种调度算法请参考其它资料。服务器
轮询调度(Round Robin)网络
“轮询”调度也叫1:1调度,调度器经过“轮询”调度算法将外部用户请求按顺序1:1的分配到集群中的每一个 Real Server 上,这种算法平等地对待每一台 Real Server, 而无论服务器上实际的负载情况和链接状态。
加权轮询调度(Weighted Round Robin)
“加权轮询”调度算法是根据 Real Server 的不一样处理能力来调度访问请求。能够对每台 Real Server 设置不一样的调度权值,对于性能相对较好的 Real Server 能够设置较高的权值,而对于处理能力较弱的 Real Server,能够设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量,充分合理的利用了服务器资源。 同时,调度器还能够自动查询 Real Server 的负载状况,并动态地调整其权值。
最少连接调度(Least Connections)
“最少链接”调度算法动态地将网络请求调度到已创建的连接数最少的服务器上。若是集群系统的真实服务器具备相近的系统性能,采用“最小链接”调度算法能够较好地均衡负载。
加权最少连接调度(Weighted Least Connections)
“加权最少连接调度”,每一个服务节点能够用相应的权值表示其处理能力,而系统管理员能够动态的设置相应的权值,缺省权值为1,加权最小链接调度在分配新链接请求时尽量使服务节点的已创建链接数和其权值成正比。
其它四种调度算法分别为:
VRRP (Virtual Router Redundancy Protocol,虚拟路由器冗余协议): 在现实的网络环境中,主机之间的通讯都是经过配置静态路由(默认网关)完成的, 而主机之间的路由器一旦出现故障,通讯就会失败,所以,在这种通讯模式中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了 VRRP 协议。
VRRP 能够将两台或多台物理路由器设备虚拟成一个虚拟路由器,每一个虚拟路由器都有一个惟一标识,称为 VRID,一个 VRID 与一组 IP 地址构成了一个虚拟路由器。 这个虚拟路由器经过虚拟IP(一个或多个)对外提供服务。而在虚拟路由器内部,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称为主路由器(处于 MASTER 角色)。 而其余物理路由器不拥有对外的虚拟 IP,也不提供对外网络功能,仅仅接收 MASTER 的 VRRP 状态通告信息,这些路由器被统称为备份路由器(处于 BACKUP 角色)。 当主路由器失效时,处于 BACKUP 角色的备份路由器将从新进行选举,产生一个新的主路由器进入 MASTER 角色继续提供对外服务,整个切换过程对用户来讲彻底透明。
Keepalived 做为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控及故障隔离。下面继续介绍下 Keepalived 对服务器运行状态监控和检测的工做原理。
Keepalived 工做在 TCP/IP 参考模型的第3、第四和第五层,也就是网络层、传输层和应用层。根据 TCP/IP 参考模型各层所能实现的功能,Keepalived运行机制以下:
在网络层,运行着四个重要的协议:互连网协议 IP、互连网控制报文协议 ICMP、地址转换协议 ARP 以及反向地址转换协议 RARP。Keepalived 在网络层采 用的最多见的工做方式是经过ICMP协议向服务器集群中的每一个节点发送一个 ICMP 的数据包(相似于 ping 实现的功能),若是某个节点没有返回响应数据包,那么 就认为此节点发生了故障,Keepalived 将报告此节点失效,并从服务器集群中剔除故障节点。
在传输层,提供了两个主要的协议:传输控制协议 TCP 和用户数据协议 UDP。传输控制协议 TCP 能够提供可靠的数据传输服务,IP 地址和端口,表明一个 TCP 链接的 一个链接端。要得到 TCP 服务,须在发送机的一个端口上和接收机的一个端口上创建链接,而 Keepalived 在传输层就是利用 TCP 协议的端口链接和扫描技术来 判断集群节点是否正常的。好比,对于常见的 Web 服务默认的 80 端口、SSH 服务默认的 22 端口等,Keepalived 一旦在传输层探测到这些端口没有响应数据返回, 就认为这些端口发生异常,而后强制将此端口对应的节点从服务器集群组中移除。
在应用层,能够运行 FTP、TELNET、SMTP、DNS 等各类不一样类型的高层协议,Keepalived 的运行方式也更加全面化和复杂化,用户能够经过自定义 Keepalived 的工做方式,例如用户能够经过编写程序来运行 Keepalived,而 Keepalived 将根据用户的设定检测各类程序或服务是否容许正常,若是 Keepalived 的检测结果 与用户设定不一致时,Keepalived 将把对应的服务从服务器中移除。
环境:
hostname | ip | remark |
---|---|---|
lvs-master | 192.168.12.100 | lvs主机 |
lvs-slave | 192.168.12.101 | lvs备用机 |
web-server1 | 192.168.12.102 | realserver1 |
web-server2 | 192.168.12.103 | realserver2 |
本次安装教程采用的是DR
转发方式,上述机器均为ubuntu16.04
VIP: 192.168.12.200
sudo apt-get install ipvsadm keepalived
查看路由转发设置
sudo ipvsadm
***** vagrant@vagrant:~ [05:38:21] ***** % sudo ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
修改keepalived
的配置文件,没有就新建一个
sudo vim /etc/keepalived/keepalived.conf
# 全局配置 global_defs { router_id LVS_DEVEL notification_email { dudashuang1222@gmail.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.12.30 smtp_connect_timeout 30 vrrp_skip_check_adv_addr vrrp_strict } # VRRP 实例配置 vrrp_instance VI_1 { state MASTER #若是使用主/备,另一台机器须要设置为BACKUP interface eth1 #检测网络端口 virtual_router_id 100 #主备的虚拟机路由ID必须一致 priority 100 #主备的优先级,主优先级要大于备 advert_int 1 #VRRP Multicast广播周期秒数 authentication { auth_type PASS # VRRP认证方式 auth_pass 123456 # VRRP口令字 } virtual_ipaddress { 192.168.12.200 # 若是有多个VIP,继续换行填写 } } # 虚拟服务器配置 virtual_server 192.168.12.200 80 { delay_loop 1 # 每隔1秒查询realserver状态 lb_algo wrr # lvs 算法 lb_kind DR # Direct Route protocol TCP # 用TCP协议检查realserver状态 persistence_timeout 50 # 会话保持时间,这段时间内,同一ip发起的请求将被转发到同一个realserver # 第一台realserver物理环境 real_server 192.168.12.102 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } # 第二台realserver物理环境 real_server 192.168.12.103 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
interface eth1 在这里为外置网卡的端口,能够执行
ip a
查看192.168.12.100
在哪一个端口,若为eth0
,则填eth0
lvs-slave的配置和主机同样,仅须要将
state MASTER --> BACKUP priority 100 --> 90
启动 keepalived
# 清除路由设置 sudo ipvsadm -C # 重启 keepalived sudo service keepalived restart
此时查看路由配置
***** vagrant@vagrant:~ [05:38:39] ***** % sudo ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP localhost:http wrr persistent 50 -> localhost:http Route 1 0 0 -> localhost:http Route 1 0 0
配置/etc/rc.local
,添加下列配置,而后重启机器
ifconfig lo:0 192.168.12.200 broadcast 192.168.12.200 netmask 255.255.255.255 up route add -host 192.168.12.200 dev lo:0 echo "0" > /proc/sys/net/ipv4/ip_forward 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
更新 nginx 首页
sudo vim /var/www/html/index.nginx-debian.html
# realserver2 换成192.168.12.103 <h2>ip:192.168.12.102</h2>
假设lvs-master宕机
sudo service keepalived stop
假设 realserver1 宕机
sudo service nginx stop