HA Server :
nginx server
HA Cluster实现方案:
vrrp 协议的实现
ais :完整的HA集群
heartbeat
corosync
keepalived:
vrrp 协议 : Virtual Redundant Routing Protocol
vrrp 协议的软件实现,原生设计的目的是为了高可用的ipvs服务
vrrp 协议完成地址流动
为VIP地址所在的节点生成ipvs规则(在配置文件中预先定义)
为ipvs集群的各RS做健康状态监测
基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务
有关keepalived术语:
虚拟路由器: Virtual Router
虚拟路由器标识: VRID(0-255)
物理路由器
master : 主设备
backup : 备用设备
priority : 优先级
VIP : Virtual IP
VMAC : Virtual MAC (23-de-99-01-22-VRID)
通告: 心跳,优先级,周期性
一些有关安全的方式:
认证: 简单的字符认证,MD5
无认证
工作模式:
主/备 : 但虚拟路径器
主/主 : 主/备(虚拟路径器1), 备/主(虚拟路径器2)
组件:
核心组件:
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 以上就开始收录在base源中
程序环境:
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
Unit File:keepalived.service
单主配置示例:
- ! Configuration File for keepalived
- global_defs {
- notification_email { #邮件目的地方
- root@localhost
- }
- notification_email_from keepalived@localhost #邮件发送方
- smtp_server 12 7.0.0.1 #邮件服务器,端口25
- smtp_connect_timeout 30 #邮件服务器连接超时
- router_id node1 #路由器的物理标识符
- vrrp_mcast_group4 224.0.41.41 # vrrp 多播地址
- }
- vrrp_instance VI_1 { #vrrp 实例配置
- state BACKUP #bakcup模式,备keepalived服务器
- interface eno16777736 #将当前虚拟路由器绑定eno16777736 物理接口
- virtual_router_id 14 #虚拟路由器的唯一ID
- priority 98 #优先级
- advert_int 1 #vrrp 通告时间间隔
- authentication { #认证
- auth_type PASS
- auth_pass 571f97b2 #加密密码 openssl rand -hex 4 认证密钥不能超过8个字符,超过8个只对前8位有效,最好使用随机生成的字符串
- }
- virtual_ipaddress { #虚拟路由器要转移的ip
- 10.1.0.91/16 dev eno16777736 # 要转移的ip及绑定的物理接口
- }
- }
vrrp_mcast_group4 224.0.41.41
keepalived 就是通过多播地址实现的
如果有MULTICAST说明该网卡支持多播,否则需要 ip link set dev eno33554984 multicast on
配置语法:
配置虚拟路由器:
- vrrp_instance
{ - ...
- }
专用参数:
state MASTER|BACKUP : 当前节点再此虚拟路由器上的初始状态,只能有一个是MASTER,余下的都是BACKUP
interface IFACE_NAME : 绑定为当前虚拟路由器使用的物理接口
virtual_route_id VRID : 当前虚拟路由器的唯一标识,范围是0-255
priority 100 : 当前主机在此虚拟路径器中的优先级,范围1-254
advent_int 1 : vrrp 通告的时间间隔
authentication {
auth_type AH|PASS
auth_pass
}
- virtual_ipaddress{
-
/ brd dev scope 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:抢占式模式下,节点上线后触发新选举操作的延迟时长;
定义通知脚本:
notify_master
notify_backup
notify_fault
notify
双主模型示例
连个转移ip,同时被一个域名解析,还可以实现负载均衡
- ! 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
- }
- }
示例通知脚本:
- #!/bin/bash
- #
- contact='root@localhost'
- notify() {
- mailsubject="$(hostname) to be $1, vip floating"
- mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
- echo "$mailbody" | mail -s "$mailsubject" $contact
- }
- case $1 in
- master)
- notify master
- ;;
- backup)
- notify backup
- ;;
- fault)
- notify fault
- ;;
- *)
- echo "Usage: $(basename $0) {master|backup|fault}"
- exit 1
- ;;
- esac
脚本的调用方法:
- notify_master "/etc/keepalived/notify.sh master"
- notify_backup "/etc/keepalived/notify.sh backup"
- notify_fault "/etc/keepalived/notify.sh fault"
虚拟服务器:
配置参数:
- virtual_server IP port | virtual_server fwmark int
- {
- ...
- real_server {
- ...
- }
- ...
- }
常用参数:
delay_loop
lb_algo rr|wrr|wlc|lblc|sh|dh : 定义调度的方法
lb_kind NAT|DR | TUN : 集群的类型
persistence_timeout
protocol TCP : 服务协议,仅支持TCP
sorry_server
real_server
- {
- weight
: 权重 - notify_up
| - notify_down
| - HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK{...} : 定义当前主机的健康状态检测方法;
- }
- HTTP_GET | SSL_GET {
- url {
- path
: 定义要检测的URL - status_code
: 判断上述检测机制为健康状态的响应码 - digest
: 判断上述检测机制为健康状态的响应的内容的校验码 - }
- nb_get_retry
: 重试次数 - delay_before_retry
: 重试之前的延迟时长 - connect_ip
:向当前RS的哪个ip地址发起健康状态检测请求 - connect_port
:向当前RS的哪个PORT发起健康状态检测请求 - bindto
:发出健康状态检测请求时使用的源地址; - bind_port
:发出健康状态检测请求时使用的源端口; - connect_timeout
:连接请求的超时时长; - }
- TCP_CHECK {
- connect_ip
:向当前RS的哪个IP地址发起健康状态检测请求 - connect_port
:向当前RS的哪个PORT发起健康状态检测请求 - bindto
:发出健康状态检测请求时使用的源地址; - bind_port
:发出健康状态检测请求时使用的源端口; - connect_timeout
:连接请求的超时时长; - }
高可用的ipvs集群示例:
- ! 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.93/16 dev eno16777736
- }
-
- notify_master "/etc/keepalived/notify.sh master"
- notify_backup "/etc/keepalived/notify.sh backup"
- notify_fault "/etc/keepalived/notify.sh fault"
- }
-
- virtual_server 10.1.0.93 80 {
- delay_loop 3
- lb_algo rr
- lb_kind DR
- protocol TCP
- sorry_server 127.0.0.1 80
-
- real_server 10.1.0.69 80 {
- weight 1
- HTTP_GET {
- url {
- path /
- status_code 200
- }
- connect_timeout 1
- nb_get_retry 3
- delay_before_retry 1
- }
- }
-
- real_server 10.1.0.71 80 {
- weight 1
- HTTP_GET {
- url {
- path /
- status_code 200
- }
- connect_timeout 1
- nb_get_retry 3
- delay_before_retry 1
- }
- }
- }
keepalived 调用外部的辅助脚本进行资源监控,并根据监控的结果状态实现有限动态调整
分两步
(1)先定义一个脚本
(2)调用此脚本
- vrrp_script
{ - script ""
- interval INT
- weight -INT
- }
- track_script {
- SCRIPT_NAME_1
- SCRIPT_NAME_2
- ...
- }
示例:高可用的nginx服务
- ! 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_script chk_down {
- script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #成功返回值为0
- interval 1 #每个1秒执行一次
- weight -5 #失败权重减去一个数值
- }
-
- vrrp_script chk_nginx {
- script "killall -0 nginx && exit 0 || exit 1"
- interval 1
- weight -5
- }
-
- 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.93/16 dev eno16777736
- }
-
- track_script { #调用前面定义过的脚本
- chk_down
- chk_nginx
- }
-
- notify_master "/etc/keepalived/notify.sh master"
- notify_backup "/etc/keepalived/notify.sh backup"
- notify_fault "/etc/keepalived/notify.sh fault"
- }