ipvsadm讲解

ipvsadm 的用法和格式如下:

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p

[timeout]] [-M netmask]

ipvsadm -D -t|u|f virtual-service-address

ipvsadm -C

ipvsadm -R

ipvsadm -S [-n]

ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port

[-g|i|m] [-w weight]

ipvsadm -d -t|u|f service-address -r server-address

ipvsadm -L|l [options]

ipvsadm -Z [-t|u|f service-address]

ipvsadm --set tcp tcpfin udp

ipvsadm --start-daemon state [--mcast-interface interface]

ipvsadm --stop-daemon

ipvsadm -h

命令选项解释:

有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可

以。

-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也

就是增加一台新的虚拟服务器。

-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。

-C --clear 清除内核虚拟服务器表中的所有记录。

-R --restore 恢复虚拟服务器规则

-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式

-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器

记录。也就是在一个虚拟服务器中增加一台新的真实服务器

-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录

-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l --list 显示内核虚拟服务器表

-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)

--set tcp tcpfin udp 设置连接超时值

--start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说

明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的

VRRP 功能。

--stop-daemon 停止同步守护进程

-h --help 显示帮助信息

其他的选项:

-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务

[vip:port] or [real-server-ip:port]

-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务

[vip:port] or [real-server-ip:port]

-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。

-s --scheduler scheduler 使用的调度算法,有这样几个选项

rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,

默认的调度算法是: wlc.

-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客

户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。

-M --netmask netmask persistent granularity mask

-r --real-server server-address 真实的服务器[Real-Server:port]

-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)

-i --ipip 指定LVS 的工作模式为隧道模式

-m --masquerading 指定LVS 的工作模式为NAT 模式

-w --weight weight 真实服务器的权值

--mcast-interface interface 指定组播的同步接口

-c --connection 显示LVS 目前的连接 如:ipvsadm -L -c

--timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout

--daemon 显示同步守护进程状态

--stats 显示统计信息

--rate 显示速率信息

--sort 对虚拟服务器和真实服务器排序输出

--numeric -n 输出IP 地址和端口的数字形式



使用VS/TUN方法:

  VS/TUN的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

使用VS/DR方法:

    调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB相连。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

LVS-DR模型:

  Director两个地址:VIP, DIP

  RS有两个地址:VIP, RIP(RIP可是用来和DIP通信的,由Directory挑选出RealServer时将报文所对的目标MAC改                                                     为RIP所对应的MAC地址)

禁止RS响应对VIP的ARP广播请求:

1、在前端路由上实现静态MAC地址VIP的绑定;

前提:得有路由器的配置权限;

缺点:Directory故障转时,无法更新此绑定;

2、arptables

前提:在各RS在安装arptables程序,并编写arptables规则

缺点:依赖于独特功能的应用程序

3、修改Linux内核参数

前提:RS必须是Linux;

缺点:适用性差;


两个参数:

arp_announce:定义通告模式

arp_ignore:定义收到arp请求的时响应模式

配置专用路由,以使得响应报文首先通过vip所配置的lo上的别名接口

arp_ignore:定义对目标地址为本地IPARP询问不同的应答模式

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 

2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 

3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 

4-7 - 保留未使用 

8 -不回应所有(本地地址)的arp查询

有关arp_announce的相关介绍:

arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口 

0 - (默认在任意网络接口(eth0,eth1lo)上的任何本地地址 

1 -尽量避免不在该网络接口子网段的本地地址做出arp回应当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理

2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

关于对arp_announce 理解的一点补充

其实就是路由器的问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话),当内网的机器要发送一个到外部的ip包,那么它就会请求 路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面 的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。  

arp缓存为什么会更新了,什么时候会更新呢,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自 己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。  

在设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址

1)vip(virtual ip)。直接路由模式的vip必须跟服务器对外提供服务的ip地址在同一个网段,并且lvs 负载均衡器和其他所有提供相同功能的服务器都使用这个vip;

2)vip被绑定在环回接口lo0:0上,其广播地址是其本身,子网掩码是255.255.255.255。这与标准的网络地址设置有很大的不同。采用这种可变长掩码方式把网段划分成只含一个主机地址的目的是避免ip地址冲突;

3)echo这段的作用是抑制arp广播。如果不做arp抑制,将会有众多的机器向其他宣称:“嗨!我是奥巴马,我在这里呢!”,这样就乱套了。





LVS-DR模型的实现过程:



1.首先规划集群和网路环境,需要三台虚拟机,如下图所示:


此时Director可以只有一个网卡Eth0,连接类型为桥接(Birdged),RealServer1RealServer2 的网卡连接类型也都为桥接(Birdged):

wKioL1O_OVTQM0V7AAD55mTSJmY815.jpg

realserve1服务器上进行配置:


# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore


# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore


# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce


# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce


#ifconfig lo:0 172.16.24.7 broadcast 172.16.24.7 netmask 255.255.255.255 up


#route add -host 172.16.24.7 dev lo:0




realserve2服务器上进行配置:


# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore


# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore


# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce


# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce


#ifconfig lo:0 172.16.24.7 broadcast 172.16.24.7 netmask 255.255.255.255 up


#route add -host 172.16.24.7 dev lo:0


Director服务器上配置:


#ifconfig eth0:0 172.16.24.7 broadcast 172.16.24.7 netmask 255.255.255.255 up


#route add -host 172.16.24.7 dev eth0:0


#echo 1 > /proc/sys/net/ipv4/ip_forward   --开启IP转发功能


让两个RealServer的WEB服务启动起来

[root@node1 ~]# rpm -q httpd

httpd-2.2.15-29.el6.centos.x86_64

如果没有安装则使用yum install httpd安装即可

[root@node2 ~]# vim /var/www/html/index.html

<h1>Web1</h1>

[root@node2 ~]# service httpd start


[root@node3 ~]# vim /var/www/html/index.html

<h1>Web2</h1>

[root@node3 ~]# service httpd start

安装ipvsadm(如果已安装可忽略)

[root@node1 ~]#yum install ipvsadm

Director上配置ipvsadm规则

#ipvsadm -A -t 172.16.24.7:80 -s rr -g


#ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.8


#ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.9




 为了保证其时效性,Hash table中“连接追踪”信息被定义了“生存时间”。LVS为记录“连接超时”定义了三个计时器:

1、空闲TCP会话;

2、客户端正常断开连接后的TCP会话;

3、无连接的UDP数据包(记录其两次发送数据包的时间间隔);

上面三个计时器的默认值可以由类似下面的命令修改,其后面的值依次对应于上述的三个计时器:

# ipvsadm --set 28800 30 600


   数据包在由Direcotr发往Realserver时,只有目标MAC地址发生了改变(变成了Realserver的MAC地址)。Realserver在接收到数据包后会根据本地路由表将数据包路由至本地回环设备,接着,监听于本地回环设备VIP上的服务则对进来的数据库进行相应的处理,而后将处理结果回应至RIP,但数据包的原地址依然是VIP。

ipvs的持久连接:

   无论基于什么样的算法,只要期望源于同一个客户端的请求都由同一台Realserver响应时,就需要用到持久连接。比如,某一用户连续打开了三个telnet连接请求时,根据RR算法,其请求很可能会被分配至不同的Realserver,这通常不符合使用要求。

Persistent Client Connections(PCC),将来自于同一个客户端发往VIP的所有请求统统定向至同一个RS,持久客户端连接:就是不管客户端发起什么样的服(80端口的web服务,3306端口的mysql服务)请求,都将经过Director被定位到同一个特定的real server上,只要此real server 提供了这种服务,并且会持续连接,如果客户端连接超时,real server允许一定范围内的

前面的配置步骤都一样,只是在Director上配置ipvsadm规则有些不同

ipvsadm -A -t 172.16.24.7:0 -s rr -p 120

ipvsadm -a -t 172.16.24.7:0 -r 172.16.24.8 -g

ipvsadm -a -t 172.16.24.7:0 -r 172.16.24.9 -g



  Persistent Port Connections(PPC),将来自于一个客户端发往某VIP的某端口的所有请求统统定向至同一个RS,持续端口连接:就是不管客户端发起什么样的端口请求(80端口,是提供web服务的,23端口,是提供telnet服务) 都会经过 Director 将请求转发到同一个 real server  , 并持续连接。假如一个客户端请求的是 web 服务,相应的是 realserver1 ,当此用户退出后再次发起请求 web 服务的时候, 依然是 realserver1 提供的 web 服务。

持久连接ppc的效果

前面的配置步骤都一样,只是在Director上配置ipvsadm规则有些不同

ipvsadm -A -t 172.16.24.7:80 -s rr

ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.8 -g

ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.9 -g

ipvsadm -E -t 172.16.24.7:80 -s rr -p 120


PFMC: 端口绑定,port affinity基于防火墙标记,将两个或以上的端口绑定为同一个服务80端口和443 端口做成一个持久防火墙标记,同时定向到同一个realserver上,即在访问80服务的时候是realserver1然后改为访问443服务的时候依然定向到realserver1上。

前面的配置步骤都一样,只是在Director上配置ipvsadm规则有些不同

iptables -t mangle -A PREROUTING -d 172.16.24.7 -p tcp --dport 80 -j MASK --set-make 10

iptables -t mangle -A PREROUTING -d 172.16.24.7 -p tcp --dport 443 -j MASK --set-make 10

ipvsadm -A -f 10 -s rr

ipvsadm -a -f 10 -r 172.16.24.8 -g

ipvsadm -a -f 10 -r 172.16.24.9 -g

可以通过浏览器输入自己定义的地址检测一下。看看是什么效果。



你可能感兴趣的:(ipvsadm,群集)