本章内容:
- 了解 LVS-DR 群集的工作原理
- 会构建LVS-DR 负载均衡群集
1.1 LVS-DR 群集
1.1.1 LVS-DR工作原理
1.1.2 数据包流向分析
以下为数据包流向分析步骤:
- 客户端发送请求到 Director Server,请求的数据报文(源IP是CIP,目标IP是 VIP)到达内核空间
- Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输。
-
内核空间判断数据包的目标 IP 是本机 VIP ,此时 IPVS 比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源 IP 地址与目标 IP 地址没有改变,然后将数据包发送给 Real Server 。
-
到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文( 源 IP 地址为 VIP ,目标 IP 为 CIP) ,将响应报文通过 lo 接口传送给物理网卡然后向外发出。
- Real Server 直接将响应报文传送到客户端。
1.1.3 LVS-DR 模式特点
下面是 LVS-DR 模式的特点:
- Director Server 和 Real Server 必须在同一个物理网络中
- Real Server 可以使用私有地址,也可以使用公网地址,如果使用公网地址,可以通过互联网对 RIP 进行直接访问
- 所有的请求报文经由 Director Server,但恢复响应报文不能经过 Director Server。
-
Real Server 的网关不允许指向 Director Server IP ,即 不允许数据包经过 Director Server。
- Real Server 上的 lo 接口配置 VIP 的 IP 地址。
2.1 案例:直接路由模式(LVS-DR)
2.1.1 准备案例环境
2.1.2 配置负载调度器
下面是配置负载调度器的具体步骤
服务器如下
1.配置虚拟IP地址(VIP)
[root@LVS network-scripts]# cd
[root@LVS ~]# cd /etc/sysconfig/network-scripts/
[root@LVS network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@LVS network-scripts]# cat ifcfg-ens33:0
NAME="ens33:0"
DEVICE="ens33:0"
ONBOOT="yes"
IPADDR="192.168.182.11"
NETMASK=255.255.255.255
[root@LVS network-scripts]# ifup ens33:0
[root@LVS network-scripts]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.182.11 netmask 255.255.255.255 broadcast 192.168.182.11
ether 00:0c:29:e8:c0:2b txqueuelen 1000 (Ethernet)
[root@LVS network-scripts]#
2.调整 proc 响应参数
[root@LVS network-scripts]# vim /etc/sysctl.conf
[root@LVS network-scripts]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@LVS network-scripts]# cat /etc/sysctl.conf | grep net
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@LVS network-scripts]#
3.配置负载分配策略
[root@LVS ~]# yum -y install ipvsadm
[root@LVS ~]# ipvsadm -C //清除原有策略
[root@LVS ~]# ipvsadm -A -t 192.168.182.11:80 -s rr
[root@LVS ~]# ipvsadm -a -t 192.168.182.11:80 -r 192.168.182.101 -g -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.182.11:80 -r 192.168.182.102 -g -w 1
[root@LVS ~]# ipvsadm-save > /etc/sysconfig/ipvsadm //保存策略
[root@LVS ~]# systemctl enable ipvsadm.service
2.1.3 配置节点服务器
1.配置虚拟IP地址(VIP)
[root@node01 ~]# cd /etc/sysconfig/network-scripts/
[root@node01 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@node01 network-scripts]# vim ifcfg-lo:0
[root@node01 network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.182.11
NETMASK=255.255.255.255 //注意:子网掩码必须全为1
ONBOOT=yes
[root@node01 network-scripts]# ifup lo:0
[root@node01 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.182.11 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
[root@node01 network-scripts]# vim /etc/rc.local //添加本地 VIP 访问路由
/sbin/route add -host 192.168.182.11 dev lo:0
[root@node01 network-scripts]# route add -host 192.168.182.11 dev lo:0
2.调整 proc 响应参数
调整 proc 响应参数命令如下:
[root@node01 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@node01 ~]# sysctl -p
3.1 配置NFS共享存储
NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。在 CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持。
1)安装 nfs-utils,rpcbind 软件包
提供 RPC 支持的服务为 rpcbind,提供 NFS 共享的服务为 nfs,完成安装以后建议调整这两个服务的自启动状态,以便每次开机后自动启用。手动加载 NFS 共享服务时,应该先启动 rpcbind,再启动 nfs。
[root@NFS ~]# yum -y install nfs-utils rpcbind
[root@NFS ~]# systemctl enable nfs
[root@NFS ~]# systemctl enable rpcbind
2)设置共享目录
NFS 的配置文件为/etc/exports,文件内容默认为空(无任何共享)。在 exports 文件中设置共享资源时,记录格式为“目录位置客户机地址(权限选项)”。例如,若要将文件夹/opt/wwwroot 共享给 192.168.182.0/24 网段使用,允许读写操作,具体配置如下所示
[root@NFS ~]# mkdir /aaa
[root@NFS ~]# vim /etc/exports
[root@NFS ~]# cat /etc/exports
/aaa 192.168.182.0/24(rw,sync,no_root_squash)
[root@NFS ~]#
3)启动 NFS 服务程序
[root@NFS ~]# systemctl start rpcbind
[root@NFS ~]# systemctl start nfs
[root@NFS ~]# netstat -anpt | grep rpc
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 64110/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 64297/rpc.mountd
tcp 0 0 0.0.0.0:51284 0.0.0.0:* LISTEN 64293/rpc.statd
tcp6 0 0 :::111 :::* LISTEN 64110/rpcbind
tcp6 0 0 :::20048 :::* LISTEN 64297/rpc.mountd
tcp6 0 0 :::54240 :::* LISTEN 64293/rpc.statd
[root@NFS ~]#
4)查看本机发布的 NFS 共享目录
[root@NFS ~]# showmount -e
Export list for NFS:
/aaa 192.168.182.0/24
[root@NFS ~]#
3.2在客户机中访问 NFS 共享资源
NFS 协议的目标是提供一种网络文件系统,因此对 NFS 共享的访问也使用 mount 命令来进行挂载,对应的文件系统类型为 nfs。既可以手动挂载,也可以加入/etc/fstab 配置文件来实现开机自动挂载。考虑到群集系统中的网络稳定性,NFS 服务器与客户机之间最好使用专有网络进行连接。
1)安装 rpcbind 软件包,并启动 rpcbind 服务
若要正常访问 NFS 共享资源,客户机中也需要安装 rpcbind 软件包,并启动 rpcbind 系统服务。另外,为了使用 showmount 查询工具,建议将 nfs-utils 软件包也一并装上
[root@node01 ~]# yum -y install rpcbind nfs-utils
[root@node01 ~]# systemctl enable rpcbind
[root@node01 ~]# systemctl start rpcbind
[root@node02 ~]# yum -y install rpcbind nfs-utils
[root@node02 ~]# systemctl enable rpcbind
[root@node02 ~]# systemctl start rpcbind
如果已经安装了 nfs-utils 软件包,则客户机也可以使用 showmount 查看 NFS 服务器端共享了哪些目录,查询格式为“showmount -e 服务器地址”
[root@node01 ~]# showmount -e 192.168.182.105
Export list for 192.168.182.105:
/aaa 192.168.182.0/24
[root@node01 ~]#
3.3 安装 httpd 创建测试网页
1)安装 httpd,创建测试网页的命令如下:
[root@node01 ~]# yum -y install httpd
[root@node01 ~]# mount 192.168.182.105:/aaa /var/www/html/
[root@node01 ~]# vim /var/www/html/index.html
[root@node01 ~]# cat /var/www/html/index.html
<h1>Hello Word</h1>
[root@node01 ~]#
[root@node02 ~]# mount 192.168.182.105:/aaa /var/www/html
2)启用 httpd服务程序
[root@node01 ~]# systemctl start httpd
[root@node01 ~]# systemctl enable httpd
[root@node02 ~]# systemctl start httpd
[root@node02 ~]# systemctl enable httpd
4.1 测试 LVS 群集
查看那些用户访问了那台机器
[root@LVS ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:20 FIN_WAIT 192.168.182.1:63834 192.168.182.11:80 192.168.182.102:80
TCP 01:56 FIN_WAIT 192.168.182.1:63835 192.168.182.11:80 192.168.182.101:80
[root@LVS ~]#