本文主要讲述Keepalived原理介绍和配置实践html
Keepalived原理介绍和配置实践
2019年09月03日 - 拆分LVS-Keepalived中Keepalived
2019年08月23日 - 更新LVS/NAT、LVS/DR、LVS/TUN三种模式的原理和配置实践
2018年12月03日 - 精简和更新配置步骤
2018年07月31日 - 初稿前端
阅读原文 - https://wsgzao.github.io/post...node
扩展阅读mysql
LVS - http://www.linuxvirtualserver...
Keepalived - http://www.keepalived.org/linux
Keepalived - http://www.keepalived.org/doc/
The Keepalived Solution - http://www.linuxvirtualserver...
LVS和Keepalived官方中文手册PDF - https://pan.baidu.com/s/1s0P6...nginx
如下术语涉及LVS三种工做模式的原理
负载均衡实现方法有两种:硬件实现和软件实现
硬件比较常见的有:git
软件比较常见的有:github
LVS特色是:web
Nginx负载均衡器的特色是:redis
HAProxy的特色是:
Keepalived 是运行在lvs之上,是一个用于作双机热备(HA)的软件,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提升系统的可用性。
keepalived经过选举(看服务器设置的权重)挑选出一台热备服务器作MASTER机器,MASTER机器会被分配到一个指定的虚拟ip,外部程序可经过该ip访问这台服务器,若是这台服务器出现故障(断网,重启,或者本机器上的keepalived crash等),keepalived会从其余的备份机器上重选(仍是看服务器设置的权重)一台机器作MASTER并分配一样的虚拟IP,充当前一台MASTER的角色。
选举策略是根据VRRP协议,彻底按照权重大小,权重最大(0~255)的是MASTER机器,下面几种状况会触发选举
Keepalived 是运行在lvs之上,它的主要功能是实现RealServer(真实服务器)的故障隔离及Director(负载均衡器)间的FailOver(失败切换).
全局配置又包括两个子配置
# 全局定义(global definition) global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } notification_email: 表示keepalived在发生诸如切换操做时须要发送email通知以及email发送给哪些邮件地址邮件地址能够多个每行一个 notification_email_from admin@example.com: 表示发送通知邮件时邮件源地址是谁 smtp_server 127.0.0.1: 表示发送email时使用的smtp服务器地址这里能够用本地的sendmail来实现 smtp_connect_timeout 30: 链接smtp链接超时时间 router_id node1: 机器标识,一般配置主机名 # 静态地址和路由配置范例 static_ipaddress { 192.168.1.1/24 brd + dev eth0 scope global 192.168.1.2/24 brd + dev eth1 scope global } static_routes { src $SRC_IP to $DST_IP dev $SRC_DEVICE src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE } 这里实际上和系统里面命令配置IP地址和路由同样例如 192.168.1.1/24 brd + dev eth0 scope global 至关于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global 就是给eth0配置IP地址路由同理,通常这个区域不须要配置 这里实际上就是给服务器配置真实的IP地址和路由的在复杂的环境下可能须要配置通常不会用这个来配置咱们能够直接用vi /etc/sysconfig/network-script/ifcfg-eth1来配置切记这里可不是VIP不要搞混淆了切记切记
包括三个类:
# VRRP同步组(synchroization group)配置范例 vrrp_sync_group VG_1 { //注意vrrp_sync_group 后面可自定义名称如lvs_httpd ,httpd group { http mysql } notify_master /path/to/to_master.sh notify_backup /path_to/to_backup.sh notify_fault "/path/fault.sh VG_1" notify /path/to/notify.sh smtp_alert } 其中http和mysql是实例名和下面的实例名一致 notify_master /path/to/to_master.sh //表示当切换到master状态时要执行的脚本 notify_backup /path_to/to_backup.sh //表示当切换到backup状态时要执行的脚本 notify_fault "/path/fault.sh VG_1" // keepalived出现故障时执行的脚本 notify /path/to/notify.sh smtp_alert //表示切换时给global defs中定义的邮件地址发送邮件通知 # VRRP实例(instance)配置范例 vrrp_instance http { //注意vrrp_instance 后面可自定义名称如lvs_httpd ,httpd state MASTER interface eth0 dont_track_primary track_interface { eth0 eth1 } mcast_src_ip <IPADDR> garp_master_delay 10 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS autp_pass 1234 } virtual_ipaddress { #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 } virtual_routes { # src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1 192.168.110.0/24 via 192.168.200.254 dev eth1 192.168.111.0/24 dev eth2 192.168.112.0/24 via 192.168.100.254 } nopreempt preemtp_delay 300 debug }
state: state指定instance(Initial)的初始状态就是说在配置好后这台 服务器的初始状态就是这里指定的但这里指定的不算仍是得要经过竞选经过优先级来肯定里若是这里设置为master但如若他的优先级不及另一台 那么这台在发送通告时会发送本身的优先级另一台发现优先级不如本身的高那么他会就回抢占为master
interface: 实例绑定的网卡由于在配置虚拟VIP的时候必须是在已有的网卡上添加的
dont track primary: 忽略VRRP的interface错误
track interface: 跟踪接口设置额外的监控里面任意一块网卡出现问题都会进入故障(FAULT)状态例如用nginx作均衡器的时候内网必须正常工做若是内网出问题了这个均衡器也就没法运做了因此必须对内外网同时作健康检查
mcast src ip: 发送多播数据包时的源IP地址这里注意了这里实际上就是在那个地址上发送VRRP通告这个很是重要必定要选择稳定的网卡端口来发送这里至关于heartbeat的心跳端口若是没有设置那么就用默认的绑定的网卡的IP也就是interface指定的IP地址
garp master delay: 在切换到master状态后延迟进行免费的ARP(gratuitous ARP)请求,默认5s
virtual router id: 这里设置VRID这里很是重要相同的VRID为一个组他将决定多播的MAC地址
priority 100: 设置本节点的优先级优先级高的为master
advert int: 设置MASTER与BACKUP负载均衡之间同步即主备间通告时间检查的时间间隔,单位为秒,默认1s
virtual ipaddress: 这里设置的就是VIP也就是虚拟IP地址他随着state的变化而增长删除当state为master的时候就添加当state为backup的时候删除这里主要是有优先级来决定的和state设置的值没有多大关系这里能够设置多个IP地址
virtual routes: 原理和virtual ipaddress同样只不过这里是增长和删除路由
lvs sync daemon interface: lvs syncd绑定的网卡,相似HA中的心跳检测绑定的网卡
authentication: 这里设置认证
auth type: 认证方式能够是PASS或AH两种认证方式
auth pass: 认证密码
nopreempt: 设置不抢占master,这里只能设置在state为backup的节点上并且这个节点的优先级必须别另外的高,好比master由于异常将调度圈交给了备份serve,master serve检修后没问题,若是不设置nopreempt就会将调度权从新夺回来,这样就容易形成业务中断问题
preempt delay: 抢占延迟多少秒,即延迟多少秒后竞选master
debug:debug级别
notify master:和sync group这里设置的含义同样能够单独设置例如不一样的实例通知不一样的管理人员http实例发给网站管理员mysql的就发邮件给DBA
# VRRP脚本 # 以下所示为相关配置示例 vrrp_script check_running { script "/usr/local/bin/check_running" interval 10 weight 10 } vrrp_instance http { state BACKUP smtp_alert interface eth0 virtual_router_id 101 priority 90 advert_int 3 authentication { auth_type PASS auth_pass whatever } virtual_ipaddress { 1.1.1.1 } track_script { check_running } } # 首先在vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变动,以下所示: vrrp_script check_running { script "/usr/local/bin/check_running" interval 10 #脚本执行间隔 weight 10 #脚本结果致使的优先级变动10表示优先级+10-10则表示优先级-10 } # 而后在实例(vrrp_instance)里面引用有点相似脚本里面的函数引用同样先定义后引用函数名 track_script { check_running }
注意:
VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别
keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。通常脚本检测返回的值为0,说明脚本检测成功,若是为非0数值,则说明检测失败
若是脚本执行结果为0,而且weight配置的值大于0,则优先级相应的增长, 若是weight为非0,则优先级不变
若是脚本执行结果非0,而且weight配置的值小于0,则优先级相应的减小, 若是weight为0,则优先级不变
其余状况,维持本来配置的优先级,即配置文件中priority对应的值。
这里须要注意的是:
1) 优先级不会不断的提升或者下降
2) 能够编写多个检测脚本并为每一个检测脚本设置不一样的weight
3) 无论提升优先级仍是下降优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的状况
这样能够作到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。
关于keeplived的虚拟主机配置有三种以下所示
virtual server IP port
virtual server fwmark int
virtual server group string
以经常使用的第一种为例
virtual_server 192.168.1.2 80
含义:设置一个virtual server: VIP:Vport
delay_loop 3
含义:设置service polling的delay时间即服务轮询的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
含义:设置LVS调度算法
lb_kind NAT|DR|TUN
含义:设置LVS集群模式
persistence_timeout 120
含义:设置会话保持时间秒为单位即以用户在120秒内被分配到同一个后端realserver,超过此时间就从新分配
persistence_granularity <NETMASK>
含义:设置LVS会话保持粒度ipvsadm中的-M参数默认是0xffffffff即每一个客户端都作会话保持
protocol TCP
含义:设置健康检查用的是TCP仍是UDP
ha_suspend
含义:suspendhealthchecker’s activity
virtualhost <string>
含义:HTTP_GET作健康检查时检查的web服务器的虚拟主机即host头
sorry_server <IPADDR> <PORT>
含义:设置backupserver就是当全部后端realserver节点都不可用时就用这里设置的也就是临时把全部的请求都发送到这里
real_server <IPADDR> <PORT>
含义:设置后端真实节点主机的权重等设置主要后端有几台这里就要设置几个
weight 1
含义:设置给每台的权重0表示失效(不知给他转发请求知道他恢复正常)默认是1
inhibit_on_failure
含义:表示在节点失败后把他权重设置成0而不是冲IPVS中删除
notify_up <STRING> | <QUOTED-STRING>
含义:设置检查服务器正常(UP)后要执行的脚本
notify_down <STRING> | <QUOTED-STRING>
含义:设置检查服务器失败(down)后要执行的脚本
注:keepalived检查机制说明
keepalived健康检查方式有:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK几种以下所示
#HTTP/HTTPS方式 HTTP_GET|SSL_GET { #设置健康检查方式 url { #设置要检查的URL能够有多个 path / #设置URL具体路径 digest <STRING> #检查后的摘要信息这些摘要信息能够经过genhash命令工具获取 status_code 200 #设置返回状态码 } connect_port 80 #设置监控检查的端口 bindto <IPADD> #设置健康检查的IP地址 connect_timeout 3 #设置链接超时时间 nb_get_retry 3 #设置重连次数 delay_before_retry 2 #设置重连间隔 } #TCP方式 TCP_CHECK { connect_port 80 #设置监控检查的端口 bindto <IPADD> #设置健康检查的IP地址 connect_timeout 3 #设置链接超时时间 nb_get_retry 3 #设置重连次数 delay_before_retry 2 #设置重连间隔 } #SMTP方式 (这个能够用来给邮件服务器作集群) SMTP_CHECK { host { connect_ip <IP ADDRESS> connect_port <PORT> #默认检查25端口 14 KEEPALIVED bindto <IP ADDRESS> } connect_timeout <INTEGER> retry <INTEGER> delay_before_retry <INTEGER> helo_name <STRING>|<QUOTED-STRING> } #MISC方式 这个能够用来检查不少服务器只须要本身会些脚本便可 MISC_CHECK { misc_path <STRING>|<QUOTED-STRING> #外部程序或脚本 misc_timeout <INT> #脚本或程序执行超时时间 misc_dynamic #这个就很好用了能够很是精确的来调整权重是后端天天服务器的压力都能均衡调配这个主要是经过执行的程序或脚本返回的状态代码来动态调整weight值使权重根据真实的后端压力来适当调整不过这须要有过硬的脚本功夫才行哦 #返回0健康检查没问题不修改权重 #返回1健康检查失败权重设置为0 #返回2-255健康检查没问题可是权重却要根据返回代码修改成返回码-2例如若是程序或脚本执行后返回的代码为200#那么权重这回被修改成 200-2 }
以上就是keepalived的配置项说明虽然配置项不少但不少时候不少配置项保持默认便可,如下是默认配置文件,方便你们作个对比参考
[root@sg-gop-10-65-32-140 wangao]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
# 安装keepalived,ipvsadm yum install keepalived -y # 若是开启防火墙,请添加VRRP白名单 -A INPUT -p vrrp -j ACCEPT -A INPUT -p igmp -j ACCEPT -A INPUT -d 224.0.0.18 -j ACCEPT # 编辑keepalived配置文件,master和backup节点配置文件同样 vi /etc/keepalived/keepalived.conf vrrp_sync_group VI_GOP_NC1_HA { group { VI_GOP_NC1_HA_PRI } } vrrp_instance VI_GOP_NC1_HA_PRI { state BACKUP interface bond0 virtual_router_id 139 priority 100 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.65.33.139/23 dev bond0 } } # 手动启动节点即为master service keepalived start
若是须要配合自定义脚本监控使用,能够参考Redis 主从同步配置实践
LVS和Keepalived的原理介绍和配置实践
LVS原理介绍和配置实践
Keepalived原理介绍和配置实践
LVS-NAT原理介绍和配置实践
LVS-DR原理介绍和配置实践
LVS-TUN原理介绍和配置实践