4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
热卖商品
新闻详情
keepalive简单入门-老王linux旅程-51CTO博客
来自 : 51CTO技术博客 发布时间:2021-03-24

解决了任务分发问题,那么我们可以考虑下一个问题了,机器故障怎么办。首先考虑realsserver故障,我们怎么实时发现rs(realserver)的状态,当检测rs到故障后调度器怎么修改调度规则。然后是考虑dr(director)故障,这就是大问题了一旦故障整个后端服务就全部不可用了,这里我称这种节点为单点。原本的设计由于故障导致漏洞百出,有人就引入了一个软件keepalived,帮助lvs解决了单点问题,同时还提供了后端rs故障发现和处理机制。

# 目录

高可用

keepalived

双主模型的实践

多端口统一调度



# 高可用

这里dr一直可以就成为高可用,仔细的考虑dr的特点,一是负责调度规则管理,二对外网提供访问接口,这个访问接口一般是一个ip。

这里引入一个概念,也是一个常识,服务可用率A=MTBF/(MTBF+MTTR)

MTBF #平均无故障时间,也就是服务器正常提供服务的时间

MTTR #平均故障时间,服务器处于故障和维护的时间


提高A的方法有两种一种是在保证MTTP不变的情况下增大MBTF,这种方法常常是硬件级的提高方法,我们可以使用更贵的服务器,并且服务器每个硬件都有一个冗余处于热备。这种方法需要硬件设计商介入,那么就意味着成本会非常高,因为真正正在使用调度器数量很少,不能通过量产来平摊设计费用,那么只能承担硬件设计的高费用。这一种方法显然不太靠谱。


还有就是减MTTR,这种方法首先我们要承认一个前提——我们允许机器故障,减小故障和维护时间那么就有一个方案,就是准备一个和正在运行dr服务器一样的服务器,时时等着dr挂掉立即顶替。既然是顶替那么就会有问题,怎么判断dr挂掉了,让dr实时向备用服务器发送心跳信息,备用服务器一旦收不到心跳信息,立即顶替。


备用dr服务器(backup)怎么顶替dr(master),顶替dr意味着备用服务器要提供dr的全部功能,并且要继承dr的提供的外网访问接口。dr的功能好提供,只要backup服务器运行和master一样服务提供同样的配置文件就可以了。下一项怎么继承dr的外网访问接口,这里我们使用vrrp(虚拟路由协议)


vrrp,是多个硬件使用一个ip信息,其实同时只有一个设备可以使用ip。这个协议的功能就是让ip一直可用,一次工作流程。正常情况master硬件占有ip,并且不停向backup设备发送心跳信息,当master故障backup收不到心跳信息,backup就会发送arp报文问ip的mac地址是多少,然后自己回答ip的mac是自己的mac,这样路由就会收到arp信息更新路由表。这样就把ip抢过来了。




# keepalived

keepalived可以说是为lvs量身定制的高可用软件,之所以这样说是因为它主要有两个核心模块构成如下图


\"wKioL1iNrwzT5Q4-AACEnxrS1kM787.jpg\"


其中vrrp Stack主要是为了实现vrrp功能;Checkers是为了实现监控后端服务器状态的的模块,当后端服务器故障可以实时更改lvs规则,不再向故障的后端服务器调度请求。



### keepalived配置文件的结构

GLOBAL CONFIGURATION

Global definitions

Static routes/addresses

VRRPD CONFIGURATION

VRRP synchronization group(s) #vrrp同步组;

VRRP instance(s) #每个vrrp instance即一个vrrp路由器;

LVS CONFIGURATION

Virtual server group(s)

Virtual server(s) #ipvs集群的vs和rs;



### 配置虚拟路由器:

vrrp_instance STRING {

....

}

state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;

interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口;

virtual_router_id VRID:当前虚拟路由器的惟一标识,范围是0-255;

priority 100:当前主机在此虚拟路径器中的优先级;范围1-254;

advert_int 1:vrrp通告的时间间隔;

authentication {

auth_type AH|PASS

auth_pass PASSWORD

}



### 虚拟服务器:

virtual_server IP port |

virtual_server fwmark int

{

...

real_server {

...

}

...

}


常用参数:

delay_loop INT :服务轮询的时间间隔;

lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法;

lb_kind NAT|DR|TUN:集群的类型;

persistence_timeout INT :持久连接时长;

protocol TCP:服务协议,仅支持TCP;

sorry_server IPADDR PORT :备用服务器地址;

real_server IPADDR PORT

{

weight INT

notify_up STRING | QUOTED-STRING

notify_down STRING | QUOTED-STRING

HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定义当前主机的健康状态检测方法;

}

HTTP_GET|SSL_GET:应用层检测

HTTP_GET|SSL_GET {

url {

path URL_PATH :定义要监控的URL;

status_code INT :判断上述检测机制为健康状态的响应码;

digest STRING :判断上述检测机制为健康状态的响应的内容的校验码;

}

nb_get_retry INT :重试次数;

delay_before_retry INT :重试之前的延迟时长;

connect_ip IP ADDRESS :向当前RS的哪个IP地址发起健康状态检测请求

connect_port PORT :向当前RS的哪个PORT发起健康状态检测请求

bindto IP ADDRESS :发出健康状态检测请求时使用的源地址;

bind_port PORT :发出健康状态检测请求时使用的源端口;

connect_timeout INTEGER :连接请求的超时时长;

}


TCP_CHECK {

connect_ip IP ADDRESS :向当前RS的哪个IP地址发起健康状态检测请求

connect_port PORT :向当前RS的哪个PORT发起健康状态检测请求

bindto IP ADDRESS :发出健康状态检测请求时使用的源地址;

bind_port PORT :发出健康状态检测请求时使用的源端口;

connect_timeout INTEGER :连接请求的超时时长;

}


# 双主模型的实践

\"wKiom1iNrsGhTdiUAACQZedCi-k947.png-wh_50\"


这里我使用lvs的dr模型


### dr1和dr2的设置命令

两台主机keepalived的配置只有很少的一点不同,不同的时候我会标出,这里以dr1的为例

yum-yinstallkeepalivedhttpdipvsadm#安装keepalived、httpd和ipvsadm,ipvsadm非必须的,是为了方便我们查看lvs的规则
vimkeepalived.conf!ConfigurationFileforkeepalivedglobal_defs{#全局配置notification_email{root@localhost}notification_email_fromkeepalived@localhostsmtp_server127.0.0.1smtp_connect_timeout30router_idnode1vrrp_mcast_group4224.0.29.29vrrp_instanceVI_1{#第一个虚拟网络配置#dr2的配置,stateBACKUPstateMASTERinterfaceeno16777736virtual_router_id51#dr2的配置,priority90priority100authentication{auth_typePASSauth_passoldking1}virtual_ipaddress{172.16.29.3/16deveno16777736labeleno16777736:0}#第二个虚拟网络的配置vrrp_instanceVI_2{#dr2的配置,stateMASTERstateBACKUPinterfaceeno16777736virtual_router_id52#dr2的配置,priority100priority90advert_int1authentication{auth_typePASSauth_passoldking2}virtual_ipaddress{172.16.29.4/16deveno16777736labeleno16777736:1}virtual_server172.16.29.380{#第一个虚拟网络对应的服务配置delay_loop6lb_algorrlb_kindDRnat_mask255.255.0.0protocolTCPsorry_server127.0.0.180real_server172.16.29.180{weight1HTTP_GET{url{path/status_code200}connect_timeout1nb_get_retry1delay_before_retry1}}real_server172.16.29.280{weight1HTTP_GET{url{path/status_code200}connect_timeout1nb_get_retry1delay_before_retry1}}virtual_server172.16.29.480{#第二个虚拟网络对应的服务配置delay_loop6lb_algorrlb_kindDRnat_mask255.255.0.0protocolTCPsorry_server127.0.0.180real_server172.16.29.180{weight1HTTP_GET{url{path/status_code200}connect_timeout1nb_get_retry1delay_before_retry1}}real_server172.16.29.280{weight1HTTP_GET{url{path/status_code200}connect_timeout1nb_get_retry1delay_before_retry1}}echo\' h1 dr1 /h1 \' /var/www/html/index.html#提供网页文件,rs2的话,执行echo\' h1 dr2 /h1 \' /var/www/html/index.htmlsystemctlstartkeepalived.servicesystemctlstarthttpd.service



### rs1和rs2服务器的配置

yuminstallhttpd-yvimsetrs.sh#一键配置dr脚步#!/bin/bashvip=172.16.29.3vip1=172.16.29.4mask=\'255.255.255.255\'case$1instart)echo1 /proc/sys/net/ipv4/conf/all/arp_ignoreecho1 /proc/sys/net/ipv4/conf/lo/arp_ignoreecho2 /proc/sys/net/ipv4/conf/all/arp_announceecho2 /proc/sys/net/ipv4/conf/lo/arp_announceifconfiglo:0$vipnetmask$maskbroadcast$vipuprouteadd-host$vipdevlo:0ifconfiglo:1$vip1netmask$maskbroadcast$vip1uprouteadd-host$vip1devlo:1;;stop)ifconfiglo:0downifconfiglo:1downecho0 /proc/sys/net/ipv4/conf/all/arp_ignoreecho0 /proc/sys/net/ipv4/conf/lo/arp_ignoreecho0 /proc/sys/net/ipv4/conf/all/arp_announceecho0 /proc/sys/net/ipv4/conf/lo/arp_announce;;echo\"Usage$(basename$0)start|stop\"exit1;;bash-xsetrs.shecho\' h1 rs1 /h1 \' /var/www/html/index.html#提供网页文件,rs2的话,执行echo\' h1 rs2 /h1 \' /var/www/html/index.htmlsystemctlstarthttpd.service



# 多端口统一调度

首先使用iptables给某几个端口的服务打上同一个标签,大标签的命令

iptables-tmangle-APREROUTING-ieth2-ptcp--dport80-jMARK--set-mark20iptables-tmangle-APREROUTING-ieth2-ptcp--dport443-jMARK--set-mark20

然后再编辑keepalived配置文件

#这里不使用ip加port直接使用如下配置virtual_serverfwmark20{}




# nginx的双主模型

架构图和lvs双主模型的一模一样,只是把代理服务器更替为nginx

yuminstallnginxkeepalivedvim/etc/nginx/nginx.conf#在全局配置段添加如下内容upstreamweb{server172.16.29.1:80;server172.16.29.2:80;}#在server段更改location的配置如下location/{proxy_passhttp://web;}
vim/etc/keepalived/keepalived.conf!ConfigurationFileforkeepalivedglobal_defs{notification_email{root@localhost}notification_email_fromkeepalived@localhostsmtp_server127.0.0.1smtp_connect_timeout30router_idnode1vrrp_mcast_group4224.0.29.29#这个脚本是为了维护后端服务器时使用的vrrp_scriptchk_down{script\"[[-f/etc/nginx/down]] exit1||exit0\"interval1weight-5}#这个脚本是为了检测代理服务器Nginx的状态vrrp_scriptchk_nginx{script\"killall-0nginx exit0||exit1\"interval1weight-20}#第一个虚拟网络配置vrrp_instanceVI_1{#dr2的配置,stateBACKUPstateMASTERinterfaceeno16777736virtual_router_id51#dr2的配置,priority90priority100authentication{auth_typePASSauth_passoldking1}virtual_ipaddress{172.16.29.3/16deveno16777736labeleno16777736:0}#第二个虚拟网络的配置vrrp_instanceVI_2{#dr2的配置,stateMASTERstateBACKUPinterfaceeno16777736virtual_router_id52#dr2的配置,priority100priority90advert_int1authentication{auth_typePASSauth_passoldking2}virtual_ipaddress{172.16.29.4/16deveno16777736labeleno16777736:1}#调用chk_down和chk_nginx的运行track_script{chk_downchk_nginx}}


# 总结

keepalived的是很基本的服务,是我们使用最多的高可用服务,因为它足够轻量级并且可定制性很高,我们可以是keepalived调用我们定义的python脚步实现高级功能,拿高可用nginx服务为例子,备用节点的Nginx服务一直运行着,当主服务器故障,直接获取主服务器的ip,并且向缓存服务器加载session就好了。


©著作权归作者所有:来自51CTO博客作者Ailu0li的原创作品,如需转载,请注明出处,否则将追究法律责任 高可用 keepalived 双主模型 知识梳理

本文链接: http://aliveli.immuno-online.com/view-691224.html

发布于 : 2021-03-24 阅读(0)
公司介绍
品牌分类
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616