一、ipvs相关和安装:
首先查看内核ipvs相关
[root@C712 ~]# cd /boot
[root@C712 boot]# ls
config-3.10.0-693.el7.x86_64
[root@C712 boot]# grep -i 'ipvs' -C 10 config-3.10.0-693.el7.x86_64
.....
CONFIG_NETFILTER_XT_MATCH_IPVS=m #编译到内核
......
CONFIG_IP_VS_PROTO_TCP=y#对tcp支持
CONFIG_IP_VS_PROTO_UDP=y#对udp支持
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler #支持哪些算法
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
[root@C712 boot]# yum install ipvsadm -y #安装ipvsadm
ipvsadm:
- 程序包:ipvsadm
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
ipvsadm命令:
核心功能:有两个
1、集群服务管理:增、删、改;
2、集群服务的RS管理:增、删、改;
查看:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]#新增或修改一个集群服务
ipvsadm -D -t|u|f service-address#删除一个集群服务
ipvsadm -C#清空所有的
ipvsadm -R#恢复和重载规则
ipvsadm -S [-n]#保存规则
ipvsadm -a|e -t|u|f service-address -r server-address [options]#向一个已有的集群服务添加或修改一个server
ipvsadm -d -t|u|f service-address -r server-address向一个已有的集群服务删除一个server
ipvsadm -L|l [options]#查看集群服务
ipvsadm -Z [-t|u|f service-address]#清空计数器
二、管理集群服务:增、改、删;
1、管理集群服务增加和修改:
格式:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
2、删除:
格式:ipvsadm -D -t|u|f service-address
3、地址格式:
service-address:
-t|u|f:
-t: TCP协议的端口,VIP:TCP_PORT
-u: UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,是一个数字;
4、调度算法格式
[-s scheduler]:指定集群的调度算法,默认为wlc;
三、管理集群上的RS:增、改、删;
1、管理集群上的RS增加和修改:
格式:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
2、管理集群上的RS删除:
格式:ipvsadm -d -t|u|f service-address -r server-address
3、地址格式:
server-address:
rip[:port]:rip地址加端口
四、命令选项:
1、lvs类型:
-g: gateway, dr类型
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重;
2、清空定义的所有内容:
ipvsadm -C
3、 查看:
ipvsadm -L|l [options]
--numeric, -n:numeric output of addresses and ports#数字格式显示地址和端口,不要反解
--exact:expand numbers (display exact values)#精确显示计数器的值
--connection, -c:output of current IPVS connections#当前活动和非活动连接
--stats:output of statistics information#统计数据
--rate :output of rate information#速率
4、保存和重载:
ipvsadm -S = ipvsadm-save#保存
ipvsadm -R = ipvsadm-restore#重载
五、设计与实现
1、负载均衡集群设计时要注意的问题:
- (1) 是否需要会话保持;
- (2) 是否需要共享存储;
- 共享存储:NAS, SAN, DS(分布式存储)
2、设计要点和环境:
设计要点:
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP;
(2) 支持端口映射;
(3) Director要打开核心转发功能;
集群环境
实验环境 四台centos7虚拟机,分别是vs调度器、rs1后端服务器、rs2后端服务器、client客户端
服务器ip
rs1和rs2分别关闭防火墙,安装httpd和telnet-server,更改ip地址,网关指向vs调度服务器的DIP网卡172.16.1.254
配置测试页面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服务器
<h1>RS1 172.16.1.11</h1>
[root@rs1 ~]#systemctl start httpd
[root@rs2 ~]# vim /var/www/html/test.html#rs2服务器
<h1>RS2 172.16.1.12</h1>
[root@rs2 ~]#systemctl start httpd
并把虚拟机网络连接模式改成仅主机模式,来模拟内网环境。
rs服务器网卡改成仅主机模式
vs调度服务器配置:
关闭防火墙和selinux,添加一个网卡
添加一个网卡
[root@vs ~]# nmtui#设置网卡命令
[root@vs ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.254 netmask 255.255.255.0 broadcast 172.16.1.255
然后将ens37网卡设置成仅主机模式,使其与rs1、rs2同一网段:
设置新添加网卡也是仅主机模式
3、实现 LVS-NAT
[root@vs ~]# ipvsadm -A -t 192.168.1.6:80 -s rr #设置调度服务器规则,rr是轮询调度
[root@vs ~]# 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.1.6:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.11 -m#把rs1服务器加入规则里
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.12 -m#把rs1服务器加入规则里
[root@vs ~]# 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.1.6:80 rr
-> 172.16.1.11:80 Masq 1 0 0
-> 172.16.1.12:80 Masq 1 0 0
[root@vs ~]# sysctl -w net.ipv4.ip_forward=1#打开核心转发
net.ipv4.ip_forward = 1
客户端测试:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
vs服务器端:
[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s wrr#修改为加权轮询模式
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.12 -m -w 2#修改加权轮询
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.11 -m -w 3#修改加权轮询
[root@vs ~]# 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.1.6:80 rr
-> 172.16.1.11:80 Masq 3 0 5
-> 172.16.1.12:80 Masq 2 0 5
客户端测试:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s sh #把来自于同一地址的ip发往同一个rs服务器
[root@vs ~]# 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.1.6:80 32 192 128 16032 15424
-> 172.16.1.11:80 17 102 68 8517 8194
-> 172.16.1.12:80 15 90 60 7515 7230
[root@vs ~]# ipvsadm -ln -c#追踪访问源地址
IPVS connection entries
pro expire state source virtual destination
TCP 01:55 TIME_WAIT 192.168.1.10:34606 192.168.1.6:80 172.16.1.11:80
4、lvs-dr的实现:
image.pngdr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定;
(2) 在各RS使用arptables;
(3) 在各RS修改内核参数,来限制arp响应和通告的级别;
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
限制通告级别:arp_announce
0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
1:尽量避免向非直接连接网络进行通告;
2:必须避免向非本网络通告;
- rs1和rs2分别关闭防火墙,安装httpd和telnet-server,更改ip地址,网关指向路由器。
rs1服务器配置
配置测试页面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服务器
<h1>RS1 172.16.1.11</h1>
[root@rs1 ~]# vim /var/www/html/phpinfo.php
<h1>RS1</h1>#rs1php测试信息页
<?php
phpinfo();
?>
[root@rs1 ~]# vim setparam.sh#编辑脚本
#!/bin/bash
#
vip=192.168.1.99
mask='255.255.255.255'
case $1 in
start)#开始设置值
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0#设置本地地址广播
;;
stop)#停止还原成0值
ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)#其他
echo "Usage $(basename $0) start|stop"
exit 1
;;
esac
[root@rs1 ~]# bash -n setparam.sh #检查脚本语法
[root@rs1 ~]# bash -x setparam.sh start#启动脚本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0
[root@rs1 ~]# scp setparam.sh 192.168.1.12:/tmp#把脚本传给rs2服务器
[root@rs1 ~]#systemctl start httpd
rs2服务器配置
[root@rs2 ~]# vim /var/www/html/test.html#rs2服务器
<h1>RS2 172.16.1.12</h1>
[root@rs2 ~]# vim /var/www/html/phpinfo.php
<h1>RS2</h1>#rs2php测试信息页
<?php
phpinfo();
?>
[root@rs2 ~]# cd /tmp
[root@rs2 tmp]# ls
setparam.sh
[root@rs2 tmp]# bash -x setparam.sh start#执行脚本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0
[root@rs2 ~]#systemctl start httpd
设置vs调度服务器:
[root@vs ~]# ifconfig ens33:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up#设置广播地址
[root@vs ~]# ifconfig
.......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99
ether 00:0c:29:8e:29:6a txqueuelen 1000 (Ethernet)
......
[root@vs ~]# yum -y install ipvsadm#安装lvs
[root@vs ~]# ipvsadm -A -t 192.168.1.99:80 -s rr#设定轮询规则
[root@vs ~]# 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.1.99:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.11 -g#给规则加入rs1服务器
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -g#给规则加入rs2服务器
[root@vs ~]# 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.1.99:80 rr
-> 192.168.1.11:80 Route 1 0 0
-> 192.168.1.12:80 Route 1 0 0
客户端测试:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.99/test.html;done
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
php测试1
php测试2
访问测试页1
访问测试页2
网友评论