Lvs+Keepalived
前言:
集群特点:
1)高性能
2)经济
3)高可用
4)可伸缩
集群的分类
1)负载均衡集群,LBC或者LB。
2)高可用性集群,HAC
3)高性能计算集群,HPC
4)LB和HAC是主流
负载均衡集群的作用:
1)分担用户访问请求或数据流量(负载均衡)
2)保持业务持续性7*24服务(高可用性)
3)负载均衡集群典型的开源软件:lvs,nginx,haproxy,lighttpd
高可用集群作用:
1)当一台机器宕机后另一台机器接管(ip资源和服务资源)
一、LVS理解
1)参考文档
http://www.linuxvirtualserver.org/zh/lvs1.html http://www.linuxvirtualserver.org/zh/lvs2.html http://www.linuxvirtualserver.org/zh/lvs3.html http://www.linuxvirtualserver.org/zh/lvs4.html
2)LVS层次
1、实现调度的工具IPVS(在内核中)。
2、管理工具ipvsadm。
3、keepalived实现管理及高可用。
3)LVS术语
1、虚拟ip地址 VIP-->VIP 为Director用于向客户端计算机提供服务的ip地址,比如,www.baidu.com域名就要解析到VIP上提供服务。
2、真实ip地址 RIP -->在集群下面节点上使用的ip地址,物理ip地址
3、Director的ip地址 DIP--> Director用于连接内外网络的ip地址,物理网卡上的ip地址。是负载均衡器上的ip。
4、客户端主机ip地址 CIP -->客户端用户计算机请求集群服务器的ip地址,该地址用作发送给集群的请求的源ip地址。
4)LVS几种工作模式
NAT ,TUN ,DR,FULLNAT
DR模式:
直接路由模式(熟练),,,这个用的最多,,,,别的用的很少
根据本地的DR原理图解释,,
客户端发送请求,目的地址vip,客户端地址cip,,当请求消息到了LVS负载均衡服务器时,服务器不会改变客户端发送的原地址和目的地址,,,只会将vip对应的MAC改成RMAC,此时是以二层的方式通信,此时数据传递到真实的服务器上,因为真实的服务器上没有相应的ip,虚拟的ip,所以这个虚拟的ip要绑定到环回端口,因为此时有广播包的传递,所以要抑制ARP的影响。
上面是自己理解,下面是大牛理解。
VS/DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将相应后的处理结果直接返回给客户端用户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持ip隧道协议的要求,但是要求调度器LB与真实服务器RS都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。
5)LVS的有十种调度算法
主要的有三种:
静态:rr,wrr
动态:wlc
6)LVS的调度算法的生产环境选型:
一般的网络服务,如http,MAIL,MySQL等,常用的LVS调度算法为:
a.基本轮叫调度rr算法
b.加权最小连接调度wlc
c.加权轮叫调度wrr算法
二、LVS安装
1)查看有没有LVS调度器,ipvs是在内核中工作的,所以要将它加载到内核中。
lsmod | grep ip_vs
2)创建一个软连接,此ln命令的链接路径要和uname -r输出的结果内核版本对应,如果没有路径很可能是缺少kernels软件包,,可以通过yum install -y kernel-devel安装,ln这个命令也可以不执行,直接指定内核参数编译。
[root@aliyun ~]# ln -s /usr/src/kernels/2.6.32-696.1.1.el6.x86_64/ /usr/src/linux
3)下载LVS
[root@aliyun tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz [root@aliyun tools]# tar -zxf ipvsadm-1.26.tar.gz [root@aliyun tools]# cd ipvsadm-1.26 [root@aliyun ipvsadm-1.26]# make && make install //不要config
此时如果报错了,很可能就是缺少下面的包,安装就好
[root@aliyun ipvsadm-1.26]# yum install libnl* popt* -y
[root@aliyun ipvsadm-1.26]# lsmod | grep ip_vs
此时还是没有相应的内核模块,,,,此时有两种方法可以将这两个模块加入内核中
1)[root@aliyun 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@aliyun ipvsadm-1.26]# lsmod | grep ip_vs ip_vs 126705 0 libcrc32c 1246 1 ip_vs ipv6 336368 3 ip_vs,ib_ipoib,ib_addr 2)modprobe ip_vs
4)手工添加LVS转发
4.1)用户访问www.etiantian.org然后被DNS解析到VIP 10.0.0.1,这个步骤是在DNS里配置的。
如果是自建的DNS,etiantian域的DNS记录设置如下。
www IN A 10.0.0.1
4.2)配置LVS虚拟ip(VIP)
[root@aliyun ~]# ifconfig eth0:0 172.19.125.33/24 up 添加个主机路由,也可以不加 route add -host 172.19.125.33 dev eth0
4.3)检查结果
[root@aliyun ~]# ifconfig eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:16:3E:1A:11:E6 inet addr:172.19.125.33 Bcast:172.19.125.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
4.4)LB配置,,初始的配置
清空原来的配置 [root@aliyun ~]# ipvsadm -C 设置超时时间 --set tcp tcpfin udp set connection timeout values [root@aliyun ~]# ipvsadm --set 30 5 60 ####添加一个虚拟的服务器,,,这个就是一个VIP,,,,并指定它的算法和持续服务的超时时间 [root@aliyun ~]# ipvsadm -A -t 172.19.125.33:80 -s rr -p 20 指定这个vip对应的真实ip,,工作模式 DR,,,,权重 [root@aliyun ~]# ipvsadm -a -t 172.19.125.33:80 -r 172.19.125.35 -g -w 1 [root@aliyun ~]# ipvsadm -a -t 172.19.125.33:80 -r 172.19.125.36 -g -w 1 [root@aliyun ~]# ipvsadm -a -t 172.19.125.33:80 -r 172.19.125.37 -g -w 1 此时访问172.19.123.33是不可以访问的,,,只可以访问真实的主机
4.5)手工在RS端绑定
每台real server端 ifconfig lo:0 172.19.125.33 netmask 255.255.255.255 up #注意;子网掩码的特殊 route add -host 172.19.125.33 dev lo 每个集群节点上的环回接口(lo)设备上被绑定VIP地址(其广播地址是其本身,子网掩码是255.255.255.255)
4.6)RS上抑制ARP响应
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
4.7)ARP广播而进行新的地址解析.......如果此时换机器了,可以就要用此命令,,通过arping命令来通知所有网络内机器,,,适合用在脚本中
清除其本地的ARP table cache,从而使得客户机访问时重新广播获取MAC地址。,,这个在开发脚本实现服务器的高可用时是要必须考虑的问题之一,几乎所有的高可用软件都会考虑这个问题。 /sbin/arping -I eth0 -c 3 -s 10.0.0.1 10.0.0.2 /sbin/arping -U -I eth0 10.0.0.1 #####清空局域网的ARP表,,前面是VIP ,后面是网关,,,,高可用时出效果 arping -c 1 -I eth0 -s $VIP 10.0.0.254 >/dev/null 2>&1
4.8)参考资源,,内含裂脑问题的解决方案
http://oldboy.blog.51cto.com/2561410/1240412
三、Keepalived原理
1)keepalived高可用集群介绍
keepalived起初是专门为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入VRRP的功能,因此除了配合LVS服务外,也可以作为其他服务的高可用软件,VRRP出现的目的就是为了解决静态路由出现的单点故障问题,它能够保证网络的不间断、稳定的运行。所以keepalived一方面具有LVS cluster nodes healthchecks功能,另一方面也具有LVS directors failover功能。
2)keepalive服务两大用途:healthcheck & failover
a、ha failover功能:实现LB Master主机和Backup主机之间故障转移和自动切换。
这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器失效或出现故障时,备份负载均衡器将自动接管主负载均衡器的所有工作(VIP资源及相应服务),一旦主负载均衡器故障修复,主负载均衡器又会接管回它原来处理的工作,而备份负载均衡器会释放主负载均衡器失效时它接管的工作,此时二者将恢复到最初各自的角色状态。
b、rs healthcheck功能:负载均衡定期检查RS的可用性决定是否给其分发请求。
当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的RS服务器从转发队列中清除出去。从而保证用户的访问不受影响;当故障的RS服务器被修复后,系统又会自动地把它们加入转发队列,分发请求提供正常服务。
3)keepalived故障切换转移原理介绍
keepalived directors之间的故障切换转移,是通过VRRP(虚拟路由器冗余协议)来实现的。在keepalived Directors正常工作时,主Director节点会不断的向备节点广播心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的ip资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时自身接管的ip资源及服务,恢复到原来的自身的备用角色。
四、Keepalived安装
1)下载和安装keepalived
[root@aliyun tools]# wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz 下面这个在LVS解释过 [root@aliyun ~]# ln -s /usr/src/kernels/2.6.32-696.1.1.el6.x86_64/ /usr/src/linux //如果此处不ln,,,换个办法就是--with-kernel-dir=/usr/src/kernels/2.6.18内核版本 yum install -y kernel-devel [root@aliyun tools]# tar -zxf keepalived-1.1.19.tar.gz [root@aliyun tools]# cd keepalived-1.1.19 [root@aliyun keepalived-1.1.19]# ./configure 要看到3个yes Use IPVS Framework : Yes IPVS sync daemon support : Yes Use VRRP Framework : Yes [root@aliyun keepalived-1.1.19]# make && make install
2)改配置文件目录
[root@aliyun ~]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/ #生成启动脚本命令 [root@aliyun ~]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ #配置启动脚本的参数 [root@aliyun ~]# mkdir -p /etc/keepalived #创建默认的keepalived配置文件路径 [root@aliyun ~]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ #把keepalived.conf模板拷贝到目录下 [root@aliyun ~]# cp /usr/local/sbin/keepalived /usr/sbin/ [root@aliyun ~]# /etc/init.d/keepalived start [root@aliyun ~]# /etc/init.d/keepalived stop
3)对于配置文件的帮助
[root@aliyun ~]# man keepalived.conf
4)配置keepalive
需求,两个服务器,一个配置为master,一个为backup,单实例
此时当做两个keepalive都以安装完毕,,,两个机器都做如下配置,一个配置文件是master,一个是backup,,,添加配置文件,,如果有需要可以联系我
[root@aliyun ~]# cd /etc/keepalived/ [root@aliyun ]# mv keepalived.conf keepalived.conf.bak [root@aliyun ]# mv keepalived.conf.1-dan keepalived.conf [root@aliyun keepalived]# /etc/init.d/keepalived restart
5)查看
ifconfig是看不到,,,ip add看
此时如果查看到两个机器上都有虚拟ip,,此时就出现了裂脑的问题了,,,,查看http://oldboy.blog.51cto.com/2561410/1240412
我的问题就是因为备份服务器的防火墙没有关,无法进行心跳检测,,所以正常情况下只有MASTER会显示ip,而备份时不显示的,当MASTER挂了之后,SLAVE起来。
自动切换。
多实例跟单实例差不多,就是配置文件的更改问题
6)优化设置,,日志文件
日志的默认路径: cat /var/log/messages 修改日志的路径: vim /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="-D -d -S 0" //默认0 vim /etc/rsyslog.conf local0.* /var/log/keepalived.log //local0.*,所有的状态都打印 /etc/init.d/rsyslog restart /etc/init.d/keepalived restart
7)keepalived+LVS配置文件
! Configuration File for keepalived #注释 global_defs { #全局定义 notification_email { #通知的邮件,当有问题的时候通知,可以不配,用处不大,,收件人 } notification_email_from Alexandre.Cassen@firewall.loc #发件人 smtp_server 10.0.0.1 smtp_connect_timeout 30 router_id LVS_7 } 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 { #VIP 10.0.0.10/24 } } ########################LVS+Keepalived,,,所以两者一起使用的时候,只要在这个配置文件里配置LVS的功能,不用通过Ipvsadm来配置,,配置好后,可以通过ipvsadm -L -n来查看 virtual_server 10.0.0.10 80 { delay_loop 6 #健康检查时间间隔 lb_algo rr #负载均衡调度算法 lb_kind DR #负载均衡转发规则 persistence_timeout 300 #设置会话保持时间,对bbs等很有用 protocol TCP #协议 #ipvsadm -A -t 10.0.0.10:80 -s rr -p 300 real_server 10.0.0.1 80 { weight 3 #设置权重 TCP_CHECK { #健康检查 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.0.0.2 80 { weight 3 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } #ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.1 -g -w 1 #ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.2 -g -w 2 最后客户端还是要做,VIP绑定和ARP抑制,,可以参考LVS里面的
五、LVS负载均衡代码平滑上线发布思路
发布代码:
开发人员本地测试--》办公室内部测试--》(配置管理员)--》IDC机房测试环境(测试人员)--》正式服务器
在真实服务器上一般都是下一半服务器,在不提供的服务的服务器上先测试服务,另一半服务器提供原来的代码服务,,
让真实服务器暂时不提供服务
ipvsadm -d -t 10.0.0.10:80 -r 10.0.0.8