简单构建负载均衡和高可用的服务

Keepalived + LVS(NAT) 构建

软件安装

四台机器的网卡都使用NAT模式联网,具体用DHCP还是手动的配置都随你心意。

首先给两台单网卡的服务器安装httpd或者nginx

yum install httpd
# yum install nginx

systemctl start httpd && systemctl enable httpd

然后两台双网卡的服务器安装ipvsadm和keepalived,我觉得这里从yum源安装就可以了...又不是不能用。

yum install ipvsadm keepalived

systemctl start ipvsadm && systemctl enable ipvsadm
systemctl start keepalived && systemctl enable keepalived

方便起见,我们先把四台机器的防火墙以及SELinux关闭了。

setenforce 0 # temporary
systemctl disable firewalld
systemctl stop firewalld

网络配置

两台负载均衡的机器(两张网卡,NAT + 仅主机模式)

两台真实机器(一张网卡,仅主机)

IP规划

私有网段总共有三个:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

也就是说,我们服务设置的IP都是私有IP,在我们本机之外是不可访问的。

四台主机,其中两台服务器分别搭建Discuz论坛和Wordpress博客,另外两台服务器做高可用服务和负载均衡集群。基于LVS的NAT构建和keepalived的高可用及负载均衡的服务。

服务器对外地址对内地址对外虚拟地址对内虚拟地址
Keepalived主服务器10.10.10.6192.168.23.1010.10.10.10192.168.23.23
Keepalived备服务器10.10.10.7192.168.23.2010.10.10.10192.168.23.23
真实HTTP服务器A 192.168.23.30
真实HTTP服务器B 192.168.23.40

Keepalived主服务器

ens33是使用NAT模式的网卡,理论上应该是一个公网IP,也就是可以连接互联网,但是现在这个10.10.10.6是私有的,其他人访问不了,咋说呢?因为安装号VMware之后,我们的电脑会自动安装两张虚拟网卡,分别是Vmnet1(仅主机)、Vmnet8(NAT模式),所以我们打开浏览器访问10.10.10.6这个ip的时候,实际上是这个虚拟网卡的作用啦,相当于在一个广播域中。但是如果我们把Linux的IP设置为不在私有网段,此时我们的电脑是可以ping通的,但是浏览器是打不开的,因为浏览器会判断输入的IP是不是在私有网段。

简单来说,当我们安装好Vmware之后,它有一部分应该是一个路由器的功能,然后给我们的电脑安装了两块虚拟网卡,此时我们在打开Vmware后就好与其所有虚拟机处于同一个广播域中。

# /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=10.10.10.6
PREFIX=24
GATEWAY=10.10.10.2
DNS1=10.10.10.2

IPADDR1=10.10.10.10
PREFIX1=24

ens37是一个仅主机模式的网卡,也就是说它是不能连接外网的。

# /etc/sysconfig/network-scripts/ifcfg-ens37
IPADDR=192.168.23.10
PREFIX=24

IPADDR1=192.168.23.23
PREFIX1=24

Keepalived备服务器

与上面基本一致

# /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=10.10.10.7
PREFIX=24
GATEWAY=10.10.10.2
DNS1=10.10.10.2

IPADDR1=10.10.10.10
PREFIX1=24
# /etc/sysconfig/network-scripts/ifcfg-ens37
IPADDR=192.168.23.20
PREFIX=24

IPADDR1=192.168.23.23
PREFIX1=24

真实HTTP服务器A

真实的HTTP服务器应该是不能连接互联网的,所以网卡使用的仅主机模式,但是为了实验正常进行,我们应该先将其联网然后下载所需的软件安装,不过在企业中是会有yum局域源的。

# /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.23.30
PREFIX=24
GATEWAY=192.168.23.23

真实HTTP服务器B

# /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.23.40
PREFIX=24
GATEWAY=192.168.23.23

配置文件

分别在两台负载均衡服务器上编辑或新建/etc/keepalived/keepalived.conf,将下面的内容对照填入即可,其实这个配置文件很简单,稍微理解一下就懂得需要改什么了...特别是这两个配置文件是基本没有变化的...简直不要太简单,所以把之前的IP规划好,这里就很好办了,整个实验也就完成了。

这个没啥用了。

genhash -s 10.100.100.101 -p 8080 -u /hello

ipvsadm

注意需要将ipvsadm配置保存一下(我也不知道是哪些配置),如果执行那条命令的话是没办法重启ipvsadm服务的。

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
ipvsadm --save > /etc/sysconfig/ipvsadm

MASTER

global_defs {
   router_id LVS_MASTER
}
 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 81
    priority 80
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress {
        10.10.10.10
    }
}
 
vrrp_instance LAN_GATEWAY {
    state MASTER                   
    interface ens37
    virtual_router_id 82
    priority 80                
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress {
        192.168.23.23
    }
}
 
virtual_server 10.10.10.10 80 {
    delay_loop 15
    lb_algo rr
    lb_kind NAT
    # persistence_timeout 50
    protocol TCP
 
    real_server 192.168.23.30 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            connect_port 80
        }
    }
	
    real_server 192.168.23.40 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            connect_port 80
        }
    }
}

BACKUP

global_defs {
   router_id LVS_BACKUP
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 81
    priority 50
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress {
        10.10.10.10
    }
}
 
vrrp_instance LAN_GATEWAY {
    state BACKUP                   
    interface ens37
    virtual_router_id 82
    priority 50                  
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress {
        192.168.23.23
    }
}
 
virtual_server 10.10.10.10 80 {
    delay_loop 15
    lb_algo rr
    lb_kind NAT
    # persistence_timeout 50
    protocol TCP
 
    real_server 192.168.23.30 80 {
        weight 1
         TCP_CHECK {
            connect_timeout 5
            connect_port 80
        }
    }
	
    real_server 192.168.23.40 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            connect_port 80
        }
    }
}

测试

Keepalived会根据配置文件给你生成ipvsadm的nat构建集群,所以只需要安装好两个软件,然后把ipvsadm启动起来就可以了,并不需要手动添加集群....

image-20200616204005329

负载均衡

在MASTER上正常轮询,注意,如果MASTER没挂,那么在BACKUP上面是访问不了10.10.10.10这个虚拟IP的。但是可以ping通,就是访问不了,我也不知道为什么....

image-20200616205531844

image-20200616210748611

轮询不正常?

如果我们不用上面那种方式测试,使用浏览器会发现轮询很不正常,可能存在的原因有两点,我这里只说一点,因为另外一个我也不知道(憨憨,或许和缓存有关系?)。

keepalived配置文件中有一个参数是persistence_timeout 50,它的作用应该是50s内访问同一个主机,也就是说它不会做轮询?当然官网也有解释为什么这么做,但是我们最好还是注释掉。

image-20200616205328649

高可用

直接将MASTER机器Shutdown,观察是否能继续正常访问。

我还是不能理解,今天老师添加集群的时候是使用手动方式的。最开始我也是那样做的,但是后来想想不是这么一回事啊,手动给两台机器添加了集群,那么关掉MASTER还能够继续运作是否真的能说明是高可用的呢?keepalived集成了ipvsadm,如果它不能根据配置文件生成集群,那么配置是否出错了呢?

image-20200616211514533

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://blog.imoyb.com/archives/lvs-keepalived