1.背景:
个人(菜鸟)学习笔记,学点记下来,给未来的自己看。高手看了也请多指点。
按照课程讲,lvs是我国大神开发的负载均衡程序,被收录进内核,只要安装时内核里有它,它就始终存在,只需要定义规则就能用。性能极高但实用性一般。但这是学习基础。
具体实用性如何我不敢说,只能以学习为目的做实验,我只想以此为开端了解集群实现。这里先不涉及分布式,只实验集群调度。
2.环境:
使用win11物理机和VMware虚拟机。
物理机win11和虚拟机win11充当客户机。
从centos8虚拟机上克隆三个虚拟机,分别命名为director、node1、node2,充当调度器和两个web服务器。
根据课程要求,为ip地址命名简称。cip(client ip)、vip(direct virtual ip)、dip(direct ip)、rip(real server ip)。后面叙述时用到。
关于网络知识不赘述,掩码也不提了,就这么几台机器,只要合法,咋都行。
我所有的centos8都是最小安装,有关yum源和基础软件安装就不赘述了。我装了net-tools、ipvsadm、vim、openssh、nginx。后面会提到。
其中,虚拟机win11和director使用自动桥接网络VMnet0,跟物理机一个网段。node1和2使用专用网络VMnet1,跟物理机网络隔开。
3.目的:
3.1.目标效果:
一个“机房”有两个web服务器node1、node2,通过集群调度器director对外界提供web服务。并尝试端口映射,让node1和2的web服务监听在8080端口, 而director对外提供80端口服务。
外界客户机通过浏览器访问director公网地址,调度器可以把客户端请求,按照规则调度到实际的后台服务器node1、node2。
实际上生产环境中node1、node2的站点内容应该一样,这里不讨论分布式。但为了便于观察效果,我特意让两个服务器上放两个不同的index.html页面,分别显示page in node1和page in node2,这样客户端访问网页时,能直观看到区别。
3.2.nat架构:
director:vip,dip。rs:rip,网关指向dip。支持端口映射。
请求数据包:(cip)>(vip>dip)>(rip)。
响应数据包:(cip)<(vip<dip)<(rip)。
4.客户机准备:
物理机win11我使用的固定ip地址:192.168.0.2。虚拟机win11使用dhcp地址:192.168.116(这个无所谓,只要能和物理机互相通就行)。
客户机的ip地址称为cip(client ip)。
5.调度器director准备:
需要安装ipvsadm,它是个lvs的用户空间管理程序,用来设置ipvs(lvs)规则的。
需要两个ip地址,vip和dip,一个对外一个对内。
5.1.设置vip:
相当于“公网地址”,这里跟客户机一个网络,设置成192.168.0.8。可以改配置文件实现,但亲测使用NetworkManager更方便,也就是nmcli,nmtui。因为centos会自动生成类似“ens160”这种网络名,是能改,但我嫌麻烦。也没必要浪费时间。常见命令如下:
# nmcli d 查看网络接口列表。
# nmtui 打开tui编辑界面,配置网络。
# nmcli networking 查看nmcli是否介入管理
# nmcli networking on 启用nmcli
# nmcli con down/up ens160禁用/启用网卡,亲测比systemctl重启网络顶事,不知为何。
配置好以后,物理机(192.168.0.2)和director(192.168.0.8)互相能ping通。
5.2.设置dip:
相当于“私网地址”,这里跟两个Realserver(node1和node2)一个网络,设置为172.16.100.2。最开始我设置的是172.16.100.1,后来发现不妥,因为vmware会在物理机上生成一个网络连接是这个地址。
5.3.启用转发:
因为启用了两块网卡,负载均衡需要它们之间转发数据包。
# cat /proc/sys/net/ipv4/ip_forward 查看显示0,默认没启用。
# vim /etc/sysctl.conf 写net.ipv4.ip_forward = 1。sysctl.d下有软连接文件指向它,一样效果。
# sysctl -p加载后,再使用cat查看,已经开启。
6.node1和node2准备:
这两个是本次集群实验中的RealServer,所以它们的地址叫rip。
6.1.设置rip:
在VMware中把网卡配置到使用专网。
node1和node2分别设置为172.16.100.3和172.16.100.4,同时网关要指向director的dip,即:172.16.100.2。
设置好以后,director、node1、node2之间互相能ping通。
6.2.配置nginx:
我从nginx.org官网下载的nginx源码,本地编译安装的,目录就用的默认地址。
目录在/usr/local/nginx,
配置文件在/usr/local/nginx/conf/nginx.conf,
nginx应用程序在/usr/local/nginx/sbin/nginx。
编辑配置文件,加一段:
server {
listen 8080;
location / {
root /www;
index index.html;
keepalive_timeout 0s;
}
}
让nginx监听在8080端口,并指向一个本地站点目录,以及首页文件。
两个node中的index.html有意让它们不一样,分别显示“page in node1”和“page in node2”。便于看效果。实际生产环境不能这么干。
另外我设置了长连接超时为0s,就是让本次的http为短连接,更容易观察效果。
目录和文件操作就省略了。
# /usr/local/nginx/sbin/nginx运行nginx程序
# ss -tnl查看当前监听的端口
可以看到8080正常监听了,80也有是因为nginx.conf中有默认的server段。如果注释了默认的server段,reload一下,这里立刻就看不到80了。
设置好以后,尝试从director看看网页:
# curl http://172.16.100.3:8080
# curl http://172.16.100.4:8080
应该是没问题的。能看到“page in node1”和“page in node2”。
7.设置director集群规则:
之前装好ipvsadm程序,具体不明白看man手册即可。默认里面是没规则的,稳妥起见可以先清空。
# ipvsadm -C
# ipvsadm -Ln
添加外部出口,特别记录一下,我总忘了“-t”,centos8的man手册中-t ip:port一起算virtual_service。
# ipvsadm -A -t 192.168.0.8:80 -s rr
其中-s rr表示调度策略是轮巡。
添加两个rs(real server,即node1和node2)。
# ipvsadm -a -t 192.168.0.8:80 -r 172.16.100.3:8080 -m
# ipvsadm -a -t 192.168.0.8:80 -r 172.16.100.4:8080 -m
其中-m表示使用lvs的nat模式,MASQUERADE(伪装)。
显示还是很清晰的。最后记得先关闭防火前firewalld,做实验方便。
8.效果:
在物理机和虚拟机的win11上打开浏览器,输入网址192.168.0.8看结果。
如果当初node1和2当中的nginx不设置禁用长连接,具体显示哪个不一定的,我以为rr规则轮巡调用,但好像lvs内部算法不一定,要么是我没理解。以后有时间再考虑,先实现。
但是我设置 nginx短连接,所以其实不用虚拟机里的win11也行,就用物理机的win11浏览器,每刷新一次,就会切换一次,这就是负载均衡效果。
如果前面添加外部出口时-s调度策略选择sh,就很难看到轮巡效果了,有cache的情况下,命中率高。
在director中可以看连接状态。
若要把设置的规则持久化,使用-S参数保存。
使用rpm -qa ipvsadm可以看这个程序具体装了哪些文件,其中有一个:
/usr/lib/systemd/system/ipvsadm.service能看到-S是保存哪去了。
9.总结:
个人感觉真正不容易的是理解并掌握集群的概念和各种类型的实现原理,以及诞生原因。只是操作很简单,man手册非常清晰。
上述添加外部出口时的-s策略,和添加rs时的-m(g|i)lvs模式,可以尝试更换看效果。
当然本次只是做实验,真正在生产环境中,又是另外概念。咱们计算机领域面太大了,工作越久越觉得自己渺小。
本文完。