9.6 18.6-18.10

18.6 负载均衡集群介绍

负载均衡集群可通过开源软件LVSkeepalivedhaproxynginx等来实现;

LVS基于OSI七层模型的第四层(传输层),nginx属于OSI模型的第七层(应用层),haproxy既可以在四层,也可以在七层;

Keepalived的负载均衡功能就是LVS(内置了LVS);

LVS基于四层,除了分发80端口外,还可以分发其他端口(用户除了可以分发https)的流量,还可以分发mysql等服务的流量);

Haproxy也支持mysql等(基于TCP的负载均衡);

Nginx仅支持分发httphttpsmail的流量;

Nginx使用更加灵活,比如可以基于一个站点的二级、三级目录名称区分后端服务器;

LVS更加稳定,能承载更高的并发量;

18.7 LVS介绍

由中国人章文嵩开发的,开源,流行度高;

基于TCP/IP进行路由和转发,稳定性和效率很高;

最新版LVS基于linux2.6内核,该软件已经有很多年没有更新了;

LVS的三种常见模式:

NAT

DR

IP Tunnel

LVS架构的角色:

分发器(load balancer):用于分发用户请求到处理请求的服务器

处理用户请求的服务器(real server,简称rs):用于处理用户请求

LVS的三种模式:

NAT

该模式通过iptablesNAT表来实现,分发器通过预设的NAT规则将请求分发给处理请求的服务器,服务器处理完请求后再将结果返回给分发器

NAT模式下分发器的性能和网络的带宽、质量会成为整个集群的瓶颈(分发器性能、网卡性能、网络带宽、质量);

NAT模式下处理请求的机器数量不能太多,相对其他模式能处理的请求数较少;

NAT模式下仅分发器需要公网ip,分发器与处理请求的机器使用内网通信即可;

 

IP Tunnel

用户将请求发到分发器的VIP(虚拟ip,一个公网ip地址)上,集群中的所有机器(分发器和rs)都需要配置该VIP,分发器根据算法决定将数据包交给哪个rs处理,然后分发器会在原来三层头部的基础上再加一个三层头部新三层头部的源ip为分发器的ip,目标ip为对应rsip,重新封装后分发器将请求发给对应的rsrs收到数据包后进行解包,查看二层头部发现目标macrs自己的mac,查看三层头部发现新三层头部的目标iprs本身的ip,去掉外层的三层头部查看里面的三层头部发现目标iprs上配置的VIP,于是rs处理该请求,然后将处理结果封装在数据包中(源ipVIP,  目标ip为客户端的ip)返回给客户,不再经过分发器

此时分发器不再是集群性能的瓶颈;

分发器和rs使用相同的公网ip作为VIP;

DR:

类似IP Tunnel,此时分发器(director)和处理请求的机器(row)间需要通过内网连接,此时更改的是目标MAC地址,不是目标ip,且所有分发器和处理请求的机器配置了相同的VIP

分发器收到请求后,根据调度算法决定将请求交给哪台机器处理,发送请求时,rs将数据包二层头部的目标mac写成对应rsmac地址,处理请求的机器处理请求后直接通过自己的公网ip(即VIP)将结果返回给用户,不经过分发器

分发器不再是集群的瓶颈;

分发器和所有rs必须在同一内网;

18.8 LVS的调度算法

轮询(round-robin,简称rr

不区分任何rs,将用户的请求依次发给各个rs处理,从第一个、第二个…,再从第一个、第二个循环,给所有rs均衡的分配请求

加权轮询(weight round-robin,简称wrr

为每台rs设置权重,性能好,处理能力强的机器可以分配较高的权重

最小连接(least-connection,简称lc

将最新的请求分配给连接数少,处理请求量少的rs

加权最小连接(weight least-connection,简称wlc

基于最小连接,根据每台rs的性能为每台rs设置大小合适的权重,将优先分配新请求给处理请求量少、权重值高的rs

LVS调度算法共有8种,其中常用的有4

基于局部性的最小连接(locality-based least connections,简称lblc

带复制的基于局部性的最小连接(locality-based least connections with replication,简称lblcr

目标地址散列调度(destination hashing,简称dh

源地址散列调度(source hashing,简称sh

18.9 LVS NAT模式搭建(上)

准备工作:

三台虚拟机:

一台机器作为分发器(dir),配置内网ip和公网ip(内网:31.127,外网:18.20(仅主机模式))

两台机器作为处理请求的机器(rs),仅配置内网ip,将两台机器的网关指向分发器(内网:31.128/31.129,设置网关为31.127

注意:

新克隆的机器需要修改ip地址(vim /etc/sysconfig/network-scripts/ifcfg-ens33)和主机名(vim /etc/hostname),然后重启机器

设置分发器:

分发器需要有连接rs的内网ip和连接公网的公网ip

设置VMware

将刚克隆的虚拟机作为分发器设置,连接内网的网卡设为NAT模式,连接外网的网卡设为仅主机模式

blob.png

编辑hyc-01-01-01的网卡配置文件:

[root@hyc-01-01-01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 ens33作为连接内网网卡

[root@hyc-01-01-01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37 ens37作为连接公网网卡

[root@hyc-01-01-01 ~]# ifdown ens37 && ifup ens37 重新加载网卡

成功断开设备 'ens37'

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6

[root@hyc-01-01-01 ~]# ifdown ens33 && ifup ens33

成功断开设备 'ens33'

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7

测试与分发器网卡连通性:

blob.png

设置两台rs的网关指向dir

[root@hyc-01-01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

[root@hyc-01-01 ~]# ifdown ens33 && ifup ens33

成功断开设备 'ens33'

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3

[root@hyc-01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

[root@hyc-01 ~]# ifdown ens33 && ifup ens33

成功断开设备 'ens33'

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2

[root@hyc-01 ~]# route –n 检查两台rs指向的网关

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.31.127  0.0.0.0         UG    100    0        0 ens33

192.168.31.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

在三台机器上关闭防火墙:

[root@hyc-01 ~]# systemctl stop firewalld

[root@hyc-01 ~]# systemctl disable firewalld

Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

建议继续使用centos6中的iptables

[root@hyc-01-01-01 ~]# yum install -y iptables-services

安装iptables防火墙时两台rs需要将网关指向NAT网络的默认网关,否则无法上网,无法正常下载软件包,安装完成后改回31.127

[root@hyc-01-01-01 ~]# rpm -ql iptables-services 查看一个包安装了哪些服务和文件

/etc/sysconfig/ip6tables

/etc/sysconfig/iptables

/usr/lib/systemd/system/ip6tables.service

/usr/lib/systemd/system/iptables.service

[root@hyc-01-01-01 ~]# systemctl start iptables 启动服务

[root@hyc-01-01-01 ~]# systemctl enable iptables 开机启动

Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

使用iptables的原因:

[root@hyc-01-01 ~]# iptables –F

iptables调用一个空规则,避免防火墙默认规则影响实验效果

[root@hyc-01-01 ~]# service iptables save

iptables: Saving firewall rules to /etc/sysconfig/iptables:[  确定  ]

关闭selinux

[root@hyc-01-01-01 ~]# setenforce 0 修改selinuxdisabled,临时生效

[root@hyc-01-01-01 ~]# getenforce

Disabled

[root@hyc-01-01-01 ~]# vim /etc/selinux/config 修改selinux配置文件,永久生效

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of three two values:

#     targeted - Targeted processes are protected,

#     minimum - Modification of targeted policy. Only selected processes are protected.

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

18.10 LVS NAT模式搭建(下)

在分发器上安装ipvsadm

[root@hyc-01-01-01 ~]# yum install -y ipvsadm

编辑脚本:

[root@hyc-01-01-01 ~]# vim /usr/local/sbin/lvs_nat.sh

#! /bin/bash

# director 服务器上开启路由转发功能

echo 1 > /proc/sys/net/ipv4/ip_forward

调整linux系统内核参数,实现路由转发功能,让数据包能转发到后端rs

# 关闭icmp的重定向

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# 注意区分网卡名称,dir的两块网卡分别为ens33ens37

echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects

此处应注意修改网卡名称

# director设置nat防火墙

iptables -t nat –F 清空nat表的规则

iptables -t nat –X 清空nat表中所有的链

iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -j MASQUERADE

让同网段的内网上网

# director设置ipvsadm 设置ipvsadm的规则

IPVSADM='/usr/sbin/ipvsadm' 设置一个变量

$IPVSADM -C

$IPVSADM -A -t 192.168.18.20:80 -s lc -p 3

增加一个nat模式的规则,指定分发器的外网ip,使用lc算法,并且在一段时间内(3s),来自同一客户端的请求会被分发到相同的rs

$IPVSADM -a -t 192.168.18.20:80 -r 192.168.31.128:80 -m -w 1

-r指定rs是谁,-m指定模式为nat-w指定该rs的权重

$IPVSADM -a -t 192.168.18.20:80 -r 192.168.31.129:80 -m -w 1

执行脚本:

[root@hyc-01-01-01 ~]# sh !$

sh /usr/local/sbin/lvs_nat.sh

[root@hyc-01-01-01 ~]# echo $?

0

NAT效果测试:

启动两台rs上的nginx

为方便测试修改nginx上的默认虚拟主机的主页文件内容

[root@hyc-01 html]# curl 127.0.0.1

rs for 192.168.31.128

[root@hyc-01-01 b]# curl 127.0.0.1

rs for 192.168.31.129

测试:

blob.png

此时由于设置了3s的长久连接,所以连续刷新多次页面内容未出现变化

 

修改/usr/local/sbin/lvs_nat.sh脚本,将原来指定的-p 3改为-p 0

[root@hyc-01-01-01 ~]# vim /usr/local/sbin/lvs_nat.sh

[root@hyc-01-01-01 ~]# sh !$

sh /usr/local/sbin/lvs_nat.sh

invalid timeout value `0' specified 报错

Memory allocation problem

Memory allocation problem

查看ipvsadm的规则:

[root@hyc-01-01-01 ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

没有任何ipvsadm规则,刚刚的脚本执行不成功

报错中提示不能设置为-p 0,这里将-p 0直接去掉

再执行脚本:

[root@hyc-01-01-01 ~]# sh /usr/local/sbin/lvs_nat.sh

再次查看ipvsadm规则:

[root@hyc-01-01-01 ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.18.20:80 lc

  -> 192.168.31.128:80            Masq    1      0          0        

  -> 192.168.31.129:80            Masq    1      0          0   

修改脚本后测试:

blob.png

刷新后再观察:

blob.png

经过反复刷新有时会出现31.128,有时出现31.129

在浏览器测试效果不均衡可能是因为wlc算法或浏览器缓存

在分发器上使用curl测试:

在脚本中将使用的算法改为rr

重新执行脚本后测试

[root@hyc-01-01-01 ~]# curl 192.168.18.20

rs for 192.168.31.129

[root@hyc-01-01-01 ~]# curl 192.168.18.20

rs for 192.168.31.128

[root@hyc-01-01-01 ~]# curl 192.168.18.20

rs for 192.168.31.129

[root@hyc-01-01-01 ~]# curl 192.168.18.20

rs for 192.168.31.128

此时请求会被均衡的发送到后端的rs


猜你喜欢

转载自blog.51cto.com/12216458/2173049
9.6