keepalived起初是为LVS设计的,用来监控集群系统中各个服务节点的状态,根据TCP/IP参考模型的第三,第四层,第五层交换机制检测每个服务节点的状态,若出现异常、或工作出现故障,则会将故常服务器节点从集群系统中剔除,以免影响集群效率。故障机器需要人工完成修复。
后来keepalived加入VRRP功能(VritrualRouterRedundancy Protocol:虚拟路由冗余协议),目的是为了解决静态路由出现单点故障的问题。利用VRRP位置主备负载均衡器的心跳检测,当负载均衡器出现问题时,由备用负载均衡器承载对应的业务,从而最大限度减少流量损失,并提供服务器的稳定性。VRRP可以实现网络不间断稳定运行。因此keepalived具有服务器检测和故障隔离功能,还有HAcluster功能
实现路由高可用协议。将N台提供相同功能的路由器组成一个路由器组 ,其中由一个master和多个backup,master有对外提供服务的vip(此局域网内其他机器默认该路由为vip),master会发组播(心跳),当backup接收不到vrrp包时则会认为master宕掉。这是会根据vrrp的优先级来从backup服务组中选举一个来替换宕掉的master,当主节点恢复故障时,北街店会释放主节点故障时接管的IP资源级服务,恢复到自身的备用角色。
健康检查
说明 | |
---|---|
网络层 | 通过ICMP协议向服务器集群中的每个节点发送一个ICMP数据包,如果某个节点没有返回相应数据包,那么认为该节点发生了故障,keepalived将报告这个节点失效,并从集群中剔除此节点 |
物理层 | 利用TCP协议的端口链接和扫描技术来判断集群节点的端口是否正常,keepalived一旦在传输层探测到某端口没有数据相应或数据返回,则默认发生异常,会强制剔除所对应的节点 |
链路层 | 用户通过自定义keepalived工作方式,例如程序或脚本来运行keepalived,keepalived根据用户设定的参数来检测各程序或服务是否正常,若检测结果和用户设定的不一致,则会剔除该节点 |
keepalived是模块化设计:core;check;vrrp;libipfwc;libipvs-2.4 libipvs-2.6
core : 是keepalived的核心,负责主程序的启动和维护,全局配置文件的加载解析等。
check:负责healchecker(健康监测),包括各种健康检查方式,以及对应的配置解析,
包括lvs配置解析 Vrrp:vrrpd的子进程,用来实现vrrp协议的 libipfwc:iptables
(ipchains)库,配置lvs会用到 libipvs*:配置lvs使用
注:keepalived启动后会有三个子进程
父进程:内存管理,子进程管理
子进程:vrrp子进程,收到healtchecker子进程发来的故障信息,则会产出通告,去除虚拟ip,转换为backup状态
子进程:healthchecker子进程,负责检查各自服务器的健康程度,检测到故障,会告知vrrp子进程
两个子进程都各自负责自己的事情,且都被系统watchDog看管。
配置文件分为三类:
全局配置;VRRPD配置;LVS配置
配置文件以配置块的形式存在,每个配置块都在一个闭合的{}内。
global_defs {
notification_email { #设置keepalived在发生事件的时候需要发送email的地址,可以设置多个
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
#设置通知邮件发送来自于哪里,若本地开启了发送邮件的话,可以使用默认值
smtp_server 192.168.200.1 #指定发送邮件的smtp服务器
smtp_connect_timeout 30 # 设置smtp的链接超时时间(秒)
router_id LVS_DEVEL # 运行keepalived的一个表示。多个集群设置不同
vrrp_skip_check_adv_addr # 默认是不跳过检查,检查收到VRRP通告的所有地址可能会比较耗时。此命令的意思为:如果通告与接受的上一个通告来自于相同的master路由器,则不执行检查(跳过检查)
vrrp_strict #严格遵守vrrp协议,下面情况会组织启动keepalived:1. 没有vip地址 2. 单播令居 3. 在vrrp2版本中有ipv6地址
vrrp_garp_interval 0 #在一个借口发送的两个免费app之间的延迟,可以精确到毫秒。默认是0
vrrp_gna_interval 0
}
主要分为VRRP同步组和VRRP实例
VRRP同步组:sync group,若机器有两个网段。一个内网一个外网,每个网段开启一个实例,当外网出现问题时,若没有配置VRRP同步组。VRRPD则会认为自己仍然健康,不会发生master和backup的切换,从而出现问题。若两个实例都放进一个sync group中,就不会出现此问题
VRRP实例:用来定义ip和服务器角色的
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
VI_1 #实例名
VI_2
......
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
VRRP实例就是开启 一个VRRP协议, 说明一些特征:主从,VRID。
vrrp_instance VI_1 {
state MASTER #实例初始状态,master和backup
interface ens33 #指实例绑定的网卡
virtual_router_id 51 #设置vrid标记,多个集群不能重复(0..255)
priority 100 #设置优先级,优先级高的将选举为master,master要高于backup
advert_int 1 #检查间隔时间,默认1s
# nopreempt #设置不枪战,说明此配置只能在backup主机上设置
#preempt_delay #抢占延迟,默认5分钟
#debug #debug级别
authentication { #设置认证
auth_type PASS #认证方式,支持pass和ah,官方建议pass
auth_pass 1111 #认证密码
}
virtual_ipaddress { #设置vip,可以设置多个,用于切换时的地址绑定,格式:/ brd dev scope label
192.168.200.16/24 dev eth0 label eth0:1
192.168.100.100
}
}
虚拟服务器virtual_server定义块 ,虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。 该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在viyual_server模块中的,是子模块。
virtual_server 192.168.202.200 23 { //VIP地址,要和vrrp_instance模块中
virtual_ipaddress地址一致
delay_loop 6 #健康检查时间间隔
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #负载均衡转发规则NAT|DR|RUN
persistence_timeout 5 #会话保持时间
protocol TCP #使用的协议
persistence_granularity <NETMASK> #lvs会话保持粒度
virtualhost <string> #检查的web服务器的虚拟主机(host:头)
sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用
real_server 192.168.200.5 23 { //RS的真实IP地址
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up <string> | <quoted-string> #在检测到server up后执行脚本
notify_down <string> | <quoted-string> #在检测到server down后执行脚本
TCP_CHECK { //常用
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 23 #健康检查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET{ //不常用 做ssl认证配置
url{ #检查url,可以指定多个
path /
digest <string> #检查后的摘要信息
status_code 200 #检查的返回状态码
}
connect_port <port>
bindto <IPADD>
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}
SMTP_CHECK{ //不常用
host{
connect_ip <IP ADDRESS>
connect_port <port> #默认检查25端口
bindto <IP ADDRESS>
}
connect_timeout 5
retry 3
delay_before_retry 2
helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选
}
MISC_CHECK{ //不常用
misc_path <string> | <quoted-string> #外部脚本路径
misc_timeout #脚本执行超时时间
misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,
检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
}
}
安装包获取:https://www.keepalived.org
# 同步时钟源
# yum -y install ntp ntpdate
# ntpdate cn.pool.ntp.org
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
#获取安装包
[root@mysql01 ~]# ls
keepalived-2.0.20.tar.gz
[root@mysql01 ~]# tar xzf keepalived-2.0.20.tar.gz -C /usr/local/src/
# 配置编译环境
# yum install openssl-devel gcc gcc-c++ make
# 创建安装目录
# mkdir -p /data/keepalived
# cd /usr/local/src/keepalived-2.0.20/
# ./configure --prefix=/data/keepalived
# echo $?
0
# make
# echo $?
0
# make install
# echo $?
0
# cd /usr/local/src/keepalived-2.0.20/keepalived/etc/
# cp -R init /data/keepalived/
# cp -R init /data/keepalived/etc/
# cp -R init.d /data/keepalived/etc/
# ll /data/keepalived/etc/
总用量 0
drwxr-xr-x. 2 root root 86 7月 31 21:58 init
drwxr-xr-x. 2 root root 135 7月 31 21:58 init.d
drwxr-xr-x. 3 root root 44 7月 31 18:01 keepalived
drwxr-xr-x. 2 root root 24 7月 31 17:59 sysconfig
# cp /data/keepalived/etc/init.d/keepalived /etc/init.d/
# cp /data/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# mkdir /etc/keepalived
# cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# cp /data/keepalived/sbin/keepalived /usr/sbin/
# master 端配置文件
!Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 # master|backup
interface ens33 #修改网卡
virtual_router_id 51
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.100 #虚拟ip
}
}
# backup端配置文件
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.100
}
}
[root@mysql01 etc]# systemctl start keepalived
[root@mysql01 etc]# ps -ef | grep keepalived
root 18071 1 0 16:42 ? 00:00:00 /data/keepalived/sbin/keepalived -D
root 18072 18071 0 16:42 ? 00:00:00 /data/keepalived/sbin/keepalived -D
root 18086 17809 0 16:42 pts/0 00:00:00 grep --color=auto keepalived
[root@mysql01 etc]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:a2:87:bf brd ff:ff:ff:ff:ff:ff
inet 192.168.10.102/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.100.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::3205:7fc7:e04b:5e2e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.100
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 55
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.200
}
}
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.100
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.200
}
}
------------------------------------------------------------------------------------------------------- 返回目录