天天看点

本地虚拟机模拟LVS+Keepalived+Nginx集群 (含关闭NetworkManager, 克隆虚拟机用)

前言

Nginx是服务器集群的网关, 在生产中有流量分发的作用; 另外它属于应用层的负载均衡(第七层), 可以对请求和响应作额外的代理操作, 比如: gzip, 添加响应头以支持跨域, 防盗链配置

为保证Nginx的高可用, 需要搭建Nginx集群, LVS的负载均衡是基于链路层(第四层), 只分发请求而不进行代理, 所以LVS的吞吐量是高于Nginx的, 适合为Nginx集群作负载均衡

服务器与ip规划

  • LVS一台: VIP(虚拟ip, 生产中应是公网ip): 192.168.209.150;

    DIP(内网ip): 192.168.209.151

  • Nginx2台, RIP(真实ip, 因被LVS负载均衡, 所以生产中处于内网): 192.168.209.222和 192.168.209.223

上述3个计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突

systemctl stop NetworkManager 
systemctl disable NetworkManager
           

LVS节点配置虚拟ip和负载均衡规则

配置虚拟ip

在LVS节点 (本案例为151节点)进入网卡配置目录

/etc/sysconfig/network-scripts

拷贝网卡, 创建子接口

cp ifcfg-ens33 ifcfg-ens33:1

修改子接口配置:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=cbebd981-2b3f-4271-812c-9b7d202ba714
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.209.150
GATEWAY=192.168.209.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
           

注意改

DEVICE

IPADDR

即可

重启网络服务

service network restart

, 再执行

ip addr

, 查看虚拟ip是否添加成功

本地虚拟机模拟LVS+Keepalived+Nginx集群 (含关闭NetworkManager, 克隆虚拟机用)

在云端, 阿里云不支持虚拟IP,需要购买他的负载均衡服务

腾讯云支持虚拟IP,但是需要额外购买,一台节点最大支持10个虚拟ip

用ipvsadm配置负载均衡规则

安装ipvsadm:

yum install ipvsadm

创建LVS节点,用户访问的集群调度者

ipvsadm -A -t 192.168.209.150:80 -s rr -p 5
           

各参数含义如下:

-A:添加集群

-t:tcp协议

ip地址:设定集群的访问ip,也就是LVS的虚拟ip

-s:设置负载均衡的算法,rr表示轮询

-p:设置连接持久化的时间

创建2台RS真实服务器

ipvsadm -a -t 192.168.209.150:80 -r 192.168.209.222:80 -g
ipvsadm -a -t 192.168.209.150:80 -r 192.168.209.223:80 -g
           

-a:添加真实服务器

-t:tcp协议

-r:真实服务器的ip地址

-g:设定DR模式

保存到规则库,否则重启失效

ipvsadm -S
           

查看集群列表:

ipvsadm -Ln
           

LVS持久化配置, 选做, 参考链接 LVS持久化配置

为两台Nginx配置虚拟ip和arp(响应级别和通告行为)

配置虚拟ip

在Nginx所在的真实服务器节点(以222为例),

/etc/sysconfig/network-scripts

复制 lo网卡

cp ifcfg-lo ifcfg-lo:1

,

vim ifcfg-lo:1

修改为如下:

DEVICE=lo:1
IPADDR=192.168.209.150
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
           

arp配置

vim /etc/sysctl.conf
           

配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,lo:

# configration for lvs
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
           

刷新配置文件

sysctl -p

增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:

route add -host 192.168.209.150 dev lo:1
           

防止重启失效,做如下处理,用于开机自启动:

echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
           

此时, 开启两台RS上的Nginx服务, 即可通过访问 LVS中配置的虚拟ip(150节点), 访问Nginx了

Keepalived +LVS 高可用

LVS单个节点宕机, 则所有Nginx都不可访问, 考虑Keepalived +LVS实现高可用

下面, 以151节点为例, 使用keepalived配置LVS主节点

安装Keepalived过程省略, 需要提示一点: 执行make编译前, 需要指定核心配置文件所在位置:

--prefix=/usr/local/keepalived --sysconf=/etc

keepalived注册为系统服务:

keepalived 注册为系统服务:
- 切换到路径 /home/software/keepalived-2.0.18/keepalived/etc
- 将自启动脚本复制到系统文件夹 cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
- systemctl daemon-reload, 重加载系统服务
- 将keepalived作为系统服务启动, systemctl start keepalived.service
           

在 /etc/keepalived/ 下, 修改keepalived主配置文件如下

! Configuration File for keepalived

global_defs {
   # 主机标识符,全局唯一
   router_id keep_151
}

# 计算机节点实例
vrrp_instance VI_1 {
    # MASTER, nginx 主节点
    state MASTER
    # 网卡名
    interface ens33
    virtual_router_id 151
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.209.150
    }
}

# 配置集群地址访问的IP+端口, 端口和Nginx保持一致, 都是80
virtual_server 192.168.209.150 80 {
  # 健康检查时间  
  delay_loop 6
  # 负载均衡算法, 默认轮询
  lb_algo rr
  # 设置LVS的模式 NAT|TUN|DR
  lb_kind DR
  # 设置会话持久化时间
  persistence_timeout 5
  protocol TCP

  # 负载均衡的RS
  real_server 192.168.209.222 80 {
    weight 1
    # 设置健康检查
    TCP_CHECK {
      connect_port 80
      # 检查的超时时间
      connect_timeout 2
      # 重试次数
      nb_get_retry 3
      # 间隔时间
      delay_before_retry 3   
    }
  }  
  real_server 192.168.209.223 80 {
    weight 1
    # 设置健康检查
    TCP_CHECK {
      connect_port 80
      # 检查的超时时间
      connect_timeout 2
      # 重试次数
      nb_get_retry 3
      # 间隔时间
      delay_before_retry 3
    }
  }
}
           

由于负载均衡规则已经由 keepalived定义了, 那我们可以清除 LVS此前定义的负载均衡规则

ipvsadm -C

启动或重启 keepalived服务

systemctl start keepalived

systemctl restart keepalived

执行

ipvsadm -Ln

, 查看 LVS负载均衡规则是否设置成功

本地虚拟机模拟LVS+Keepalived+Nginx集群 (含关闭NetworkManager, 克隆虚拟机用)

151节点的配置完成了,152节点类似配置。访问192.168.209.150即可访问nginx

最后,150节点在生产环境应当是公网ip, 其他节点都是内网ip