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 镜像

image.png

创建命令执行完成后,目前有两个 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 模式,实现集群系统的负载均衡。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容