145LVS 集群负载均衡实战--LVS实战
LVS/NAT 搭建
集群环境搭建
在本实验环境中我们没有办法为大家提供多台服务器来模拟集群环境,由此我们 docker 工具来创建多个 container 来模拟集群所需要的多台服务器。
docker 可以简单的理解为非常轻量级的虚拟机工具,而 container 则理解为创建的虚拟机。
集群系统中,服务器资源可以简单分为两种角色:
一种是 Load Balancer,即负载均衡调度器,位于集群系统的前端,对后端服务器实现负载均衡作用,对外 IP 地址也称为 VIP(虚拟 IP 地址)。
另一种就是后端服务器群,处理由 Load Balancer 发来的请求。
整个集群系统结构:
宿主机环境(默认桌面环境):装有 ipvsadm(LVS 的 IP 负载由 IPVS 内核模块完成,ipvsadm 是为 IPVS 编制规则的工具),充当负载均衡调度器
宿主机浏览器:通过宿主机中的浏览器来充当客户端
RealServer1 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员
RealServer2 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员
实验步骤
我们将通过这样的一些步骤来完成此次的实验:
本地安装 ipvsadm 工具,加载 IPVS 模块
通过 docker 创建两个 container 来模拟服务器池中的成员
配置两台 RealServer 的环境:
安装 vim 与 nginx 工具
修改默认的 nginx 展示页面
配置负载均衡调度机器:
修改内核转发参数
配置 ipvsadm 规则
测试实验效果
测试步骤
LVS 成功测试:我们能够通过 VIP 访问我们的 Nginx 站点,经过多次的刷新我们能够访问另一个站点的内容(以显示的内容以作区分,因为负载并不高,所以需要很多次刷新,点击地址栏,按住 F5 不放)
LVS/NAT 实现
安装 ipvsadm 工具
首先为了能够使用 IPVS 内核模块,我们将在宿主机中安装 ipvsadm,并尝试能否使用:
# 更新源
sudo apt-get update
# 安装 ipvsadm 工具
sudo apt-get install ipvsadm
# 尝试使用 ipvsadm
sudo ipvsadm -L
image.png
创建服务器池成员
使用 docker 创建所需 container,使用以下命令创建:
docker run --privileged --name=RealServer1 -tdi ubuntu
docker run --privileged --name=RealServer2 -tdi ubuntu
命令讲解:
docker run:创建 docker 容器
name 参数:给容器命名,方便区分
tid 参数:分配 tty,能够与之交互
ubuntu:指定容器镜像,这里使用 ubuntu 镜像
创建命令执行完成后,目前有两个 container:
RealServer1:IP 地址为 192.168.0.2。下文简称 RIP1
RealServer2:IP 地址为 192.168.0.3。下文简称 RIP2
可以通过 ifconfig 命令查看各自的 IP 地址,此处的地址是因为按顺序,且按默认配置创建所导致
配置服务器池成员
RealServer 部署 Nginx 来提供 Web 服务,RealServer1 和 RealServer2 操作步骤相同,此处以 RealServer1 为示例:
首先登录 RealServer1:
# 通过 attach 命令登录 RealServer1
docker attach RealServer1
安装相关工具
apt-get update
apt-get install vim -y
apt-get install nginx -y
service nginx start
为了区分 RealServer1 和 RealServer2 的 Nginx 响应页面,需要修改默认 nginx 的展示 html 页面。
#进入 RealServer1 container 环境
vi /usr/share/nginx/html/index.html
image.png
按 i 键插入,按 esc 再输入 :wq 保存退出。
注意若完成了 RealServer1 的配置之后,如果我们不想打开新的终端,可以通过 ctrl+p+q 的组合快捷键脱离当前机器的登录,切勿使用 exit 的方式退出 container,这样的方式关闭服务器的。 脱离之后便会返回到 shiyanlou 的 zsh 交互,可以通过 docker attach RealServer2 的命令来登录另一台机器,然后做类似的操作(同上的软件安装操作以及 nginx 启动操作)
接下来就修改 nginx 页面,如下所示:
#在 RealServer2 container 环境
vi /usr/share/nginx/html/index.html
image.png
完成两台服务器的配置之后,我们通过 service nginx start 启动服务器中 nginx 服务。
至此我们完成两台 Web 服务器的配置,我们可以打开宿主机 firefox 浏览器,地址栏分别输入两个 IP 地址,来检验我们的配置成功:
image.png
image.png
配置调度器规则
1.为避免影响实验结果,关闭宿主机环境的 nginx 服务:
sudo service nginx stop
LoadBalancer 的对外 IP 地址为 VIP,即 VIP 地址为 120.26.15.9 (注意,你的 VIP 地址可能和我的不一样,根据自己实际情况来)。对内 IP 称为 RIP,此时 RIP 为 192.168.0.1。
2.开启 LoadBalancer 的内核路由转发:
echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward
3.查看当前机器内核路由转发开启情况:
cat /proc/sys/net/ipv4/ip_forward
得到的值为 1,说明此机器已开启内核路由转发。进行下一步。
4.使用 ipvsadm 添加 ipvs 规则。定义集群服务:
sudo ipvsadm -A -t 120.26.15.9:80 -s rr #定义集群服务
sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.2 -m #添加 RealServer1
sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.3 -m #添加 RealServer2
sudo ipvsadm -l #查看 ipvs 定义的规则
上面命中 ipvsadm 参数讲解:
# 添加集群服务
-A:添加一个新的集群服务
-t: 使用 TCP 协议
-s: 指定负载均衡调度算法
rr:轮询算法(LVS 实现了 8 种调度算法)
120.26.15.9:80 定义集群服务的 IP 地址(VIP) 和端口
# 添加 Real Server 规则
-a:添加一个新的 RealServer 规则
-t:tcp 协议
-r:指定 RealServer IP 地址
-m:定义为 NAT
上面命令添加了两个服务器 RealServer1 和 RealServer2
image.png
测试配置
打开浏览器,输入 VIP 地址:120.26.15.9:
image.png
可以发现,我们访问 VIP 地址,得到的是 RealServer1 的 Nginx 响应页面。多次刷新页面,页面也会发生变化:
image.png
因为访问压力比较小,调度算法不会请求切换服务器,可以按住 F5 快速多次刷新查看页面变化效果
以上便实现了 LVS 的 NAT 负载均衡系统。
LVS/DR 搭建
集群环境搭建
与 NAT 方式相同,我们将通过 docker 来模拟我们的集群环境。
集群系统中,服务器资源可以简单分为两种角色:
一种是 Load Balancer,即负载均衡调度器,位于集群系统的前端,对后端服务器实现负载均衡作用,对外 IP 地址也称为 VIP(虚拟 IP 地址)。
另一种就是后端服务器群,处理由 Load Balancer 发来的请求。
整个集群系统结构:
宿主机环境(默认桌面环境):充当客户端访问 web 服务
LoadBalancer1 的 container:装有 ipvsadm,充当负载均衡调度器
RealServer1 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员
RealServer2 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员
实验步骤
我们将通过这样的一些步骤来完成此次的实验:
本地安装 ipvsadm 工具,加载 IPVS 模块
通过 docker 创建三个 container 来模拟服务器池中的成员
配置两台 RealServer 的环境:
安装 vim 与 nginx 工具
修改默认的 nginx 展示页面
修改内核参数,抑制 arp
创建网卡别名与添加路由
配置一台 LoadBalancer 环境:
安装 ipvsadm
配置网卡别名
配置 ipvsadm 规则
测试实验效果
测试实验效果
LVS 成功测试:我们能够通过 VIP 访问我们的 Nginx 站点,经过多次的刷新我们能够访问另一个站点的内容(以显示的内容以作区分,因为负载并不高,所以需要很多次刷新,点击地址栏,按住 F5 不放)
查看 ipvsadm 中的统计数据。
LVS/DR 实现
若是我们沿用 NAT 的实验环境,我们需要做环境的清理:
1.首先清除 ipvsadm 的规则:
sudo ipvsadm -C
2.删除之前所创建的 container,虽然都是提供 Web 服务,但是在 DR 模式中需要修改内核参数与创建网卡别名,需要超级权限,所以不能沿用之前的 container:
# 关闭所有的 container
docker stop `docker ps -aq`
# 删除所有的 container
docker rm `docker ps -aq`
安装 ipvsadm 工具
因为在 NAT 实验中我们已安装所以可跳过该步骤,若是新启动的环境请参考 NAT 中的步骤,此处提示务必在宿主机环境中执行 ipvsadm -L 的验证步骤,若是不执行该步骤,在 LoadBalancer 的 container 中我们将无法加载 IPVS 的内核模块。
创建与配置服务器池成员
同样我们使用 docker 来模拟我们的集群环境,创建三台 container:
docker run --privileged --name=LoadBalancer -tid ubuntu
docker run --privileged --name=RealServer1 -tid ubuntu
docker run --privileged --name=RealServer2 -tid ubuntu
其中 --privileged 参数用于给予容器超级权限。
完成我们服务器池成员的创建之后,我们参照 NAT 中配置步骤完成 RealServer 中的:
nginx 与 vim 的安装
默认展示页面的修改
nginx 服务的启动
在完成这样的配置之后我们需要一些额外的操作:
1.修改内核参数
以 RealServer1 为例,登录 container:
执行下列命令:
# 设置只回答目标IP地址是来访网络接口本地地址的ARP查询请求
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
# 为了保险自己可以查看一下是否成功修改
cat /proc/sys/net/ipv4/conf/lo/arp_ignore
# 设置对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
# 使得上面的配置立即生效
sysctl -p
ARP 的内核参数: arp_ignore 部分参数:定义了本机响应 ARP 请求的级别
0 表示目标 IP 是本机的,则响应 ARP 请求。默认为 0
1 如果接收 ARP 请求的网卡 IP 和目标 IP 相同,则响应 ARP 请求
arp_announce 参数:定义了发送 ARP 请求时,源 IP 应该填什么。
0 表示使用任一网络接口上配置的本地 IP 地址,通常就是待发送的 IP 数据包的源 IP 地址 。默认为 0
1 尽量避免使用不属于该网络接口(即发送数据包的网络接口)子网的本地地址作为 ARP 请求的源 IP 地址。大致的意思是如果主机包含多个子网,而 IP 数据包的源 IP 地址属于其中一个子网,虽然该 IP 地址不属于本网口的子网,但是也可以作为ARP 请求数据包的发送方 IP。
2 表示忽略 IP 数据包的源 IP 地址,总是选择网络接口所配置的最合适的 IP 地址作为 ARP 请求数据包的源 IP 地址(一般适用于一个网口配置了多个 IP 地址)
2.配置网卡别名
只有目的 IP 是本机器中的一员时才会做相应的处理,所以需要添加网卡别名:
# 配置虚拟IP
ifconfig lo:0 192.168.0.10 broadcast 192.168.0.10 netmask 255.255.255.255 up
# 添加路由,因为本就是相同的网段所以可以不添加该路由
route add -host 192.168.0.10 dev lo:0
service networking restart
image.png
同两台 Web 服务器中都做该配置,即完成了所有 Web 服务器所需的配置工作。
** 配置调度器规则**
紧接着我们登录 LoadBalancer 机器:
docker attach LoadBalancer
安装 ipvsadm 软件:
apt-get update
apt-get install -y ipvsadm
ipvsadm -L #查看 ipvsadm 能否正常使用
image.png
image.png
image.png
创建 eth0 的别名并绑定 VIP 地址,作为集群同时使用:
ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0 up
查看网卡信息:ifconfig
image.png
在 LoadBalancer 中添加 IPVS 规则:
ipvsadm -A -t 192.168.0.10:80 -s rr # 定义集群服务
ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.3 -g # 添加 RealServer1
ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.4 -g # 添加 RealServer2
ipvsadm -l # 查看 ipvs 定义的规则
ipvsadm 命令参数讲解:
# 添加集群服务
-A:添加一个新的集群服务
-t: 使用 TCP 协议
-s: 指定负载均衡调度算法
rr:轮询算法(LVS 实现了 8 种调度算法)
192.168.0.10:80 定义集群服务的 IP 地址(VIP) 和端口
# 添加 Real Server 规则
-a:添加一个新的 RealServer 规则
-t:tcp 协议
-r:指定 RealServer IP 地址
-g:定义为 DR 模式
上面命令添加了两个集群服务器 RealServer1 和 RealServer2
image.png
使用两组组合快捷键 (ctrl+p)+(ctrl+q),脱离当前容器环境。
由此我们便完成了所有的配置工作。
测试配置
打开宿主环境的 firefox 浏览器,地址栏输入 VIP 地址:192.168.0.10:
image.png
此时由 RealServer1 的 Nginx 响应页面,多次刷新页面,页面发生变化:
image.png
页面结果由 RealServer2 的 Nginx web 服务器响应。
因为访问压力比较小,调度算法不会请求切换服务器,可以按住 F5 快速多次刷新查看页面变化效果
以上操作就实现了 LVS/DR 模式,实现集群系统的负载均衡。