Linux学习112 基于LVS实现4层负载均衡配置和nat方式实战
一、IPVS配置
1、安装ipvsadm
a、yum install -y ipvsadm
b、查看相应文件
[root@www ~]# rpm -ql ipvsadm /etc/sysconfig/ipvsadm-config #我们可以使用此文件来配置自动保存规则 /usr/lib/systemd/system/ipvsadm.service #他的作用是为了让你开机的时候从文件/etc/sysconfig/ipvsadm中重载规则,然后在关机前将规则保存在/etc/sysconfig/ipvsadm中 /usr/sbin/ipvsadm #规则管理工具 /usr/sbin/ipvsadm-restore #规则载入工具 /usr/sbin/ipvsadm-save #规则保存工具 /usr/share/doc/ipvsadm-1.27 /usr/share/doc/ipvsadm-1.27/README /usr/share/man/man8/ipvsadm-restore.8.gz /usr/share/man/man8/ipvsadm-save.8.gz /usr/share/man/man8/ipvsadm.8.gz
2、ipvsadm管理几圈服务:增,改,删
a、增、改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
b、删
ipvsadm -D -t|u|f service-address
c、service-address
(1)、-t|u|f:
-t:TCP协议的端口,VIP:TCP_PORT
-u:UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,是一个数字
d、[-s scheduler]:指定集群的调度算法,默认为wlc;
3、管理集群上的RS:增,改,删
a、增,改:
ipvsadm -a|-e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
b、删
ipvsadm -d -t|u|f service-address -r server-address
c、server-address
rip[:port]
d、选项
(1)、lvs类型:
-g:gateway,dr类型
-i:ipip,tun类型
-m:masquerade,nat类型
(2)、-w weight:权重
4、清空定义的所有内容:
a、ipvsadm -C
5、查看
a、ipvsadm -L|l [options]
(1)、--numeric,-n:numeric output of addresses and ports:数字格式显示地址和端口并且不反解。
(2)、--exact:expand numbers (display exact values):精确显示计算器的值。
对应的计数器有三种:
1)、--connection,-c:output of current IPVS connections:用来显示连接状态,即当前我们服务器有多少个仍然在的活动或非活动连接
2)、--stats:output of statisics information:统计数据
3)、--rate:output of rate information:统计速率数据,比如从我们从集群启动开始到现在为止有一天了,一天中一共收到了三百万个请求,很显然stats就有三百万个连接数量,那么一天是八万六千四百秒,我们用三百万除以这么多秒平均下来每秒钟接收的连接数就叫速率。
12:00
6、保存和重载
a、保存:ipvsadm -S = ipvsadm-save
b、重载:ipvsadm -R = ipvsadm-restore
7、负载均衡集群设计时要注意的问题
a、是否需要会话保持
b、是否需要共享存储
(1)、共享存储:NAS,SAN,DS(分布式存储)
(2)、数据同步:
课外作业:rsync+inotify实现数据同步
8、lvs-nat
a、设计要点
(1)、RIP与DIP在同一IP网络,RIP的网关要指向DIP
(2)、支持端口映射
(3)、Director要打开核心转发功能
b、实践作业(博客):负载均衡两个php应用(wordpress,discuzx)
测试:
是否需要会话保持
是否需要共享存储
二、负载均衡集群配置
1、nat方法设计
a、我们现在来用三台虚拟机进行配置,一个调度器和两个RS,调度器有两张网卡,其中公网IP(VIP)为192.168.10.13,DIP我们配置为192.168.100.13。后端我们RS1网卡配置为192.168.100.14网关指向192.168.100.13。RS2网卡配置为192.168.100.15网关也指向192.168.100.13。并且我们RS1和RS2我们都配上web服务。
b、如下:
(1)、Director:
VIP:192.168.10.13
DIP:192.168.100.13
(2)、RS1:
RIP:192.168.100.14 gw:192.168.100.13
(3)、RS2:
RIP:192.168.100.15 gw:192.168.100.13
c、相应拓扑图
2、nat配置
a、我们配置集群中各节点时间同步
b、我们在rs1和rs2中分别安装nginx和telnet-server
yum install -y nginx telnet-server
c、我们分别在rs1和rs2中配置相应的网页资源
(1)、在RS1中查看
[root@rs1 ~]# cat /usr/share/nginx/html/test1.html <h1>RS1,192.168.100.14</h1> [root@rs1 ~]# systemctl restart nginx [root@rs1 ~]# curl 192.168.100.14/test1.html <h1>RS1,192.168.100.14</h1>
(2)、在RS2中查看
[root@rs2 /]# cat /usr/share/nginx/html/test1.html <h1>RS1,192.168.100.15</h1> [root@rs2 /]# systemctl restart nginx [root@rs2 /]# curl 192.168.100.15/test1.html <h1>RS1,192.168.100.15</h1>
d、在director上配置ipvsadm
(1)、安装ipvsadm
yum install -y ipvsadm
(2)、定义一个集群服务
[root@driector ~]# ipvsadm -A -t 192.168.10.13:80 -s rr
1)、上述的意思是添加一个tcp为80的集群服务,轮询方式为rr。
2)、我们来查看集群服务
[root@driector ~]# 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.10.13:80 rr
(3)、我们将后端的RS加入到集群服务
[root@driector ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.14 -m [root@driector ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.15 -m
1)、-a是添加的意思,-t是tcp的意思,-r是rs的意思,-m是指gw类型的意思因为我们是rr轮询方法所以此处我们不设置权重,因为设置权重是没用的。
2)、查看我们的集群
[root@driector ~]# 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.10.13:80 rr -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0
(4)、此时我们在外面访问192.168.10.13会发现没响应,这是因为我们没打开核心转发,因此此时我们打开director的核心转,然后我们发现就可以通过调度器进行访问了。
[root@driector ~]# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1
(5)、现在我们来访问
[root@driector var]# for i in {1..10};do curl 192.168.10.13/test1.html;done <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1>
e、现在我们来配置加权轮询,我们将第一台服务器权重定义为2第二台服务器权重定义为3
(1)、我们来定义权重
[root@driector /]# ipvsadm -e -t 192.168.10.13:80 -r 192.168.100.14 -m -w 2 [root@driector /]# ipvsadm -e -t 192.168.10.13:80 -r 192.168.100.15 -m -w 3 [root@driector /]# 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.10.13:80 rr -> 192.168.100.14:80 Masq 2 0 0 -> 192.168.100.15:80 Masq 3 0 0
(2)、此时虽然我们定义了权重但是我们的权重还是没法生效的,因为我们用的是轮询,因此我们还需要修改我们的调度算法
[root@driector /]# ipvsadm -E -t 192.168.10.13:80 -s wrr [root@driector /]# 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.10.13:80 wrr -> 192.168.100.14:80 Masq 2 0 0 -> 192.168.100.15:80 Masq 3 0 0
(3)、然后我们再进行访问
[root@driector /]# for i in {1..10};do curl 192.168.10.13/test1.html;done <h1>RS2,192.168.100.15</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1> <h1>RS2,192.168.100.15</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1> <h1>RS2,192.168.100.15</h1> <h1>RS1,192.168.100.14</h1>
1)、然后我们查看我们的连接状态发现基本是2:3
[root@driector /]# 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.10.13:80 wrr -> 192.168.100.14:80 Masq 2 0 8 -> 192.168.100.15:80 Masq 3 0 12
(4)、假如我们有一个RS挂掉了,我们有两种方式将其从集群中干掉,第一种是直接删除这个RS的记录,第二种是将其权重设置为0。
1)、我们来演示我们删除某个RS
[root@driector /]# 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.10.13:80 wrr -> 192.168.100.14:80 Masq 2 0 0 -> 192.168.100.15:80 Masq 3 0 0 [root@driector /]# ipvsadm -d -t 192.168.10.13:80 -r 192.168.100.15 [root@driector /]# 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.10.13:80 wrr -> 192.168.100.14:80 Masq 2 0 0
2)、这样我们的请求就只能访问到192.168.100.14上了。
(5)、我们也可以在Director上装一个nginx,假如后端的RS都挂了就用我们Director响应。不过我们就算在Director上装一个nginx也没有用,因为你的80的请求是被INPUT上的规则链直接劫走并且被当做集群服务了。但是如果我们后端的RS都挂了肯定就都连不上了。此时我们可以把我们Director上的回环地址当做RS。注意此处我们需要用到-g才行
[root@www ~]# ipvsadm -a -t 192.168.10.13:80 -r 127.0.0.1 -g [root@www ~]# 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.10.13:80 wrr -> 127.0.0.1:80 Masq 1 0 0 [root@www ~]# curl 192.168.10.13 Director
f、相应命令
现在我们把相应的规则加回来
[root@www ~]# ipvsadm -C [root@www ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@www ~]# ipvsadm -A -t 192.168.10.13:80 -s rr [root@www ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.14 -m [root@www ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.15 -m [root@www ~]# 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.10.13:80 rr -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0
(1)、现在我们使用sh算法,即把来自于同一个客户端的请求都送往相同的RS。
[root@www ~]# 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.10.13:80 rr -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0 [root@www ~]# ipvsadm -E -t 192.168.10.13:80 -s sh [root@www ~]# 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.10.13:80 sh -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0 [root@www ~]# for i in {1..5};do curl 192.168.10.13/test1.html;done <h1>RS1,192.168.100.14</h1> <h1>RS1,192.168.100.14</h1> <h1>RS1,192.168.100.14</h1> <h1>RS1,192.168.100.14</h1> <h1>RS1,192.168.100.14</h1>
(2)、我们现在在后端的RS各启动telnet服务,然后再创建相应的用户并设定密码
1)、在192.168.100.14上
[root@rs1 ~]# systemctl start telnet.socket [root@rs1 ~]# useradd centos; echo "wohaoshuai"|passwd --stdin centos Changing password for user centos. passwd: all authentication tokens updated successfully.
2)、在192.168.100.15上
[root@rs2 ~]# systemctl start telnet.socket [root@rs2 ~]# useradd centos; echo "wohaoshuai"|passwd --stdin centos useradd: user 'centos' already exists Changing password for user centos. passwd: all authentication tokens updated successfully.
(3)、我们定义lvs服务负载均衡我们后端的telnet
1)、定义服务并且添加
[root@www ~]# ipvsadm -A -t 192.168.10.13:23 -s wlc [root@www ~]# ipvsadm -a -t 192.168.10.13:23 -r 192.168.100.14 -m -w 1 [root@www ~]# ipvsadm -a -t 192.168.10.13:23 -r 192.168.100.15 -m -w 1 [root@www ~]# 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.10.13:23 wlc -> 192.168.100.14:23 Masq 1 0 0 -> 192.168.100.15:23 Masq 1 0 0 TCP 192.168.10.13:80 sh -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0
2)、现在我们来telnet我们的VIP
使用我们的centos账号telnet即可
(4)、我们可以通过--stats查看当前集群的连接数统计,conns表示分给某个RS的请求数量统计,InPkts表示入栈的报文数量,OutPkts表示出栈的报文的数量,同理InBytes和OutBytes分别表示入栈和出栈的字节的数量。
[root@www ~]# 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.10.13:23 2 84 69 4586 3868 -> 192.168.100.14:23 1 44 36 2400 2015 -> 192.168.100.15:23 1 40 33 2186 1853 TCP 192.168.10.13:80 9 48 28 3209 3360 -> 192.168.100.14:80 7 40 24 2682 2880 -> 192.168.100.15:80 2 8 4 527 480 [root@www ~]# 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.10.13:23 wlc -> 192.168.100.14:23 Masq 1 0 0 -> 192.168.100.15:23 Masq 1 0 0 TCP 192.168.10.13:80 sh -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0
(5)、我们可以使用--rate参数查看速率。CPS表示每秒钟建立的连接数,InPPS表示每秒钟入栈的报文数,同理OutPPS表示每秒钟出栈的报文数。InBPS和OutBPS分别表示每秒钟入栈和出栈的字节数
[root@www ~]# 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.10.13:23 0 0 0 0 0 -> 192.168.100.14:23 0 0 0 0 0 -> 192.168.100.15:23 0 0 0 0 0 TCP 192.168.10.13:80 0 0 0 0 0 -> 192.168.100.14:80 0 0 0 0 0 -> 192.168.100.15:80 0 0 0 0 0
(6)、我们还可以使用ipvsadm -Z命令来清空--rate和--stats中显示的相应的统计值。
[root@www ~]# ipvsadm -Z [root@www ~]# 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.10.13:23 0 0 0 0 0 -> 192.168.100.14:23 0 0 0 0 0 -> 192.168.100.15:23 0 0 0 0 0 TCP 192.168.10.13:80 0 0 0 0 0 -> 192.168.100.14:80 0 0 0 0 0 -> 192.168.100.15:80 0 0 0 0 0 [root@www ~]# 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.10.13:23 0 0 0 0 0 -> 192.168.100.14:23 0 0 0 0 0 -> 192.168.100.15:23 0 0 0 0 0 TCP 192.168.10.13:80 0 0 0 0 0 -> 192.168.100.14:80 0 0 0 0 0 -> 192.168.100.15:80 0 0 0 0 0
(7)、我们查看谁在访问可以使用 -c选项
[root@www ~]# ipvsadm -Ln -c IPVS connection entries pro expire state source virtual destination TCP 14:58 ESTABLISHED 192.168.10.13:37120 192.168.10.13:23 192.168.100.15:23
(8)、我们要保存规则的话可以使用-S选项,如果不需要做反解(即IP转换为相应的域名或别名等)的话加上-n即可。
1)、我们来查看
[root@www ~]# ipvsadm -S -A -t node1.wohaoshuai.com:telnet -s wlc -a -t node1.wohaoshuai.com:telnet -r 192.168.100.14:telnet -m -w 1 -a -t node1.wohaoshuai.com:telnet -r 192.168.100.15:telnet -m -w 1 -A -t node1.wohaoshuai.com:http -s sh -a -t node1.wohaoshuai.com:http -r 192.168.100.14:http -m -w 1 -a -t node1.wohaoshuai.com:http -r 192.168.100.15:http -m -w 1 [root@www ~]# ipvsadm -S -n -A -t 192.168.10.13:23 -s wlc -a -t 192.168.10.13:23 -r 192.168.100.14:23 -m -w 1 -a -t 192.168.10.13:23 -r 192.168.100.15:23 -m -w 1 -A -t 192.168.10.13:80 -s sh -a -t 192.168.10.13:80 -r 192.168.100.14:80 -m -w 1 -a -t 192.168.10.13:80 -r 192.168.100.15:80 -m -w 1
2)、我们可以将我们的规则保存下来
[root@www ~]# ipvsadm -S -n > /etc/sysconfig/ipvsadm
3)、然后我们可以进行清空并重载
[root@www ~]# ipvsadm -C [root@www ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@www ~]# ipvsadm -R < /etc/sysconfig/ipvsadm [root@www ~]# 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.10.13:23 wlc -> 192.168.100.14:23 Masq 1 0 0 -> 192.168.100.15:23 Masq 1 0 0 TCP 192.168.10.13:80 sh -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0
4)、我们也可以通过service进行重载,不过前提是你需要将规则保存在/etc/sysconfig/ipvsadm中。
[root@www ~]# cat /usr/lib/systemd/system/ipvsadm.service [Unit] Description=Initialise the Linux Virtual Server After=syslog.target network.target [Service] Type=oneshot ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" ExecStop=/sbin/ipvsadm -C RemainAfterExit=yes [Install] WantedBy=multi-user.target [root@www ~]# ipvsadm -C [root@www ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@www ~]# systemctl restart ipvsadm [root@www ~]# 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.10.13:23 wlc -> 192.168.100.14:23 Masq 1 0 0 -> 192.168.100.15:23 Masq 1 0 0 TCP 192.168.10.13:80 sh -> 192.168.100.14:80 Masq 1 0 0 -> 192.168.100.15:80 Masq 1 0 0