在大型网站中通常服务端会作集群,同时利用负载均衡器作负载均衡。这样有利于将大量的请求分散到各个服务器上,提高网站的响应速度。固然为了解决单点故障的问题,还会作热备份方案。这里演示利用LVS作负载均衡器,同时利用Keepalived保证其高可用,基于LVS的DR模式构建Nginx集群。html
各个软件及其版本信息以下:nginx
软件 | 版本 |
---|---|
Centos系统 | Linux release 7.3.1611 (Core) |
Nginx | 1.16.0 |
LVS | ipvsadm-1.27-7.el7.x86_64 |
Keepalived | keepalived.x86_64 0:1.3.5-8.el7_6 |
节点分配及角色以下:算法
节点 | 角色 |
---|---|
192.168.208.154 | lvs master |
192.168.208.155 | lvs slave |
192.168.208.150 | nginx1 |
192.168.208.151 | nginx2 |
同时特别注意这里设置的VIP地址为:192.168.208.100,VIP也即虚拟的IP地址,即当外部请求所访问的IP地址。centos
基于上述的环境,部署的架构以下:
浏览器
特别注意:bash
因为是采用DR模式,也即当用户请求发送到VIP时,LVS会根据所设置的负载均衡算法将请求转发到具体的Nginx服务器(Real Server)上,而当具体的Nginx服务器处理完后是直接将结果返回给用户。因此在具体的Nginx服务器是要设置回环的IP,即在lo网卡上设置VIP的地址。服务器
(1)、首先在lvs master节点和slave节点安装lvs和keepalived:微信
yum install ipvsadm yum install keepalived
(2)、在nginx1和nginx2节点上安装nginx:架构
# 添加nginx的yum源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm # 安装 yum install nginx
安装完成nginx后,编辑其默认页面,加上特定的信息,这样才能判断请求究竟是哪一个nginx处理的,即:负载均衡
vi /usr/share/nginx/html/index.html
对于nginx1加上150字样,nginx2加上151字样,即:
当直接访问nginx1时,效果为:
当直接访问nginx2时,效果为:
(3)、在lvs master节点和lvs slave节点配置keepalived信息:
首先配置lvs master节点:
编辑以下文件:
vi /etc/keepalived/keepalived.conf
内容为:
! Configuration File for keepalived global_defs { # 这里将这些邮件设置的相关信息都注释掉了 # notification_email { # acassen@firewall.loc # failover@firewall.loc # sysadmin@firewall.loc # } # notification_email_from Alexandre.Cassen@firewall.loc # smtp_server 192.168.200.1 # smtp_connect_timeout 30 # router_id是keepalived的一个标识,最好不一样的keepalived配置成不同 router_id LVS_DEVEL # vrrp_skip_check_adv_addr # vrrp_strict # vrrp_garp_interval 0 # vrrp_gna_interval 0 } vrrp_instance VI_1 { # MASTER表示是主节点,备份节点是BACKUP state MASTER # 网卡名称,这个不一样的服务器,可能有所不一样 interface ens33 # 路由标识,MASTER和BACKUP节点的该值要保持一致 virtual_router_id 51 # 优先级,MASTER节点的值必须大于BACKUP的值 priority 100 # MASTER与BACKUP同步的时间间隔,单位为秒 advert_int 1 # lvs对应的真实IP mcast_src_ip=192.168.208.154 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP的址 virtual_ipaddress { 192.168.208.100 } } virtual_server 192.168.208.100 80 { # 健康检查的时间,单位为秒 delay_loop 6 # 负载调度算法,这里设置为rr,即轮询算法 lb_algo rr # 设置DR模式 lb_kind DR # 虚拟地址的子网掩码 nat_mask 255.255.255.0 # 会话保持时间,单位为秒 persistence_timeout 50 protocol TCP # 配置真实服务器信息 real_server 192.168.208.150 80 { # 节点的权值 weight 1 TCP_CHECK { # 超时时间 connect_timeout 3 # 重试次数 nb_get_retry 3 # 重试间隔 delay_before_retry 3 } } real_server 192.168.208.151 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
基于上述的配置,那么lvs slave的配置以下:
! Configuration File for keepalived global_defs { # notification_email { # acassen@firewall.loc # failover@firewall.loc # sysadmin@firewall.loc # } # notification_email_from Alexandre.Cassen@firewall.loc # smtp_server 192.168.200.1 # smtp_connect_timeout 30 router_id LVS_DEVEL_SLAVE # vrrp_skip_check_adv_addr # vrrp_strict # vrrp_garp_interval 0 # vrrp_gna_interval 0 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 mcast_src_ip=192.168.208.155 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.208.100 } } virtual_server 192.168.208.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.208.150 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.208.151 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
分别启动lvs master和slave的keepalived,而且设置为开机自启动:
systemctl start keepalived systemctl enable keepalived
此时在lvs master节点查看IP地址状况:
ip a
结果为:
说明此时VIP在master节点上的ens33网卡上生成好了。
在lvs master节点查看路由转发状况:
ipvsadm -Ln
结果为:
这个结果跟预期的是同样的。
(4)、关闭lvs master和slave节点上的访火墙:
systemctl stop firewalld systemctl disable firewalld
(5)、在nginx服务器上设置回环IP:
因为服务器重启后设置的回环IP会失效,因此将设置的内容放在脚本lvs-rs.sh中,内容以下:
#!/bin/bash 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 sysctl -w net.ipv4.ip_forward=1 ifconfig lo:0 192.168.208.100 broadcast 192.168.208.100 netmask 255.255.255.255 up route add -host 192.168.208.100 dev lo:0
执行后,查看IP信息,能够在lo网卡中看到VIP的信息,即:
分别打开Chrome、IE浏览器,同时输入http://192.168.208.100,结果以下:
结果也达到预期的效果的。
如今测试将lvs master节点关闭掉,而后查看lvs slave节点的IP路由状况:
ip a
结果为:
此时VIP漂移到了lvs slave节点上了。
ipvsadm -Ln
结果为:
此时lvs slave已经能够作路由地址转发了。
以你最方便的方式关注我:
微信公众号: