本文将介绍如何在Centos7下基于Keepalived和LVS技术实现web服务的高可用和负载均衡,我们的目标拓扑如下图所示这篇文章将继续修订和更新。最新内容可参考我的GITHUB上的程序员成长计划项目。欢迎来到星空。更多精彩内容,请关注我。准备工作如果觉得按照下面的操作一步步搭建太麻烦,可以直接下载mylxsw/keepalived-example工程,然后执行makecreate一键搭建整个demo环境。使用Vagrant创建四个虚拟机进行测试。Vagrant配置文件格式如下Vagrant.configure("2")do|config|config.vm.box="centos/7"config.vm.network"private_network",ip:"IPaddress"end每次配置都需要更换配置文件目录下的IP地址IPusagekeepalived192.168.88.8负载均衡Masterkeepalived-backup192.168.88.9负载均衡Backupnode-1192.168.88.10webservernode-2192.168.88.11webserverclient192.168.88.2client,也可以直接用自己的电脑,IP地址可以任意,VIP为192.168.88.100,客户端IP为192.168.88.2。启动Vagrant服务器需要进入服务器所在目录,执行vagrantup命令,登录服务器执行vagrantssh命令。如果你还没有接触过Vagrant,可以看看这篇文章Vagrant入门。由于本文很多命令需要root权限操作,所以建议执行命令suroot直接提升到root权限(密码为vagrant),否则需要在所有命令前加上sudo才能执行。分别登录每台服务器并设置其hostname,方便我们以后区分不同的服务器#Executehostnamectlset-hostnamekeepalivedon192.168.88.8#Executehostnamectlset-hostnamekeepalived-backupon192.168.88.9#Executeon192.168.88.10hostnamectlset-hostnamenode-1#在192.168.88.11上执行hostnamectlset-hostnamenode-2,注销重新登录,可以看到hostname生效了。安装keepalived服务在keepalived和keepalived-backup两台虚拟机上安装keepalived服务yuminstall-ykeepalivedipvsadm安装完成后可以看到生成/etc/keepalived/keepalived.conf配置文件,但是这个文件是keepalivedexample提供的,后面需要修改。将Keepalived服务添加到systemctlenablekeepalivedinstallationwebserviceonstartup。在两台web服务器node-1和node-2上,我们简单安装一个nginx,然后开放80端口,提供一个简单的web服务用于测试yuminstallyum-utilsyum-config-manager--add-repohttps://openresty.org/package/centos/openresty.repoyuminstall-yopenresty为了方便查看效果,我们修改nginx的默认网页显示服务器的IPip地址showeth1|grep'192.168.88.'|awk'{print$2}'>/usr/local/openresty/nginx/html/index.html然后启动web服务-备份两台服务器),即为负载均衡服务提供主备服务。当master挂掉后,backup会自动成为新的master继续提供服务。以下是Keepalived配置文件的内容global_defs{router_idLVS_8808}vrrp_instanceHA_WebServer{stateMASTER!监控网卡,keepalived会将VIP绑定到网卡接口eth1!虚拟路由器ID,同一个实例必须一致,多个实例不能相同virtual_router_id18garp_master_refresh10garp_master_refresh_repeat2!VRRP优先级的设置值。选择主节点时,值大的备节点会漂移到主节点优先级100!发送VRRP通知的时间间隔。单位是advert_int1秒!集群授权密码认证{auth_typePASSauth_pass123456}!这里是我们配置的VIP,可以配置多个,每个IP行virtual_ipaddress{192.168.88.100/24}}两个keepalived服务器都使用这个配置文件,唯一不同的是两个服务器上priority的值不同,我们为keepalived服务器设置priority=100,为keepalived-backup设置priority=99。两台服务器优先级不同后,只要两台服务器正常工作,优先级高的为主服务器,优先级低的为备份服务器。配置完成后,重启keepalived服务systemctlrestartkeepalived然后,我们可以看到keepalived服务器绑定了vip192.168.88.100keepalivedserverkeepalived-backupserver我们验证主服务器挂掉后,备份服务器是否可以正常接管工作,在keepalived服务器上,执行systemctlstopkeepalived命令停止keepalived服务,模拟服务器挂机场景。然后我们看到keepalived服务器keepalived-backup服务器VIP已经成功漂移到备份服务器上了。在备份服务器的/var/log/message日志中,可以看到如下信息重启keepalived服务器的keepalived服务(systemctlstartkeepalived),模拟服务器恢复,我们可以看到VIP已经飘回来了再次到keepalived服务器(因为keepalived服务器设置的优先级大于keepalived-backup服务器的优先级)。查看keepalived-backup的日志,可以看到如下信息LVS实现负载均衡在两台keepalived服务器的配置文件/etc/keepalived/keepalived.conf中,添加如下配置virtual_server192.168.88.10080{!健康检查间隔delay_loop6!负载均衡算法lb_algowlc!LVS模式,支持NAT/DR/TUN模式lb_kindDR协议TCPnat_mask255.255.255.0!真实网络服务器IP,端口real_server192.168.88.1080{weight3!Web服务健康检查HTTP_GET{url{path/status_code200}connect_timeout1}}!真实网络服务器IP,端口real_server192.168.88.1180{weight3!webservicehealthcheckHTTP_GET{url{path/status_code200}connect_timeout1}}}由于我们所有的服务器都在同一个子网中,所以不能使用NAT(网络地址转换)模式。这里我们使用DSR(DirectServerReturn)模式。使用DSR模式(配置时使用DR),web服务器需要将VIP绑定到自己本地的loopback网卡上,否则将无法与web服务器通信。在node-1和node-2上执行如下命令ipaddradd192.168.88.100/32devlo这里绑定的VIP只对这个设置有效,需要重启服务器后重新执行。所以可以用下面的方法在/etc/sysconfig/network-scripts目录下永久添加IP,创建ifcfg-lo:0文件DEVICE=lo:0IPADDR=192.168.88.100NETMASK=255.255.255.255ONBOOT=yesNAME=loopback并重启网络服务(systemctlrestartnetwork)使其生效接下来重启两台keepalived服务器的服务使其生效systemctlrestartkeepalived然后我们在客户端访问如下web服务,这里我们可以使用VIP访问可以看到,请求被分配给了两个真实的网络服务器。在keepalived服务器上执行ipvsadm,如果此时node-1的服务挂了怎么办?让我们模拟一下。在node-1我们停止web服务systemctlstopopenresty等待几秒(我们配置健康检查周期为6s)然后请求在keepalived服务器上执行ipvsadm。可以看到有问题的node-1已经去掉了。延伸阅读这里你可能有两个问题:第一个是为什么不能使用NAT模式?使用NAT模式,正常的流程应该是这样的。在NAT模式下,客户端(192.168.1.2)请求经过负载均衡器(192.168.88.100)后,负载均衡器会将目的IP地址修改为真实Web服务器IP地址192.168.88.10,这样经过web服务器收到请求,发现目的IP地址是自己,就可以处理请求。将响应报文发送给负载均衡器,负载均衡器将响应报文的源IP地址修改为自己的VIP,以便客户端收到响应后可以正常处理。我们的客户端和服务器都在同一个子网下。响应处理后发送给客户端时,响应报文的源IP地址为192.168.88.10,目的IP地址为192.168.88.2。由于它们在同一个子网中,消息不会经过负载均衡器,而是直接发送给客户端。因此在响应报文中没有修改源IP地址,直接发送给客户端,导致无法正常完成通信。二是为什么使用DSR模式时VIP一定要绑定web服务器的网卡?在DSR模式下,发送到负载均衡器的消息不做任何修改,直接发送到真正的Web服务器。此时目的IP地址为VIP192.168.88.100。web服务器收到请求后,发现目的IP地址不是自己,就会认为消息不是发给自己的,无法处理请求。也就是说,在DSR模式下,仅仅通过在负载均衡器上配置是无法实现负载均衡的。所以最简单的方法就是将VIP绑定到真实服务器的loopback接口上。之所以子网掩码是255.255.255.255(或/32),是为了让它的广播地址是自己,防止它向子网的广播域发送ARP,防止负载均衡器上VIP之间的IP冲突和网络服务器。对于负载均衡算法,我们这里使用wlc(weightedleastconnectionscheduling)。其他调度算法如下(图片来自《24小时365天不间断服务:服务器基础设施核心技术》一书)。综上所述,本文将不断修订和更新。最新内容可以参考我的GITHUB上的程序猿成长计划项目。欢迎明星。更多精彩内容,请关注我。通过这篇文章,相信你已经可以搭建一套高可用的Web服务了。Keepalived有很多配置选项等着你自己去发现。我们不仅可以实现web服务的高可用,还可以用来实现一些基础服务组件的高可用。可用,如MySQL、Redis、RabbitMQ等,本文只是介绍。24小时365天不间断服务:服务器基础架构核心技术
