Centos7-Lvs+Keepalived架构 推荐
2016-12-29 10:45
197 查看
LVS+Keepalived
介绍1、 LVSLVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。 2、 keepalivedKeepalived 是运行在lvs 之上,是一个用于做双机热备(HA)的软件,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提高系统的可用性。
运行原理keepalived通过选举(看服务器设置的权重)挑选出一台热备服务器做MASTER机器,MASTER机器会被分配到一个指定的虚拟ip,外部程序可通过该ip访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的keepalived crash等),keepalived会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做MASTER并分配同样的虚拟IP,充当前一台MASTER的角色。
选举策略选举策略是根据VRRP协议,完全按照权重大小,权重最大(0~255)的是MASTER机器,下面几种情况会触发选举。
1. keepalived启动的时候;
2. master服务器出现故障(断网,重启,或者本机器上的keepalived crash等,而本机器上其他应用程序crash不算);
3.有新的备份服务器加入且权重最大。
配置实例 lvs_vip:172.16.10.188
lvs1+keepalived主:172.16.10.102
lvs2+keepalived备:172.16.10.142
nginx1:172.16.10.162
nginx2:172.16.10.167
安装ipvsadm和keepalived
查看
添加开机启动
因为选举策略是根据VRRP协议,如果不配置防火墙,就会出现两台lvs上都有vip,两台主机之间无法通信。
relearserver端配置(nginx) 修改内核参数
配置虚拟IP地址临时添加
配置路由临时添加
或者使用脚本启动和停止
到此配置完成 测试停止keepalived主,查看vip是否漂移到备,并测试是否可以正常访问 查看日志信息
ipvsadm参数详解
介绍1、 LVSLVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。 2、 keepalivedKeepalived 是运行在lvs 之上,是一个用于做双机热备(HA)的软件,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提高系统的可用性。
运行原理keepalived通过选举(看服务器设置的权重)挑选出一台热备服务器做MASTER机器,MASTER机器会被分配到一个指定的虚拟ip,外部程序可通过该ip访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的keepalived crash等),keepalived会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做MASTER并分配同样的虚拟IP,充当前一台MASTER的角色。
选举策略选举策略是根据VRRP协议,完全按照权重大小,权重最大(0~255)的是MASTER机器,下面几种情况会触发选举。
1. keepalived启动的时候;
2. master服务器出现故障(断网,重启,或者本机器上的keepalived crash等,而本机器上其他应用程序crash不算);
3.有新的备份服务器加入且权重最大。
配置实例 lvs_vip:172.16.10.188
lvs1+keepalived主:172.16.10.102
lvs2+keepalived备:172.16.10.142
nginx1:172.16.10.162
nginx2:172.16.10.167
安装ipvsadm和keepalived
# yum -y install ipvsadm keepalived修改keepalived主的配置
# vim /etc/keepalived/keepalived.conf
global_defs{ notification_email{ ******@163.com #报警接收人,多个写多行 } notification_email_from ******@163.com #报警发件人 smtp_server smtp.163.com #发送email时使用的smtp服务器地址 smtp_connect_timeout 30 #smtp超时时间 router_id LVS1 #表示运行keepalived服务器的一个标识,发邮件时显示在邮件主题的信息 } #不使用SYNCGroup的话,如果路由有2个网段,一个内网,一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题时,VRRP会认为自己是健康的,则不会发送Master和Backup的切换,从而导致问题,SyncGroup可以把两个实例都放入SyncGroup,这样的话,Group里任何一个实例出现问题都会发生切换 vrrp_sync_group test { group{ loadbalance } } vrrp_instance loadbalance { state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器 interface eno16777736 #指定HA监测网络的接口 lvs_sync_daemon_inteface eno16777736 #负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线 virtual_router_id 38 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 advert_int 5 #定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication{ auth_type PASS #设置验证类型,主要有PASS和AH两种 auth_pass 1111 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 } virtual_ipaddress{ 172.16.10.188 #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 } } virtual_server 172.16.10.188 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开 delay_loop 6 #设置运行情况检查时间,单位是秒 lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法 lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选 #persistence_timeout 20 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。 protocol TCP #指定转发协议类型,有TCP和UDP两种 real_server 172.16.10.162 80 { #配置服务节点1,需要指定realserver的真实IP地址和端口,IP与端口之间用空格隔开 weight1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高 TCP_CHECK { connect_timeout 3 #表示3秒无响应超时 nb_get_retry 3 #表示重试次数 delay_before_retry 3 #表示重试间隔 } } real_server 172.16.10.167 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 172.16.10.188 443 { delay_loop 6 lb_algo rr lb_kind DR #persistence_timeout 20 protocol TCP real_server 172.16.10.162 443 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.10.167 443 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }修改keepalived备的配置基本都和主一样,只需要修改几处
state BACKUP priority 99 router_id LVS2在两台lvs服务器上开启路由转发功能
# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p添加realserver ip地址
# ipvsadm-A -t 172.16.10.188:80 -s rr # ipvsadm-a -t 172.16.10.188:80 -r 172.16.10.162:80 -w 1 # ipvsadm-a -t 172.16.10.188:80 -r 172.16.10.167:80 -w 1 # ipvsadm-A -t 172.16.10.188:443 -s rr # ipvsadm-a -t 172.16.10.188:443 -r 172.16.10.162:443 -w 1 # ipvsadm-a -t 172.16.10.188:443 -r 172.16.10.167:443 -w 1
查看
# ipvsadm -l启动服务
# systemctl start keepalived # systemctl enable keepalivedipvsadm脚本
# vim /etc/init.d/ipvsadm
#!/bin/bash # #LVS script for VS/DR # #./etc/rc.d/init.d/functions # VIP=172.16.10.188 RIP1=172.16.10.162 RIP2=172.16.10.167 PORT1=80 PORT2=443 Algorithm=rr Weight=1 # case"$1" in start) #Since this is the Director we must be able to forward packets #只是临时修改,重启机器或重启网卡失效 echo 1 > /proc/sys/net/ipv4/ip_forward #Clear all ipvsadm rules/services. /usr/sbin/ipvsadm -C #Add an IP virtual service for VIP /usr/sbin/ipvsadm -A -t $VIP:$PORT1 -s $Algorithm #Now direct packets for this VIP to #the real server IP (RIP) inside the cluster /usr/sbin/ipvsadm -a -t $VIP:$PORT1 -r $RIP1 -g -w $Weight /usr/sbin/ipvsadm -a -t $VIP:$PORT1 -r $RIP2 -g -w $Weight #Add an IP virtual service for VIP /usr/sbin/ipvsadm -A -t $VIP:$PORT2 -s $Algorithm #Now direct packets for this VIP to #the real server IP (RIP) inside the cluster /usr/sbin/ipvsadm -a -t $VIP:$PORT2 -r $RIP1 -g -w $Weight /usr/sbin/ipvsadm -a -t $VIP:$PORT2 -r $RIP2 -g -w $Weight /bin/touch /var/lock/subsys/ipvsadm &>/dev/null ;; stop) #Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward #Reset ipvsadm /usr/sbin/ipvsadm -C # Bringdown the VIP interface /usr/sbin/route del $VIP /bin/rm -f /var/lock/subsys/ipvsadm echo "ipvs is stopped..." ;; status) if [ ! -e /var/lock/subsys/ipvsadm ]; then echo "ipvsadm is stopped ..." else echo "ipvs is running ..." ipvsadm -L -n fi ;; *) echo "Usage: $0{start|stop|status}" ;; esac
添加开机启动
# vim /etc/rc.d/rc.local /etc/init.d/ipvsadm start # chmod +x /etc/rc.d/rc.local配置防火墙
因为选举策略是根据VRRP协议,如果不配置防火墙,就会出现两台lvs上都有vip,两台主机之间无法通信。
# vim /etc/sysconfig/iptables -A INPUT -s 172.16.10.0/24 -p vrrp -j ACCEPT # systemctl restart iptables
relearserver端配置(nginx) 修改内核参数
# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.all.arp_announce=2 net.ipv4.ip_forward=0
# sysctl -p
配置虚拟IP地址临时添加
# ifconfig lo:0 172.16.10.188 netmask 255.255.255.255 broadcast 172.16.10.188永久添加
# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no NAME=lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=172.16.10.188 NETMASK=255.255.255.255
配置路由临时添加
# route add -host 172.16.10.188 dev lo:0永久添加
# vim /etc/sysconfig/network-scripts/route-lo:0 172.16.10.188 dev lo:0
或者使用脚本启动和停止
# vim /etc/init.d/lvs_real.sh #!/bin/bash VIP=172.16.10.188 #/etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 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 sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $VIP >/dev/null 2>&1 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 "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0 # vim /etc/rc.local /etc/init.d/lvs_real.sh start
到此配置完成 测试停止keepalived主,查看vip是否漂移到备,并测试是否可以正常访问 查看日志信息
# tail -f /var/log/messages查看LVS当前设置
# watch ipvsadm -Ln查看转发情况
# watch ipvsadm -Lnc在测试中我发现,使用rr算法,一个用户的请求会被分发到两台nginx上,这并不是我想要的结果,大概看了一下lvs的八种算法,最后将rr替换为了sh(源地址散列),具体介绍自行百度,之后,同一个用户的请求可以被分发在同一台nginx上面了,或者也可以设置persistence_timeout参数,配置文件中有介绍,也可以实现一定时间内将请求分发到一台nginx上。但是我又发现keepalived配置中有调度算法和权重,ipvsadm中也有调度算法和权重,这是不是会有冲突呢,会使用谁的算法。经过测试,手动配置完keepalived和ipvsadm之后,例如:keepalived算法为sh,权重为3。ipvsadm算法为rr,权重为1。启动keepalived,ipvsadm -l 查看,发现算法替换为sh,权重为3。手动将ipvsadm的配置修改,算法为rr,权重为1,keepalived不重启,ipvsadm -l 查看,配置生效,经测试,使用的是手动改动过后的配置。所以这两个的配置要一样。补充:后来突然想起既然keepalived启动,会替换掉配置的ipvsadm,也就是说如果不配置ipvsadm是不是也可以,我到网上一查,的确,keepalived已经集成了ipvsadm功能,所以应该不需要配置ipvsadm也可以,不过配置了也没有关系,所以没有在进行验证,有兴趣的可以验证一下不配置ipvsadm是否可以。 LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 4-7 - 保留未使用 8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口 0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
ipvsadm参数详解
# ipvsadm -h ipvsadmv1.27 2008/5/15 (compiled with popt and IPVS v1.2.1) Usage: ipvsadm -A|E -t|u|f service-address [-sscheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-bsched-flags] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -rserver-address [options] ipvsadm -d -t|u|f service-address -rserver-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state[--mcast-interface interface] [--syncid sid] ipvsadm --stop-daemon state ipvsadm -h Options: --tcp-service -t service-address service-address is host[:port] --udp-service -u service-address service-address is host[:port] --fwmark-service -f fwmark fwmark is an integer greater than zero --ipv6 -6 fwmark entryuses IPv6 --scheduler -s scheduler one ofrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, thedefault scheduler is wlc. --pe engine alternate persistence engine maybe sip, not setby default. --persistent -p [timeout] persistentservice --netmask -M netmask persistentgranularity mask --real-server -r server-address server-address is host (and port) --gatewaying -g gatewaying(direct routing) (default) --ipip -i ipip encapsulation (tunneling) --masquerading -m masquerading (NAT) --weight -w weight capacity ofreal server --u-threshold -x uthreshold upperthreshold of connections --l-threshold -y lthreshold lowerthreshold of connections --mcast-interface interface multicast interface for connectionsync --syncid sid syncid for connectionsync (default=255) --connection -c output ofcurrent IPVS connections --timeout output of timeout(tcp tcpfin udp) --daemon output of daemoninformation --stats output ofstatistics information --rate output of rateinformation --exact expand numbers(display exact values) --thresholds output of thresholdsinformation --persistent-conn output of persistentconnection info --nosort disable sortingoutput of service/server entries --sort does nothing, forbackwards compatibility --ops -o one-packet scheduling --numeric -n numericoutput of addresses and ports --sched-flags -b flags schedulerflags (comma-separated) --add-service -A add virtual service with option 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器 --edit-service -E edit virtual service with options 编辑内核虚拟服务器表中的一条虚拟服务器记录 --delete-service -D delete virtual service 删除内核虚拟服务器表中的一条虚拟服务器记录 --clear -C clear the whole table 清除内核虚拟服务器表中的所有记录 --restore -R restore rules from stdin 恢复虚拟服务器规则 --save -S save rules to stdout 保存虚拟服务器规则,输出为-R 选项可读的格式 --add-server -a add real server with options 在内核虚拟服务器表的一条记录里添加一条新的真实服务器 --edit-server -e edit real server with options 编辑一条虚拟服务器记录中的某条真实服务器记录 --delete-server -d delete real server 删除一条虚拟服务器记录中的某条真实服务器记录 --list -L|-l list the table 显示内核虚拟服务器表 --zero -Z zero counters in a service or all services 虚拟服务表计数器清零 --set tcp tcpfin udp set connection timeout values 设置连接超时值 --start-daemon start connection sync daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采keepalived 的VRRP 功能。 --stop-daemon stop connection sync daemon 停止同步守护进程 --help -h display this help message 显示帮助信息 Options: --tcp-service -t service-address service-address is host[:port] 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port] --udp-service -u service-address service-address is host[:port] 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port] --fwmark-service -f fwmark fwmark is an integer greater than zero 说明是经过iptables 标记过的服务类型。 --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,the default scheduler is wlc. 使用的调度算法,有这样几个选项,默认的调度算法是: wlc. --persistent -p [timeout] persistent service 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒 --netmask -M netmask persistent granularity mask --real-server -r server-address server-address is host (and port) 真实的服务器[Real-Server:port] --gatewaying -g gatewaying (direct routing) (default) 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式 --ipip -i ipip encapsulation (tunneling) 指定LVS 的工作模式为隧道模式 --masquerading -m masquerading (NAT) 指定LVS 的工作模式为NAT 模式 --weight -w weight capacity of real server 真实服务器的权值 --u-threshold -x uthreshold upper threshold of connections --l-threshold -y lthreshold lower threshold of connections --mcast-interface interface multicast interface for connection sync 指定组播的同步接口 --syncid sid syncid for connection sync (default=255) --connection -c output of current IPVS connections 显示LVS 目前的连接 如:ipvsadm -L -c --timeout output of timeout (tcp tcpfin udp) 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout --daemon output of daemon information 显示同步守护进程状态 --stats output of statistics information 显示统计信息 --rate output of rate information 显示速率信息 --thresholds output of thresholds information --persistent-conn output of persistent connection info --sort sorting output of service/server entries 对虚拟服务器和真实服务器排序输出 --ops -O one-packet scheduling --numeric -n numeric output of addresses and ports 输出IP 地址和端口的数字形式
相关文章推荐
- nginx代理指定目录
- 访问Nginx发生SSL connection error的一种情况
- Nginx+Naxsi部署专业级Web应用防火墙
- CentOS 6.2实战部署Nginx+MySQL+PHP
- nginx中http核心模块的配置指令2
- nginx中http核心模块的配置指令3
- nginx中http核心模块的配置指令4
- nginx中http的fastcgi模块的配置指令1
- mysql集群之keepalived简单搭建
- Apache select和Nginx epoll模型区别
- Nginx 学习笔记(一)
- 网站502与504错误分析
- 用zabbix监控nginx_status状态
- 艰难完成 nginx + puma 部署 rails 4的详细记录
- 把Lua编译进nginx步骤方法
- web 应用中常用的各种 cache详解
- Linux系统上配置Nginx+Ruby on Rails+MySQL超攻略
- window+nginx+php环境配置 附配置搭配说明
- LVS+Keepalived构建高可用负载均衡(测试篇)