Linux keepalived高可用集群
keepalived简介:
keepalived是为了高可用ipvs集群而设计的,主要用作realserver的健康状态检测,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的服务器从系统中移除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后keepalived自动将服务器加入到服务器集群中,这些工作全部自动完成,不需要人工干预,需要人工做的只是修复故障的服务器。
集群类型:LB、HA、HP
SPoF: Single Point of Failure
系统可用性的公式:A=MTBF/(MTBF+MTTR)
HA Cluster实现方案:
vrrp协议的实现
vrrp:虚拟冗余路由协议;
keepalived
ais:完备HA集群;
heartbeat
corosync
keepalived保持连接:
vrrp协议:Virtual Redundant Routing Protocol 虚拟冗余路由协议
术语:
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255)
物理路由器:
master:主设备
backup:备用设备
priority:优先级
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
通告:心跳,优先级等;周期性;
抢占式,非抢占式;
安全工作:
认证:
无认证
简单字符认证
MD5
工作模式:
主/备:单虚拟路径器;
主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)
keepalived:为了在Linux系统中实现vrrp协议
vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:
vrrp协议完成地址流动;
为vip地址所在的节点生成ipvs规则(在配置文件中预先定义);
为ipvs集群的各RS做健康状态检测;
基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务;
组件:
核心组件:
vrrp stack
ipvs wrapper
checkers
控制组件:配置文件分析器
IO复用器
内存管理组件
HA Cluster的配置前提:
(1) 各节点时间必须同步;
ntp, chrony
(2) 确保iptables及selinux不会成为阻碍;
(3) 各节点之间可通过主机名互相通信(对KA并非必须);
建议使用/etc/hosts文件实现;
(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)
keepalived安装配置:
CentOS 6.4之后的版本keepalived已经收录到base仓库中了。
程序环境:
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
Unit File:keepalived.service
配置文件组件部分:
TOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s)
VRRP instance(s)
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)
单主配置示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 14
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
配置语法:
配置虚拟路由器:
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_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface {
eth0
eth1
…
}
配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
nopreempt:定义工作模式为非抢占模式;
preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;
定义keepalived主备切换邮件通知脚本:
notify_master <STRING>|<QUOTED-STRING>:当前节点成为主节点时触发的脚本;
notify_backup <STRING>|<QUOTED-STRING>:当前节点转为备节点时触发的脚本;
notify_fault <STRING>|<QUOTED-STRING>:当前节点转为“失败”状态时触发的脚本;
notify <STRING>|<QUOTED-STRING>:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;
keepalived单、主配置实例:
定义keepalived主备切换邮件通知脚本:
双主模型示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 15
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
10.1.0.92/16 dev eno16777736
}
}
双主模型配置实例:
定义keepalived主备切换邮件通知脚本:
虚拟服务器:
配置参数:
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 {
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>:连接请求的超时时长;
}
实验测试:
部署一个lvs-dr类型的keepalived HA单主高可用集群:
环境介绍:
测试客户机:
client客户机IP:192.168.3.4
搭建单主高可用集群:
keepalived HA高可用集群(1)IP:192.168.3.7
keepalived HA高可用集群(2)IP:192.168.3.5
keepalived HA 高可用集群的vip:192.168.3.6
在keepalived各节点上提供sorry_server web服务;网页为:website maintenance
后台网站服务器:
realserver(1)IP地址:192.168.3.2
配置httpd服务:网页为 keepalived server 1
在lo别名网卡上配置vip地址:192.168.3.6;关闭arp_ignore和arp_announce;
realserver(2)IP地址:192.168.3.8
配置httpd服务:网页为 keepalived server 2
在lo别名网卡上配置vip地址:192.168.3.6;关闭arp_ignore和arp_announce;
1)在real server 1 和realserver2上分别执行此脚本,配置lo别名网卡上的vip和arp_ignore、arp_announce的参数。
2)在 keepalived HA高可用集群(1)IP:192.168.3.7 配置如下内容:
3)在 keepalived HA高可用集群(2)IP:192.168.3.5 配置如下内容:
4)在客户机上测试keepalived的轮循调度:
5)故意关闭一台realserver web进行测试:
6)故意关闭后台所有realserver服务,测试sorry_server web:
keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;
分两步:(1) 先定义一个脚本;(2) 调用此脚本;
调用外部脚本对keepalived进行健康状态检测机制
定义在vrrp_instance实例之外:
vrrp_script <SCRIPT_NAME> { //定义脚本
script ""
interval #
weight -#
}
定义在vrrp_instance实例之内:
track_script { //调用脚本
SCRIPT_NAME_1
SCRIPT_NAME_2
…
}
实验测试:
部署一个nginx的keepalived HA单主高可用集群:
环境介绍:
测试客户机:
client客户机IP:192.168.3.4
搭建单主高可用集群:
keepalived HA高可用集群(1)IP:192.168.3.7
keepalived HA高可用集群(2)IP:192.168.3.5
在keepalived两个节点上分别配置nginx反向代理服务;
后台网站服务器:
realserver(1)IP地址:192.168.3.2
配置httpd服务:网页为 nginx HA server 1
realserver(2)IP地址:192.168.3.8
配置httpd服务:网页为 nginx HA server 2
1)配置nginx keepalived HA高可用集群(1)IP:192.168.3.7
配置keepalived(1)上的nginx反向代理服务:
在nginx主配置文件http配置段中定义上游服务器组upstream
在nginx默认配置文件中定义反向代理的upstream组名称:
2)配置nginx keepalived HA高可用集群(2)IP:192.168.3.7
nginx keepalived HA高可用集群(2)的配置过程与 nginx keepalived HA高可用集群(1)类似,唯一的区别就是在/etc/keepalived/keepalived.conf配置文件中,如下图:
3)测试HA nginx cluster :
4)调用外部脚本 chk_dow ,使其vip地址转移到另一个keepalived节点上:
在/etc/keepalived/目录下创建一个文件down:
在去keepalived(2)节点查看IP a l
5)再次测试HA nginx cluster :
原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/60048