1 Keepalived介绍
Keepalived软件主要是通过VRRP协议实现高可用功能的。
三个重要功能:
1、管理LVS负载均衡软件
2、实现对LVS集群节点健康检查功能(healthcheck)
3、作为系统网络服务的高可用功能
1)VRRP(Virtual Router Redundancy Protocol),为了解决静态路由的单点故障问题而出现
2)VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的
3)VRRP是用IP组播的方式(224.0.0.18)实现高可用对之间的通信
4)工作时主节点发包,备节点接包,当备节点收不到主节点的数据包时,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级来竞选
5)VRRP使用了加密协议加密数据,但Keepalived推荐用明文的方式配置认证类型和密码
2 Keepalived高可用服务搭建准备
安装环境说明
1、4台服务器:lb01、lb02、web01、web02
2、系统环境:
[root@lb01 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@lb01 ~]# uname -r 2.6.32-431.el6.x86_64 [root@lb01 ~]# ls -l /application/nginx/ 总用量 36 drwx------ 2 nginx root 4096 6月 28 2017 client_body_temp drwxr-xr-x 3 root root 4096 3月 28 00:24 conf drwx------ 2 nginx root 4096 6月 28 2017 fastcgi_temp drwxr-xr-x 2 root root 4096 6月 28 2017 html drwxr-xr-x 2 root root 4096 5月 1 18:07 logs drwx------ 2 nginx root 4096 6月 28 2017 proxy_temp drwxr-xr-x 2 root root 4096 6月 28 2017 sbin drwx------ 2 nginx root 4096 6月 28 2017 scgi_temp drwx------ 2 nginx root 4096 6月 28 2017 uwsgi_temp
开始安装keepalived软件
yum install keepalived –y [root@lb01 ~]# rpm -qa keepalived keepalived-1.2.13-5.el6_6.x86_64 [root@lb02 ~]# rpm -qa keepalived keepalived-1.2.13-5.el6_6.x86_64 启动keepalived /etc/init.d/keepalived start [root@lb01 ~]# ps -ef|grep keep|grep -v grep root 1855 1 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 1857 1855 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 1858 1855 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D [root@lb02 ~]# ps -ef|grep keep|grep -v grep root 2118 1 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 2120 2118 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 2121 2118 0 20:53 ? 00:00:00 /usr/sbin/keepalived –D 默认情况下会启动三个VIP地址 [root@lb01 ~]# ip addr|grep 192.168 inet 192.168.4.125/24 brd 192.168.4.255 scope global eth0 inet 192.168.200.16/32 scope global eth0 inet 192.168.200.17/32 scope global eth0 inet 192.168.200.18/32 scope global eth0 测试完成后,关闭服务 [root@lb01 ~]# /etc/init.d/keepalived stop
Keepalived配置文件说明
1)全局定义部分
[root@lb01 ~]# ll /etc/keepalived/keepalived.conf -rw-r--r-- 1 root root 3562 3月 19 2015 /etc/keepalived/keepalived.conf [root@lb01 ~]# head -13 /etc/keepalived/keepalived.conf |cat -n 1 ! Configuration File for keepalived 2 3 global_defs { 4 notification_email { 5 [email protected] 6 [email protected] 7 [email protected] 8 } 9 notification_email_from [email protected] 10 smtp_server 192.168.200.1 11 smtp_connect_timeout 30 12 router_id LVS_DEVEL 13 }
参数说明:
1行,注释
2行 空行
3~8行是定义服务故障报警的Email地址
9行,指定发送邮件的发送人
10行smtp_server指定发送邮件的smtp服务器
11行 连接smtp的超时时间
12行 是keepalived服务器的路由标识。在一个局域网内,这个标识应该是唯一
2)VRRP实例定义区块部分
[root@lb01 ~]# head -30 /etc/keepalived/keepalived.conf |cat -n|tail -16 15 vrrp_instance VI_1 { 16 state MASTER 17 interface eth0 18 virtual_router_id 51 19 priority 100 20 advert_int 1 21 authentication { 22 auth_type PASS 23 auth_pass 1111 24 } 25 virtual_ipaddress { 26 192.168.200.16 27 192.168.200.17 28 192.168.200.18 29 } 30 }
15行定义一个实例名字
16行 当前实例VI_1的角色状态,为MASTER
17行 网络接口
18行virtual_router_id为虚拟路由ID标识,MASTER和BACKUP必须一致
19行 优先级,数字越大越高
20行 同步通知间隔 目前为1秒
21~24权限认证配置
25~29 为虚拟IP地址
keepalived高可用服务单实例实战
主服务器
[root@lb01 keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } 配置完毕,启动服务,查看是否有虚拟IP [root@lb01 keepalived]# /etc/init.d/keepalived start 正在启动 keepalived: [确定] [root@lb01 keepalived]# ip add |grep 192.168.4.130 inet 192.168.4.130/24 scope global secondary eth0:1
备服务器
[root@lb02 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } 启动服务,检查是否有虚拟IP [root@lb02 keepalived]# /etc/init.d/keepalived start 正在启动 keepalived: [确定] [root@lb02 keepalived]# ip add|grep 192.168.4.130 [root@lb02 keepalived]#
备节点没有虚拟IP,表示配置正确
如果主备都出现了虚拟IP,说明高可用裂脑了,检查:
1、主备之间是否通信正常,若不正常是否有防火墙阻挡
2、主备对应的keepalived.conf配置是否有误,virtual_router_id配置不一致
3、硬件故障:心跳线坏了、网卡坏了、IP配置冲突等
进行高可用主备之间的切换实验
[root@lb01 keepalived]# /etc/init.d/keepalived stop 停止 keepalived: [确定] [root@lb02 keepalived]# ip add|grep 192.168.4.130 inet 192.168.4.130/24 scope global secondary eth0:1 [root@lb01 keepalived]# /etc/init.d/keepalived start 正在启动 keepalived: [确定] [root@lb01 keepalived]# ip add|grep 192.168.4.130 inet 192.168.4.130/24 scope global secondary eth0:1 [root@lb02 keepalived]# ip add|grep 192.168.4.130
nginx负载均衡配合keepalived服务
主备的负载均衡配置一致
[root@lb01 ~]# cat /application/nginx/conf/extra/lb_bbs.conf server { listen 192.168.4.130:80; server_name bbs.etiantian123.org; location / { proxy_pass http://bbs_server_pools; proxy_set_header Host $host; } } [root@lb01 ~]# cat /application/nginx/conf/nginx.conf worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; upstream bbs_server_pools{ server 192.168.4.121:80 weight=1; server 192.168.4.122:80 weight=1; } #include extra/lb_www.conf; include extra/lb_bbs.conf; include extra/lb_blog.conf; }
解决监听的网卡上不存在IP地址的问题
nginx配置监听的时候,如果本地的网卡没有这个监听的地址,可能会报错
解决:
在/etc/sysctl.conf加入内核参数配置:
net.ipv4.ip_nonlocal_bind = 1
解决高可用只针对物理服务器的问题
如果nginx服务出现问题停止而keepalived服务还在工作,这就会导致用户访问的VIP无法找到对应的服务。
解决办法:
1、写脚本检查
[root@lb01 scripts]# cat check_nginx.sh #!/bin/sh while true do if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done
2、可以使用keepalived的配置文件参数触发写好的监测服务脚本
[root@lb01 scripts]# cat chk_nginx_proxy.sh #!/bin/sh if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi [root@lb01 scripts]# chmod +x chk_nginx_proxy.sh
此时keepalived的完整配置为:
[root@lb01 keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 } vrrp_script chk_nginx_proxy { 《===定义vrrp脚本,检测http端口 script “/server/scripts/chk_nginx_proxy.sh” 《===执行脚本,当nginx服务有问题,停掉keepalived服务 interval 2 《====间隔2秒 weight 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } track_script { chk_nginx_proxy 《====触发检查 } }
解决多组keepalived服务器在一个局域网的冲突问题
global_defs { router_id lb01 vrrp_mcast_group4 224.0.0.19 <===这个就是指定组播地址的配置 }
配置指定文件接受keepalived服务日志
默认情况下keepalived会输出到系统日志/var/log/messages
1)/etc/sysconfig/keepalived第14行KEEPALIVED_OPTIONS="-D"修改为 KEEPALIVED_OPTIONS="-D –d –S 0" 2)修改rsyslog的配置文件 vi /etc/rsyslog.conf #keepalived local0.* /var/log/keepalived.log 3)完成后,重启rsyslog服务 /etc/init.d/rsyslog restart
监测keepalived裂脑的脚本
[root@lb02 ~]# cat /server/scripts/check_split_brain.sh #!/bin/sh lb01_vip=192.168.4.130 lb01_ip=192.168.4.125 while true do ping -c -W 3 $lb01_ip &>/dev/null if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ] then echo "ha is split brain.warning." else echo "ha is ok" fi sleep 5 done
3 LVS
LVS负载均衡集群介绍
负载均衡LB提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器带宽、增加吞吐量、加强网络数据能力、提高网络的灵活性和可用性。
搭建负载均衡服务的需求
1)把单点计算机无法承受的大规模并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应时间,提升用户体验。
2)单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅提高。
3)7*24的服务保证,任意一个或多个有限后面节点宕机,不会影响业务。
在负载均衡集群中,所有计算机节点都会提供相同的服务。集群负载均衡器截获所有对该服务器的入站请求。然后将这些请求尽可能地平均的在
所有集群节点上。
LVS(linux virtual server)
LVS是Linux Virtual Server的缩写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。
IPVS软件工作层次
LVS负载均衡调度技术是在内核层面完成的。
体系结构与工作原理简单描述
LVS集群负载均衡器接受服务的所有入站客户端的计算机请求,并根据调度算法决定那个集群节点应该处理回复请求。
负载均衡器(LB)有时也被称为LVS Direcotr。
LVS虚拟服务器的体系结构,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(load Balancer)。
负载调度器能无缝地将网络请求调度到真实的服务器上,从而使得服务器集群的结构对于客户是透明的,客户访问集群系统提供的网络服务就像
访问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。
LVS相关术语命名约定
名称 缩写 说明
虚拟IP地址(Virtual Ip Address) VIP Director用于向客户端计算机提高服务的IP地址。比如www.etiantian.org域名就要解析到VIP上。
真实IP地址(Real Server Ip Address) RIP 在集群下面节点上使用的IP地址。
Director的IP地址(Director Ip Address) DIP Director用于连接内外网络的IP地址,物理网卡上的IP地址。
客户端主机IP地址(Client Ip Address) CIP 客户端用于计算机请求集群服务的IP地址,该地址用作发送给集群的请求的源IP地址。
LVS负载均衡集群的3种工作模式介绍
1)NAT模式-网络地址转换
(Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时
报文的源地址被重写,在返回给客户端,完成整个负载调度过程。
提示:VS/NAT模式,很类似公路收费站,来去都要进过LB负载均衡器,通过修改目的地址,端口或源地址或源端口。(10-20台)
2)TUN模式-隧道模式
Virtual Server via IP Tunneling (VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。
为了解决这个问题,调度器把请求报文通过IP隧道(相当于ipip或ipsec)转发至真实服务器,而真实服务器将响应直接返
回给客户,这样调度器只处理请求报文。由于一般网络应答数据比请求报文大很多,采用VS/TUN技术后,集群系统的最大
吞吐量可以调高10倍。
3)DR模式-直接路由模式
Virtual Sever via Direct Routing (VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实的服务器,而请求发送到真实的服务器,而真实服务器将响应直接返回给客户。
同VS/TUN技术一样,VS/DR技术可极大的提高集群系统的伸缩性。这种方法没有IP隧道的开销,对于集群中真实服务器也没有必须支持
IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连接在统一服务网段上。
LVS的调度算法
LVS调度算法决定了如何在这些集群节点之间分布工作负荷。
当Director收到来自客户端的访问它VIP上的集群服务入站请求时,Director必须决定哪个集群节点应该获得请求。
Director可用于做出该决定的调度方法分为两个基本类别:
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr,SE,NQ
10种调度算法如下:
rr : 轮询调度(Round-Robin),它将请求一次分配不同的RS,也就是在RS中均摊请求。这种算法简单,但是只适合与RS处理
性能相差不大的情况。
wrr: 加权轮询调度(Weighted Round-Robin),它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到
的连接数将比权值较低的RS更多。相同权值的RS得到相同的连接数。
dh: 目的地址哈希调度(Destination Hashing)以目的地址为关键字查找一个静态的hash表来获得需要的RS。
sh: 源地址哈希调度(Source Hashing)以源地址为关键字查找一个静态hash表来获得需要的RS。
lc: 最小连接数调度(Least-Connection),IPVS表存储了所有的活动连接。把新的连接请求发送到当前连接数最小的RS。
wlc: 加权最小连接数调度(Weighted Least-Connection)假设各台RS的权值一次为Wi(l=1..n),当前的TCP连接数依次为
Ti(l=1..n),依次选取Ti/Wi为最小的RS作为下一个分的的RS。
lblcr:基于地址的最小连接数调度(Locality-Based Least-Connect)将来自同一目的地址的请求分配给同一台RS,如果这台服务器
尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首选考虑。
lblcr: 基于地址带重复最小连接数调度(Locality-Based Least-Connection with Replication)对于某一目的地址,对应有一个
RS子集。对此地址请求,为它分配子集中连接数最小RS;如果子集中所有服务器均已满负荷,则从集群选择一个连接数较小服
务器。将它加入到此子集并分配连接;若一定时间内,未被做任何修改,则将子集中负载最大的节点从子集删除。
LVS的调度算法和生产环境选型
一般的网络服务,如HTTP、Mail、MySQL等,常用的调度算法为:
1)基本轮询调度rr算法 2)加权最小连接调度wlc 3)加权轮询调度wrr算法。
基于局部性的最小连接LBLC和带复制的基于局部性最少连接LBLCR主要适用web和Cache集群。
源地址散列调度和目标地址散列可以结合适用在防火墙集群中,他们可以保证整个系统的唯一出入口。最短预期延迟调度SED和不排列调度
NQ主要是对处理时间相对比较长的网络服务。
LVS DR模式具体的调度原理过程:
安装LVS
1、下载相关软件包
[root@lb01 tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
2、安装LVS命令
查看是否存在LVS
[root@lb01 tools]# lsmod |grep ip_vs
检查系统内核版本
[
root@lb01 tools]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@lb01 tools]# uname -r 2.6.32-431.el6.x86_64
做个软链接
[root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64 drwxr-xr-x. 22 root root 4096 5月 20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64 [root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64 /usr/src/linux drwxr-xr-x. 22 root root 4096 5月 20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64 lrwxrwxrwx 1 root root 39 5月 1 17:34 /usr/src/linux -> /usr/src/kernels/2.6.32-431.el6.x86_64
编译安装
[root@lb01 tools]# tar zxf ipvsadm-1.26.tar.gz [root@lb01 tools]# cd ipvsadm-1.26 [root@lb01 ipvsadm-1.26]# make [root@lb01 ipvsadm-1.26]# make install
如果出现报错,可能是由于缺少3个组件popt-devel,popt-static,libnl-devel,yum安装即可
[root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs
安装完成后并没有加载到内核
启动LVS
[root@lb01 ipvsadm-1.26]# /sbin/ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs ip_vs 125220 0 libcrc32c 1246 1 ip_vs ipv6 317340 275 ip_vs
配置LVS虚拟IP
[root@lb01 ~]# ifconfig eth0:127 192.168.4.127 netmask 255.255.255.0 [root@lb01 ~]# ifconfig eth0:127 eth0:127 Link encap:Ethernet HWaddr 00:0C:29:06:6E:89 inet addr:192.168.4.127 Bcast:192.168.4.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 手工执行配置添加LVS服务 [root@lb01 ~]# ipvsadm -C [root@lb01 ~]# ipvsadm --set 30 5 60 [root@lb01 ~]# ipvsadm -A -t 192.168.4.127:80 -s wrr -p 20 [root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.122:80 -g -w 1 [root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.121:80 -g -w 1
查看配置及状态信息
[root@lb01 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.4.127:80 wrr persistent 20 -> 192.168.4.121:80 Route 1 0 0 -> 192.168.4.122:80 Route 1 0 0 [root@lb01 ~]# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.4.127:80 14 37 0 1892 0 -> 192.168.4.121:80 8 22 0 1128 0 -> 192.168.4.122:80 6 15 0 764 0
删除配置
[root@lb01 ~]# ipvsadm -D -t 192.168.4.127:80 [root@lb01 ~]# ipvsadm -d -t 192.168.4.127:80 -r 192.168.4.121:80
命令相关参数说明
--clear -C clear the whole table --add-service -A add virtual service with options --tcp-service -t service-address service-address is host[:port] --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq --add-server -a add real server with options --real-server -r server-address server-addres s is host(and port) --masquerading -m masquerading (NAT) --gatewaying -g gatewaying(direct routing)(default) --delete-server -d delete real server --persistent -p [timeout] persistent server(会话保持功能) --set tcp tcpfin udp set connection timeout values --weight -w weight capacity of real server [root@lb01 ~]# ipvsadm –help 《===更多命令帮助
手工在RS端绑定VIP
[root@lamp01 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up [root@lamp01 ~]# route add -host 192.168.4.127 dev lo [root@lnmp02 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up [root@lnmp02 ~]# route add -host 192.168.4.127 dev lo
手工在RS端抑制ARP响应
cat /proc/sys/net/ipv4/conf/lo/arp_ignore cat /proc/sys/net/ipv4/conf/all/arp_ignore cat /proc/sys/net/ipv4/conf/all/arp_announce cat /proc/sys/net/ipv4/conf/lo/arp_announce 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
最后浏览器访问VIP进行测试
LVS自动化脚本
ipvs_server
#!/bin/bash # function: # version:1.1 . /etc/init.d/functions VIP=192.168.4.127 SUBNET=eth0:`echo $VIP|cut -d. -f4` PORT=80 GW=192.168.4.1 #w=3 RIP1=( 192.168.4.121 ) #w=1 RIP2=( 192.168.4.122 ) IFCONFIG=/sbin/ifconfig ROUTE=/sbin/route IPVSADM=/sbin/ipvsadm ARPING=/sbin/arping #functions function usage (){ local script_name script_name=$1 echo "Usgae : $script_name [ start | stop | restart ]" echo "" return 1 } function checkCmd (){ if [ ! -f $1 ]; then echo "Can't find "$1 return 1 fi } function checkSubnet (){ $IFCONFIG |grep "$1"|wc -l } function ipvsStart (){ #judge if $SUBNET is exist. if [ $(checkSubnet $SUBNET) -ne 0 ]; then $IFCONFIG $SUBNET down fi local rs #$IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.255 up $IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up #$ROUTE add -host $VIP dev $SUBNET $IPVSADM -C $IPVSADM -A -t $VIP:$PORT -s wrr -p 60 for ((i=0; i<`echo ${#RIP1[*]}`; i++)) do $IPVSADM -a -t $VIP:$PORT -r ${RIP1[$i]}:$PORT -g -w 1 done for ((i=0; i<`echo ${#RIP2[*]}`; i++)) do $IPVSADM -a -t $VIP:$PORT -r ${RIP2[$i]}:$PORT -g -w 1 done rs=$? $IPVSADM >/tmp/wangxin.log # update MAC NetIf=$(echo ${SUBNET}|awk -F ":" '{print $1}') $ARPING -c 1 -I ${NetIf} -s $VIP $GW >>/tmp/wangxin.log [ $rs -eq 0 ] && action "Ipvsadm start." /bin/true return $rs } function ipvsStop (){ local rs rs=1 #clean ipvs $IFCONFIG $SUBNET down $IPVSADM -C $IPVSADM -Z rs=$? #$ROUTE del $VIP $ARPING -c 1 -I ${NetIf} -s $VIP $GW >/dev/null 2>&1 [ $rs -eq 0 ] && action "Ipvsadm stoped." /bin/true return $rs } main () { #judge argv num by wangxin if [ $# -ne 1 ]; then usage $0 fi case "$1" in start) ipvsStart ;; stop) ipvsStop ;; restart) ipvsStop ipvsStart ;; *) usage $0 ;; esac } #start operating main $*
ipvs_client
#!/bin/bash # description: Config realserver lo and apply noarp VIP=( 192.168.4.127 ) . /etc/rc.d/init.d/functions case "$1" in start) for ((i=0; i<`echo ${#VIP[*]}`; i++)) do interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`" /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up done 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 action "Start LVS of RearServer.by wang1xin" ;; stop) for ((i=0; i<`echo ${#VIP[*]}`; i++)) do interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`" /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down done 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 action "Close LVS of RearServer.by wang2xin" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
一个脚本同时实现自动剔除和加入RS
#!/bin/bash PORT="80" VIP=192.168.4.127 RIP=( 192.168.4.121 192.168.4.122 ) function check_url() { for ((i=0; i<`echo ${#RIP[*]}`; i++)) do judge=($(curl -I -s http://${RIP[$i]}|head -1|tr "\r" "\n")) if [[ "${judge[1]}" == ‘200‘ && "${judge[2]}"==‘OK‘ ]] then if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -ne 1 ] then ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT fi else if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -eq 1 ] then ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT fi fi done } while true do check_url sleep 5 done
4 LVS+keepalived高性能集群应用实战
LVS配置(略)
Keepalived配置
主节点
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } virtual_server 192.168.4.130 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.4.121 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.4.122 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
备节点
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } virtual_server 192.168.4.130 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.4.121 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.4.122 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
5 其他
keepalived+LVS部署问题排错思路
1、iptables防火墙问题
2、linux负载均衡器转发问题
对于nat模式,linux内核转发及iptables转发功能需要开放,对于DR模式,可以不打开
3、RS端抑制ARP问题
4、RS端lo上绑定业务VIP,每个RS都要绑定
5、RS端lo上绑定的业务VIP,有时lo接口VIP会丢失
解决办法:
a)ipvs_client完整脚本启动命令放入rc.local
b)通过nagios监控RS端上绑定的业务VIP做监控报警
c)把RS端lo上绑定的业务VIP做成网卡配置文件提供服务
如:/etc/sysconfig/network-scripts/ifcfg-lo:123
6、确保client用户、director和RS 三者之间任意两者业务服务可访问
可用wget telnet等命令来监测
7、ipvsadm -L -n来检查LVS真是服务器情况及VIP连接及配置
8、检查keepalived配置文件是否配置正确
9、查看系统日志/var/log/messages
10、通过tcpdump命令跟踪数据包流向
11、注意LVS配置的语法,尤其是大括号问题
keepalived+LVS生产环境负载均衡维护思路
1、业务高峰期尽量不修改负载均衡配置,以免发生故障
2、修改keepalived.conf时,备份
3、将keepalived.conf的配置下载下来,保留原始文件再进行修改,对比,然后传到服务器
4、替换正式配置文件后,主负载均衡器可以先执行/etc/init.d/keepalived stop,把业务切换到备份负载均衡器上
LVS负载均衡器的多台RS上线方案
1)通过ipvsadm命令下线机器
2)通过url做健康检查,然后,移走健康检查文件。这样director会把此RS从转发池中移除
LVS性能调优
1、关闭iptables,换硬件防火墙
大流量时,iptables是一个性能瓶颈
2、调整连接超时时间
3、内核优化
4、网卡优化
5、TCP/IP优化
6、硬件优化
7、增大哈希表,ip_vs_conn_tab_bits调到20
通过重启,向内核传递参数来调整