高可用:
lvs本身不支持高可用;
在lvs集群中,可能有两种故障:
1.Director故障不可用;
keepalived:原生的lvs的Director高可用解决方案;
heartbeat
corosync/pacemaker:通用的高可用解决方案;
2.后端RS故障不可用;
lvs的Director不考虑后端RS的可用与否,只是按照调度算法进行客户端请求调度;
完整的实现:周期性的对各个RS进行健康状态检测;
检测失败:应该从lvs集群服务中将对应的RS移除;
检测成功:将对应RS重新加入lvs集群服务中;重新创建lvs集群服务;
所有的RS检测均失败:临时删除lvs集群服务,并使调度器本地的web服务能够响应一个相对比较友好的错误页面,sorry_server;
检测方式:
网络层检测;ping
传输层检测:端口探测,nmap
应用层检测:文件资源的存在性检测;文件访问权限检测;文件内容有效性检测;
keepalived:后端RS的健康状态检测;
可用性:
A=MTBF/(MTBF+MTTR)
A ∈ (0,1)
50%, 90%, 95%
99%, 99.9%, 99.99%, 99.999%
提高可用性的有效的方案:降低MTTR;
方法:冗余 + 自动故障倒换;
高可用的内容:
服务高可用;
资源高可用;
HA Cluster实现方案:
基于VRRP协议的实现:
keepalived,专用于高可用lvs的Director;
基于AIS的实现:完备的HA集群;
heartbeat
corosync + pacemaker
keepalived:
VRRP协议:Virtual Redundancy Router Protocol,虚拟路由器冗余协议;
VRRP技术术语:
虚拟路由器:虚拟的路由器的接口;
VRID:虚拟路由器标识符,描述路由器的分组;并且可以确定虚拟路由器的虚拟MAC地址,取值范围为:0-255(00-ff);
MASTER:虚拟IP地址的拥有者,可以利用虚拟IP地址接收用户请求,并且能够完成数据转发功能;
BACKUP:不参与数据转发,仅检测MASTER的健康状态;
虚拟IP地址:VIP,虚拟路由器接口的IP地址;
虚拟MAC地址:VMAC,00-00-5e-00-01-{VRID}
优先级:选举成为MASTER的主要的参考标准,取值范围为:0-255;
0:放弃MASTER选举;
255:虚拟IP地址和某个路由器接口的IP地址相同,则该路由器会自动获得255的优先级,从而直接成为MASTER;
1-254:越大越有可能成为MASTER;
非抢占式:如果MASTER故障导致状态发生变化,则所有的BACKUP会重新选举产生新的MASTER;此时,如果原来的MASTER从故障中恢复,则直接成为BACKUP状态,直到当前的MASTER故障之后,所有的BACKUP重新选举MASTER时,其才能重新称为新的MASTER;
抢占式:如果MASTER故障导致状态发生变化,则所有的BACKUP会重新选举产生新的MASTER;此时,如果原来的MASTER从故障中恢复,则立即通告自己的优先级并启动新一轮选举,之后重新成为MASTER;
VRRP的认证方式:
无认证
简单字符串认证
MD5
VRRP的工作模式:
单个实例:MASTER/BACKUP
多个实例:MASTER/BACKUP, MASTER/MASTER
keepalived:
VRRP协议在linux系统中的应用实现;最初的设计目的就是为了高可用ipvs调度器;某些场合,简称其为"ka";
keepalived通过调用内核中的系统调用接口完成ipvs的规则编写,从而可以用于管理lvs集群服务;所有的规则,都定义在其配置文件中;
keepalived还可以对VIP地址进行浮动设置;
keepalived还可以为后端各RS提供健康状态检测,可以基于传输层及应用层实现;
keepalived还可以基于外部脚本调用接口完成脚本中定义的功能,甚至可以高可用其他的非lvs服务;
keepalived在RHEL 6.4+或CentOS 6.4+的发行版本的操作系统中,被收录到官方系统光盘镜像之中,直接基于本地Base源使用yum命令完成安装即可;
keepalived的组件:
控制面板:配置文件分析器;
内存管理组件;
IO复用器组件;
核心组件:
VRRP Stack:实现VRRP协议功能的组件;
Checkers:后端RS做健康状态检测的组件;
SMTP:调用SMTP协议,将路由器状态转换的消息以邮件的形式发送到指定管理员邮箱;
Watch Dog:监控Checkers和VRRP Stack的工作状态;如果异常,负责重新启动keepalived进程;
ipvs wrapper:向内核中的ipvs框架传输ipvs规则,用于构建、管理、移除lvs集群服务及集群中的RS的组件;
netlink reflactor:管理虚拟路由器接口;
配置HA Cluster的前期准备:
1.各个节点主机之间时间必须同步,可以使用时间服务器,如ntp或chrony;
2.确保iptables和SELinux的规则不会阻碍各个节点之前的数据通信;
3.各个节点主机之间需要通过主机名互相通信(对ka并非必须);
4.出于安全考量,各个节点主机之间可以以root用户的身份,基于密钥认证的方式进行ssh通信(对于ka非必须);
keepalived安装:
在CentOS 7.2中,直接使用光盘镜像yum仓库,使用yum install keepalived安装即可;
程序环境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:/usr/lib/systemd/system/keepalived.service
主配置文件的结构:
GLOBAL CONFIGURATION
Global definitions
global_defs {
notification_email {
[email protected] //配置接收邮件通知的邮箱地址;
}
notification_email_from [email protected]
smtp_server 127.0.0.1 //设定用于发送电子邮件的邮件服务器;
smtp_connect_timeout 30 # integer, seconds
router_id my_hostname //设置路由器ID,仅仅为了区分不同的设备而已;如果不修改,也不会影响keepalived服务本身;
vrrp_mcast_group4 224.0.0.18 //设置发送VRRP协议通过的目标组播通信地址;必须保证所有参数选举的路由器都必须有相同的组播通信地址;
}
VRRPD CONFIGURATION
vrrp_instance inside_network { //定义VRRP的实例及实例名称;
state MASTER //指定当前设备的初始状态;
interface eno16777736
//指定被VRRP协议绑定的网络接口,即发送VRRP通过信息的网络接口;
virtual_router_id 51 //指定虚拟路由器标识,用于确定VRRP备份组;
priority 100 //指定当前节点的优先级,指定的范围为:1-254;
advert_int 1 //发送VRRP通过的时间间隔,单位是秒;
authentication {
auth_type PASS //设置VRRP协议各节点之间的认证方式,PASS表示简单密码
auth_pass MTUwPBjd //设置认证密码,不超过8个字符;
}
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
} //设置虚拟IP地址的专用上下文
nopreempt //设置当前节点为非抢占模式,默认为抢占模式;
preempt_delay 300 //抢占模式开始前的延迟时间;
notify_master <STRING>|<QUOTED-STRING>
notify_backup <STRING>|<QUOTED-STRING>
notify_fault <STRING>|<QUOTED-STRING>
//设置当当前服务器状态发生变化时,所触发的脚本文件的路径及相关参数;
track_script {
SCRIPT_NAME
}
}
LVS CONFIGURATION
virtual server vip vport | fwmark <INT> {
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> //如果后端RS全部不可用,则需要临时删除lvs集群服务,并设置本地的http服务为sorry-server,提供友好的错误页面;
real_server <IPADDR> <PORT> {
weight <INT> //指定当前RS的权重;
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
//当RS的状态转为UP或DOWN时,发送通知所使用的脚本路径及参数设定;
HTTP_GET|SSL_GET {
url {
path <STRING> //指定进行后端RS健康状态检测的URL地址;
digest <STRING> //比较被检测资源的md5值是否发生变化;
status_code <INT> //根据响应报文的状态码进行后端RS的健康状态检测;
}
nb_get_retry <INT> //指定对后端RS进行健康状态检测重试的次数上限;
delay_before_retry <INT> //每次重试之前的延迟时间;
connect_ip <IP ADDRESS>
connect_port <PORT>
//向后端RS的哪个IP地址和哪个端口发出健康状态检测请求;
bindto <IP ADDRESS>
bind_port <PORT>
//向后端RS发出健康状态检测请求的源IP地址和源端口号;
connect_timeout <INTEGER> //连接超时时间;
}
TCP_CHECK {
connect_ip <IP ADDRESS>
connect_port <PORT>
//向后端RS的哪个IP地址和哪个端口发出健康状态检测请求;
bindto <IP ADDRESS>
bind_port <PORT>
//向后端RS发出健康状态检测请求的源IP地址和源端口号;
connect_timeout <INTEGER> //连接超时时间;
}
}
}
原文地址:http://blog.51cto.com/chenliangdeeper/2125796