学习lvs+keepalived必须阅读的三个文档。html
一、 《keepalived权威指南》linux
二、 《lvs手册》算法
三、 《Red_Hat_Enterprise_Linux-5-Virtual_Server_Administration-zh-CN》后端
这三个文档是官方文档,介绍了大部分原理和基础知识。下面我主要记录一些使用的案例,方便查阅。bash
他们负责什么工做?服务器
在lvs+keepalived环境里面,lvs主要的工做是提供调度算法,把客户端请求按照需求调度在real服务器,keepalived主要的工做是提供lvs控制器的一个冗余,而且对real服务器作健康检查,发现不健康的real服务器,就把它从lvs集群中剔除,real服务器只负责提供服务。架构
环境规划app
2*(lvs+keepalived服务器)+n*real-server,通常lvs+keepalived是这样的架构。ssh
开始安装tcp
一、 下载软件包
在http://www.linuxvirtualserver.org/ 下载lvs的软件包
在http://www.keepalived.org/ 下载keepalived软件包
二、先编译安装lvs,再安装keepalived,安装lvs须要内核源码
下载lvs源码的时候,必定要选择你内核版本对应的源码包。
# uname -r 2.6.18-164.el5PAE #yum install kernel-devel -y //安装内核源码包 #ln -s /usr/src/kernels/2.6.18-164.el5PAE-i686/ /usr/src/linux #wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz // ipvsadm包就是lvs软件包,别以为名字不同 # tar -zxvf ipvsadm-1.24.tar.gz # cd ipvsadm-1.24 #make && make install
检查lvs是否安装成功:
#ipvsadm //查看是否有输出
#lsmod | grep ip_vs //若是ipvsadm有输出,那么使用这个命令查看是否加载ip_vs模块,若是加载,那么lvs算安装成功。
二、 编译安装keepalived,必定在安装完lvs之后在安装keepalive
#wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz //不建议选择最新的版本 #tar -zxvf keepalived-1.1.15.tar.gz #cd keepalived-1.1.15 #./configure --prefix=/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/linux/ Keepalived version : 1.1.15 Compiler : gcc Compiler flags : -g -O2 Extra Lib : -lpopt -lssl -lcrypto Use IPVS Framework : Yes IPVS sync daemon support : Yes Use VRRP Framework : Yes Use LinkWatch : No Use Debug flags : Nod
看见如上输入,注意yes和no的值,若是同样,证实配置成功,若是lvs为no,那么证实你的lvs没有安装成功,须要重新安装lvs再安装keepalived。
#make && make install
若是没有报错,那么就安装成功了,检查一下是否生成了keepalived命令。
环境介绍
主机IP |
角色 |
安装软件 |
122.225.32.134 |
Lvs+keepalived MASTER |
Ipvsadm keepalived |
122.225.32.135 |
Lvs+keepalived BACKUP |
Ipvsadm keepalived |
122.225.32.136 |
Real server |
Lvs_real脚本 |
122.225.32.137 |
Real server |
Lvs_real脚本 |
122.225.32.142 |
VIP |
注意:全部机器都在一个交换机,而且在一个网段。
1、在134和135上安装ipvsadm和keepalived软件。
2、修改keepalived的配置文件
122.225.32.134:
# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { lr@isadba.com } notification_email_from lvs@isadba.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 122.225.32.142 } } virtual_server 122.225.32.142 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 0 //此值为0,主要是为了方便测试,每次刷新页面结果会不同 protocol TCP real_server 122.225.32.136 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 122.225.32.137 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
122.225.32.135:
和122.225.32.134相比,值须要删除state MASTER 和 修改priority的值小于master的。
real server:
在全部real server上添加下面脚本,名执行# cat /sbin/lvs_real
#!/bin/bash #description:start realserver vip=122.225.32.157 source /etc/rc.d/init.d/functions case $1 in start) echo "Start Realserver" /sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce ;; stop) echo "Stop Realserver" /sbin/ifconfig lo:0 down echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage: $0 (start | stop)" exit 1 esac
执行脚本之后,使用ip add命令查看lo接口是否添加了虚拟ip地址。
固然,real server上面须要安装http服务,并启动,在index.html里面添加本身的IP地址,方便客户端访问时候辨别访问的是哪一个主机。
3、配置完成之后,开始测试:
在122.225.32.134和122.225.32.135上使用ip add检查,虚拟IP应该配置在134上面。
测试1{主要测试lvs}:访问虚拟IP是否能够访问真实服务器,是否轮询real server
在master上使用 ipvsadm命令查看lvs状态。
# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 122.225.32.142:http rr -> 122.225.32.137:http Route 1 0 0 -> 122.225.32.136:http Route 1 0 0
在客户端访问虚拟IP 122.225.32.142,看是否能够访问。每次刷新,应该会换一个real server。访问数次后,经过ipvsadm观察lvs状态。
# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 122.225.32.142:http rr -> 122.225.32.137:http Route 1 0 6 -> 122.225.32.136:http Route 1 0 6
测试2{主要测试keepalived}:lvs服务器的HA,当keepalived master挂掉后,keepalived backup会不会接管虚拟IP。
关闭master主机上的keepalived进程。
在backup上ip add查看是否添加虚拟IP,经过/var/log/message查看相关转换日志。
测试3{测试backup的lvs}:使用客户端访问如今虚拟ip,查看是否一切正常
测试完成后,开启master的keepalived进程,等虚拟ip转移到master之后,在从客户端访问,查看是否存在问题。
环境介绍
主机IP |
角色 |
安装软件 |
122.225.32.134 |
Lvs+keepalived MASTER |
Ipvsadm keepalived |
122.225.32.135 |
Lvs+keepalived BACKUP |
Ipvsadm keepalived |
122.225.32.155 |
Real server |
|
122.225.32.156 |
Real server |
|
122.225.32.142 |
VIP |
注意:虚拟ip,master和backup在赞成网段和交换机,realserver在不一样网段,可是同属于外网IP
1、在134和135上安装ipvsadm和keepalived软件。
2、修改keepalived的配置文件
122.225.32.134:
# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { lr@isadba.com } notification_email_from lvs@isadba.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 122.225.32.142 } } virtual_server 122.225.32.142 80 { delay_loop 6 lb_algo rr lb_kind TUN nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 122.225.32.155 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 122.225.32.156 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
122.225.32.135:
和122.225.32.134相比,值须要删除state MASTER 和 修改priority的值小于master的。
real server:
在全部real server上添加下面脚本,名执行。
# cat /sbin/lvs_real_tun #!/bin/sh # description: Config realserver tunl port and apply arp patch VIP=122.225.32.142 . /etc/rc.d/init.d/functions case $1 in start) echo "Tunl port starting" ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up /sbin/route add -host $VIP dev tunl0 echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce sysctl -p ;; stop) echo "Tunl port closing" ifconfig tunl0 down echo "1" > /proc/sys/net/ipv4/ip_forward echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage: $0" {start|stop} exit 1 esac
3、配置完成之后,开始测试:
测试方法和DR方法同样。
环境介绍
主机IP |
角色 |
安装软件 |
122.225.32.134 |
Lvs+keepalived MASTER |
Ipvsadm keepalived |
122.225.32.135 |
Lvs+keepalived BACKUP |
Ipvsadm keepalived |
10.1.1.9 |
Real server |
Lvs_real脚本 |
10.1.1.10 |
Real server |
Lvs_real脚本 |
122.225.32.142 |
VIP eth0 |
外网虚拟IP |
10.1.1.118 |
VIP eth1 |
内网虚拟IP |
注意:全部机器都在一个交换机,而且在一个网段,LVS服务器端最好开启数据包转发net.ipv4.ip_forward。
1、在134和135上安装ipvsadm和keepalived软件。
2、修改keepalived的配置文件
注意:这里因为须要内外网IP的同时漂移,因此须要用到vrrp同步组,而且须要同时开启两个vrrp实例。
122.225.32.134:
通过上面的配置,你们应该比较熟悉了,相对于TUN和DR模式,NAT的配置文件主须要作一下修改。
! Configuration File for keepalived global_defs { notification_email { lr@isadba.com } notification_email_from lvs@isadba.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_sync_group G1 { group { VI_1 VI_2 } } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 122.225.32.142 } } vrrp_instance VI_2 { state MASTER interface eth1 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.1.1.118 } } virtual_server 122.225.32.142 80 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 10.1.1.251 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.1.1.8 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
122.225.32.135:
和122.225.32.134相比,值须要删除state MASTER 和 修改priority的值小于master的。
real server:
10.1.1.9和10.1.1.10的网关须要指定的lvs的内网虚拟IP也就是10.1.1.118,不须要其余设置。
keepalived对lvs的real server检测方式主要有如下几种,HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK.
其中TCP_CHECK是最经常使用的方式,通常内容在keepalived手册中均可以查到,值得提一下的就是关于digest和genhash的用法。
HTTP_GET | SSL_GET { url { path / digest <string> ##genssh工具算出的。 status_code 200 } connect_port 80 bindto <IPADD> connect_timeout 10 nb_get_retry 3 delay_before_retry 2 }
这里须要注意的就是digest的值如何算,通常在安装keepalived后,会生成一个genhash的工具。
可使用
#genhash -h 查看帮助
常见的使用方法以下
# genhash -s 10.1.1.8 -p 80 -u index.html 若是你是ssl链接,须要加 -S 参数,算出的值贴到配置文件中就能够了。
1、LVS持久链接技术
lvs的持久性链接有两方面。
一、把同一个client的请求信息记录到lvs的hash表里,保存时间使用persistence_timeout控制,单位为秒。persistence_granularity 参数是配合persistence_timeout的,在某些状况特别有用,他的值是子网掩码,表示持久链接的粒度,默认是255.255.255.255,也就是单独的client ip,若是改为,255.255.255.0就是client ip一个网段的都会被分配到同一个real server。
二、一个链接建立后空闲时的超时时间,这个时间为3种
a、tcp的空闲超时时间
b、lvs收到客户端tcp fin的超时时间
c、udp的超时时间
如何查看这些值?
# ipvsadm //能够查看链接空闲的超时时间,红色标记。
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 122.225.32.142:http rrpersistent 10
-> 122.225.32.137:http Route 1 0 1
-> 122.225.32.136:http Route 1 0 0
# ipvsadm -l –timeout //查看tcp tcpfin udp的超时时间
Timeout (tcp tcpfin udp): 900 120 300
他们是如何工做的?
咱们经过
# ipvsadm -Lcn
IPVS connection entries
pro expire state source virtual destination
TCP 00:57 NONE 110.184.96.173:0 122.225.32.142:80 122.225.32.136:80
TCP 01:57 FIN_WAIT 110.184.96.173:54568 122.225.32.142:80 122.225.32.136:80
当一个client访问vip的时候,ipvs或记录一条状态为NONE的信息,红色的值的初始值是persistence_timeout的值,而后根据时钟主键变小,在如下记录存在期间,同一client ip链接上来,都会被分配到同一个后端。
FIN_WAIT的值就是tcp tcpfin udp的超时时间,当NONE的值为0时,若是FIN_WAIT还存在,那么NONE的值会重新变成60秒,再减小,直到FIN_WAIT消失之后,NONE才会消失,只要NONE存在,同一client的访问,都会分配到统一real server。
如何设置这些值?
persistence_timeout能够经过如下两种方法设置
一、 ipvsadm -A -t 192.168.20.154:80 -s rr -p 60
注意:上面命令中红色标记的80端口,表示同一客户端访问服务器的80端口,会被定义到同一个real server,若是把80端口改成0,那么同一客户端访问服务器的任何服务都会被转发到同一real server。
二、修改keepalived配置文件在虚拟服务器配置下面加入 persistence_timeout 60
tcp tcpfin udp的配置
#ipvsadm –set tcp tcpfin udp
# ipvsadm –set 120 50 50 //实例
建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算。
lvs持久性参考资料:
http://www.linuxvirtualserver.org/docs/persistence.html
2、防火墙标记
http://lymrg.blog.51cto.com/1551327/684681
3、conn_syncd
lvs负载调度器在进行切换的时候,仍是会影响服务的,由于备用的调度器上没有已经创建的链接信息,当这些已经创建的链接经过备用的调度器的时候,链接会被reset掉,从而致使链接中断,这个时候就该conn_syncd上场了。详细信息请参见(http://www.linuxvirtualserver.org/docs/sync.html),lvs中文手册也提到过这个问题。
解决方案:
Here is simple intructions to use IPVS connection synchronization. On the primary load balancer, run #ipvsadm --start-daemon=master --mcast-interface=eth0 On the backup load balancers, run #ipvsadm --start-daemon=backup --mcast-interface=eth0 To stop the daemon, run #ipvsadm --stop-daemon
注意:这个命令须要手工启用,而且若是主lvs挂掉,切换到备用的时候,链接信息是同步的,可是主恢复,抢占vip后,链接信息是不会被反同步回去的。配置不抢占是使用nopreempt,只能配置在backup状态的主机,而且优先级必须比另一台高,也就是配置在主lvs上,可是主lvs不能配置state master值。
可使用lvs-rrd工具和cacti来监控,具体请google。