Linux学习112基于LVS实现4层负载均衡配置和nat方式实战
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 100
-> 192.168.100.15:80 Masq 100
(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 -w2
[root@driector /]# ipvsadm -e -t 192.168.10.13:80 -r 192.168.100.15 -m -w3
[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 200
-> 192.168.100.15:80 Masq 300
(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 200
-> 192.168.100.15:80 Masq 300
(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 208
-> 192.168.100.15:80 Masq 3012
(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 200
-> 192.168.100.15:80 Masq 300
[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 200
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 100
[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 100
-> 192.168.100.15:80 Masq 100
(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 100
-> 192.168.100.15:80 Masq 100
[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:80sh
-> 192.168.100.14:80 Masq 100
-> 192.168.100.15:80 Masq 100
[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 -w1
[root@www ~]# ipvsadm -a -t 192.168.10.13:23 -r 192.168.100.15 -m -w1
[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 100
-> 192.168.100.15:23 Masq 100
TCP 192.168.10.13:80sh
-> 192.168.100.14:80 Masq 100
-> 192.168.100.15:80 Masq 100
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:232846945863868
-> 192.168.100.14:231443624002015
-> 192.168.100.15:231403321861853
TCP 192.168.10.13:809482832093360
-> 192.168.100.14:807402426822880
-> 192.168.100.15:80284527480
[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 100
-> 192.168.100.15:23 Masq 100
TCP 192.168.10.13:80sh
-> 192.168.100.14:80 Masq 100
-> 192.168.100.15:80 Masq 100
(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:2300000
-> 192.168.100.14:2300000
-> 192.168.100.15:2300000
TCP 192.168.10.13:8000000
-> 192.168.100.14:8000000
-> 192.168.100.15:8000000
(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:2300000
-> 192.168.100.14:2300000
-> 192.168.100.15:2300000
TCP 192.168.10.13:8000000
-> 192.168.100.14:8000000
-> 192.168.100.15:8000000
[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:2300000
-> 192.168.100.14:2300000
-> 192.168.100.15:2300000
TCP 192.168.10.13:8000000
-> 192.168.100.14:8000000
-> 192.168.100.15:8000000
(7)、我们查看谁在访问可以使⽤ -c选项
[root@www ~]# ipvsadm -Ln -c
IPVS connection entries
pro expire state source virtual destination
TCP 14:58 ESTABLISHED 192.168.10.13:37120192.168.10.13:23192.168.100.15:23
(8)、我们要保存规则的话可以使⽤-S选项,如果不需要做反解(即IP转换为相应的域名或别名等)的话加上-n即可。
1)、我们来查看
[root@www ~]# ipvsadm -S
-A -t :telnet -s wlc
-a -t :telnet -r 192.168.100.14:telnet -m -w1
-a -t :telnet -r 192.168.100.15:telnet -m -w1
-A -t :http -s sh
-a -t :http -r 192.168.100.14:http -m -w1
-a -t :http -r 192.168.100.15:http -m -w1
[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 -w1
-a -t 192.168.10.13:23 -r 192.168.100.15:23 -m -w1
-A -t 192.168.10.13:80 -s sh
-a -t 192.168.10.13:80 -r 192.168.100.14:80 -m -w1
-a -t 192.168.10.13:80 -r 192.168.100.15:80 -m -w1
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 100
-> 192.168.100.15:23 Masq 100
TCP 192.168.10.13:80sh
-> 192.168.100.14:80 Masq 100
-> 192.168.100.15:80 Masq 100
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 100
-> 192.168.100.15:23 Masq 100
TCP 192.168.10.13:80sh
-> 192.168.100.14:80 Masq 100
-> 192.168.100.15:80 Masq 100。