LVS-NAT、LVS-DR的工作原理并实现配置

一、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.png
dr模型中,各主机上均需要配置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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容