环境准备:
准备 3 台纯净的虚拟机,一台 server 服务器,两台 web 服务器
LVS-server 安装lvs管理软件
[root@localhost ~]# yum -y install ipvsadm
程序包:ipvsadm(LVS管理工具)
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file
配置文件:/etc/sysconfig/ipvsadm-config
#一、LVS/DR 模式
实验说明:
- 网络使用NAT模式
- DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域
- 所有节点网关均指定真实网关
###1. 准备工作(集群中所有主机)关闭 防火墙 和 selinux
[root@lvs-server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.181.141 lvs-server
192.168.181.128 real-server1
192.168.181.130 real-server2
###2、Director 分发器配置
#####2.1 配置VIP
[root@lvs-server ~]# ip addr add dev ens33 192.168.181.140/32 #设置VIP
[root@lvs-server ~]# yum -y install ipvsadm #RHEL确保LoadBalancer仓库可用
[root@lvs-server ~]# service ipvsadm start #启动
Redirecting to /bin/systemctl start ipvsadm.service
Job for ipvsadm.service failed because the control process exited with error code. See "systemctl status ipvsadm.service" and "journalctl -xe" for details.
注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
需要手动生成文件
[root@lvs-server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@lvs-server ~]# service ipvsadm start
Redirecting to /bin/systemctl start ipvsadm.service
#####2.2 定义LVS分发策略
-A #添加VIP
-t #用的是tcp协议
-a #添加的是lo的vip地址
-r #转发到realserverip
-s #算法
-L|-l –list #显示内核虚拟服务器表
--numeric, -n #以数字形式输出地址和端口号
-g --gatewaying #指定LVS工作模式为直接路由器模式DR(也是LVS默认的模式)
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
rr #轮循
如果添加ip错了,删除命令如下:
[root@lvs-server ~]# ip addr del 192.168.181.193 dev ens33
[root@lvs-server ~]# ipvsadm -C #清除内核虚拟服务器表中的所有记录。
[root@lvs-server ~]# ipvsadm -A -t 192.168.181.140:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 192.168.181.140:80 -r 192.168.181.128 -g
[root@lvs-server ~]# ipvsadm -a -t 192.168.181.140:80 -r 192.168.181.130 -g
[root@lvs-server ~]# service ipvsadm save #保存方式一,使用下面的保存方式,版本7已经不支持了
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm #保存方式二,保存到一个文件中
[root@lvs-server ~]# 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.181.140:80 rr
-> 192.168.181.128:80 Route 1 0 0
-> 192.168.181.130:80 Route 1 0 0
[root@lvs-server ~]# ipvsadm -ln --stats #显示统计信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.181.140:80 0 0 0 0 0
-> 192.168.181.128:80 0 0 0 0 0
-> 192.168.181.130:80 0 0 0 0 0
[root@lvs-server ~]# ipvsadm -ln --rate #看速率
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.181.140:80 0 0 0 0 0
-> 192.168.181.128:80 0 0 0 0 0
-> 192.168.181.130:80 0 0 0 0 0
###3. 所有RS配置
配置好网站服务器,测试所有RS #为了测试效果,提供不同的页面(以下两台real-server都操作)
#安装 nginx 并且使 real-server1 和 real-server2 访问地址显示的内容不同
[root@real-server1 ~]# ip addr add dev lo 192.168.181.140/32 #在lo接口上绑定VIP
[root@real-server2 ~]# ip addr add dev lo 192.168.181.140/32
[root@real-server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
[root@real-server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
[root@real-server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@real-server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@real-server1 ~]# systemctl start nginx #启动nginx
[root@real-server2 ~]# systemctl start nginx
------------------------------------------------------------------------------
因为:realServer的vip有了,接着就是同一个网段中拥有两个vip, 客户端在网关发送arp广播需找vip时需要让realServer不接受响应.
解决:
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备没有这个ip,就不做出响应(这个ip在lo上,lo不是接收设备的进口)
echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
使用最好的ip来回应,什么是最好的ip?同一个网段内子网掩码最长的
###4. 测试(修改后端nginx服务器的长连接)
[root@real-server1 ~]# vim /etc/nginx/nginx.conf #将长连接设置为0
keepalive_timeout 0;
[root@real-server1 ~]# nginx -s reload #重新加载nginx
[root@real-server2 ~]# vim /etc/nginx/nginx.conf
keepalive_timeout 0;
[root@real-server2 ~]# nginx -s reload
#二、LVS-NAT 模式
###1. 准备工作
- 加载内核 centos7+ 无需改动
#查看linux已加载的内核模块
[root@sql-review ~]# lsmod
#加载与卸载内核模块
[root@sql-review ~]# modprobe ip_vs #动态加载ip_vs 模块,这个命令只是临时生效,需要添加到开机启动项目里面
[root@sql-review ~]# lsmod | grep ip_vs #过滤模块是否加载成功!
[root@sql-review ~]# modprobe -r ip_vs #动态卸载ip_vs模块
#查看内核模块信息
[root@sql-review ~]# modinfo ip_vs
#设置开机启动项
[root@sql-review ~]# echo "modprobe ip_vs" >> /etc/rc.local
[root@sql-review ~]# chmod +x /etc/rc.local 切记添加执行权限
添加到开机启动项里面如果不需要这个模块的时候只需要将etc/rc.local里面对应的命令删除掉。但是这样需要重新启动服务器。 可以通过下面的命令立即生效。
[root@sql-review ~]# modprobe -r ip_vs #动态卸载ip_vs模块
- 集群中所有主机关闭 防火墙 和 selinux
# 配置解析(可选) 做的话每台都需要做
[root@lvs-server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.181.142 lvs-server
192.168.181.128 real-server1
192.168.181.130 real-server2
- 两台 real-server 安装 nginx 并且使 real-server1 和 real-server2 访问地址显示的内容不同
###2. RS 配置
real-server 所有服务器的默认网关均指向 Directory 的 DIP
[root@real-server1 ~]# route add default gw 192.168.181.142 dev ens33
[root@real-server2 ~]# route add default gw 192.168.181.142 dev ens33
[root@real-server1 ~]# ip r #查看是否添加
default via 192.168.181.142 dev ens33
default via 192.168.181.2 dev ens33
192.168.181.0/24 dev ens33 proto kernel scope link src 192.168.181.128
[root@real-server1 ~]# route -n #查看是否添加
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.181.142 0.0.0.0 UG 0 0 0 ens33
0.0.0.0 192.168.181.2 0.0.0.0 UG 0 0 0 ens33
192.168.181.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
###3. Director 分发器配置
#####3.1 先给LVS服务器新添加一块网卡网络模式设置为桥接模式。会自动生成一个ip,做为VIP。
# 可以看到自动生成了网卡 ens37 ip:为192.168.31.63/24
[root@lvs-server ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:48:1a:fe brd ff:ff:ff:ff:ff:ff
inet 192.168.181.142/24 brd 192.168.181.255 scope global dynamic ens33
valid_lft 1243sec preferred_lft 1243sec
inet6 fe80::9db3:1c86:27b7:1225/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:48:1a:08 brd ff:ff:ff:ff:ff:ff
inet 192.168.31.63/24 brd 192.168.31.255 scope global dynamic ens37
valid_lft 43170sec preferred_lft 43170sec
inet6 fe80::f91e:7d69:848c:c21e/64 scope link
valid_lft forever preferred_lft forever
# 如果没有ip根据自己的网段手动添加
[root@lvs-server ~]# ip addr add dev ens37 192.168.31.128/24
# 开启路由转发 添加如下行
[root@lvs-server ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 开启转发功能
[root@lvs-server ~]# sysctl -p
#####3.2 定义LVS的分发策略
[root@lvs-server ~]# yum -y install ipvsadm #RHEL确保LoadBalancer仓库可用
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@lvs-server ~]# service ipvsadm start #启动
[root@lvs-server ~]# ipvsadm -A -t 192.168.31.63:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 192.168.31.63:80 -r 192.168.181.128 -m
[root@lvs-server ~]# ipvsadm -a -t 192.168.31.63:80 -r 192.168.181.130 -m
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm #保存方式
[root@lvs-server ~]# 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.31.63:80 rr
-> 192.168.181.128:80 Masq 1 0 0
-> 192.168.181.130:80 Masq 1 0 0
[root@lvs-server ~]# ipvsadm -L -n --stats # 显示统计信息
[root@lvs-server ~]# ipvsadm -L -n --rate # 看速率
###4. 测试(注意修改后端服务器nginx的长连接)