Keepalived原理 Keepalived原理 keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件 core check vrrp libipfwc libipvs-2.4 libipvs-2.6 core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等 check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析 vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的 libipfwc:iptables(ipchains)库,配置LVS会用到 libipvs*:配置LVS会用到 注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已 keepalived启动后会有三个进程 父进程:内存管理,子进程管理等等 子进程:VRRP子进程 子进程:healthchecker子进程 有图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态
genhash 用法:
[root@localhost bin]# ./genhash -s 192.168.100.101 -p 80 -u / #genhash http 页面探测时检查hash 值,首先要获取hash 值 MD5SUM = 47f174a067d193f370407ec4aa882ab0 [root@localhost bin]#
配置文件详解:本次测试着重点在keepalived 中使用LVS 功能
[root@localhost keepalived]# cat keepalived.conf ! Cconfiguration File for keepalived global_defs { #全局配置段 notification_email { #定义报警邮件接收地址 test1@ppap.com test2@ppap.com test3@ppap.com } notification_email_from error_from@ppap.com #定义告警邮件发送邮箱 smtp_server 114.114.114.114 #定义邮箱服务器 smtp_connect_timeout 30 #定义邮件发送超时时间 router_id lvs_1 #定义路由标识信息,相同局域网唯一 } vrrp_instance VI_1 { #定义vrrp 实例,实例可以定义多个,在主+主,主+主+备 分别在不通服务器调用 state MASTER #状态参数,标识在当前主机上,实列状态,有master/backup interface ens33 #指定绑定虚IP的网卡设备 virtual_router_id 51 #路由 id 标识,用于区分不同vrrp 实例,相同实例id 必须一致:[0-255] priority 100 #定义当前实例的优先级,优先级大小决定主备 advert_int 1 #主备通讯时间间隔 authentication { auth_type PASS #定义实例认证类型 auth_pass 1111 #定义认证密码 } virtual_ipaddress { #定义vrrp 需要发布的虚拟ip ,可以绑定网卡 192.168.100.201/24 192.168.100.202/24 192.168.100.203/24 dev eth2 label eth2:1 指定网卡和名称 } nopreempt #开启不抢占功能,默认抢占 } virtual_server 192.168.100.201 80 { #定义虚拟服务地址端口 delay_loop 10 #查询后端real_server 状态间隔时间 lvs_sched wlc #定义lvs 负载算法 lvs_method DR #定义lvs 模式 persistence_timeout 300 #定义会话保持时间 protocol TCP #定义负载协议为tcp real_server 192.168.100.101 80 { #定义real_server weight 1 #设置权重为1 ,默认为1 uthreshold 10000 #最大连接阈值 TCP_CHECK { connect_timeout 5 #定义探测超时时间默认为5 s retry 3 #尝试三次 } } real_server 192.168.100.103 80 { weight 1 # 设置权重为1,默认1 uthreshold 5000 # 设置连接最大阈值 HTTP_GET { url { path / digest c32410fe653866bfc3e85c896a4abc94 status_code 200 #正常应该是 200 状态码 } connect_timeout 5 #定义探测超时时间,默认5s retry 3 # 尝试 3 次 } } }
测试结果:
[root@localhost keepalived]# ip addr 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 UP group default qlen 1000 link/ether 00:50:56:2d:b8:9a brd ff:ff:ff:ff:ff:ff inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.100.201/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet 192.168.100.202/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::18a9:d1fe:4955:8559/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@localhost keepalived]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.100.201:80 wlc persistent 300 -> 192.168.100.101:80 Route 1 0 4 -> 192.168.100.103:80 Route 1 0 0
停止其中一个节点服务: 重启节点只能重新加载keepalived 配置
[root@localhost /]# systemctl stop httpd
[root@localhost /]#
Mar 1 04:30:12 localhost Keepalived_healthcheckers[2966]: Error connecting server [192.168.100.103]:80. Mar 1 04:30:15 localhost Keepalived_healthcheckers[2966]: Error connecting server [192.168.100.103]:80. Mar 1 04:30:15 localhost Keepalived_healthcheckers[2966]: Check on service [192.168.100.103]:80 failed after 1 retry. Mar 1 04:30:15 localhost Keepalived_healthcheckers[2966]: Removing service [192.168.100.103]:80 from VS [192.168.100.201]:80 Mar 1 04:30:15 localhost Keepalived_healthcheckers[2966]: Remote SMTP server [114.114.114.114]:25 connected.