1 概述
本文将介绍三个Keepalive高可用的实现案例,分别是keepalive实现LVS高可用,keepalive通过fwmark实现LVS高可用,keepalive实现Nginx高可用。
2 实验准备
.(1) 各节点时间必须同步,这个操作很关键。工具有ntp 和chrony(CentOS7上开始启用)
.(2) 确保iptables及selinux不会成为阻碍。7上要停止firewalld服务和iptables
.(3) 各节点之间可通过主机名互相通信(对KA并非必须),建议使用/etc/hosts文件实现
172.18.50.63和73 上配置
echo"172.18.50.63 node1 ">>/etc/hosts
echo"172.18.50.73 node2">>/etc/hosts
.(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(对KA并非必须,但是建议配置)
两台都要设置
172.18.50.63上配置
ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub 172.18.50.73
172.18.50.73上配置
ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub 172.18.50.63
(5)多播地址
建议更改默认的多播地址,防止冲突,可以在配置文件里的全局加入选项vrrp_mcast_group4224.100.50.100。将组播地址调整为224.100.50.100。
网卡需要支持多播模式,默认网卡都开启多播功能,可以使用如下的命令关闭多播地址(不能关闭该功能,仅当学习):
ip link set dev eth1 multicast off.
(6)测试
通过抓包查看
tcpdump -i eth1 -nn host 组播ip,如下
tcpdump -i eth1 -nn host 224.50.50.50
注意,如果对应的主服务器的keepalived服务被停了,就会发一条优先级为0的状态。查看vip地址用ip a命令查看对应主机是否将VIP加入到网卡里
3 配置介绍
.虚拟服务器:
.配置参数:
有两个配置的方法
virtual_server IP port 定义vip和端口,实现对该vip的统一调度
virtual_server fwmark int:指在keepalive的机器上的防火墙mangle表打标签。同一标签的主机实现同一的调度。如对外同一服务有两个ip,vip1 和vip2,后端有4台RS,vip1和vip2在mangle表上打同一标签,后台的4台RS都配置这两个vip,那么keepalive服务器就可以实现访问这两个vip时,实现对这四台RS的统一调度
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>:所有RS故障时,备用服务器地址 #以下配置,有几台RS就要重复配置几遍 .real_server<IPADDR><PORT> { weight <INT> RS权重 notify_up <STRING>|<QUOTED-STRING> RS上线通知脚本 notify_down <STRING>|<QUOTED-STRING> RS下线通知脚本 HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ...}:定义当前主机的健康状态检测方法 }
KeepAlived配置检测
.HTTP_GET|SSL_GET:应用层检测 HTTP_GET|SSL_GET { url{ path <URL_PATH>:定义要监控的URL status_code <INT>:判断上述检测机制为健康状态的响应码 digest <STRING>:判断为健康状态的响应的内容的校验码 } connect_timeout <INTEGER>:连接请求的超时时长 nb_get_retry <INT>:重试次数 delay_before_retry <INT>:重试之前的延迟时长 connect_ip <IPADDRESS>:向当前RS哪个IP地址发起健康状态检测请求,分流,定义用来监控的网卡和提供服务的网卡不一样 connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址 bind_port <PORT>:发出健康状态检测请求时使用的源端口 } .TCP_CHECK { connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址 bind_port <PORT>:发出健康状态检测请求时使用的源端口 connect_timeout <INTEGER>:连接请求的超时时长 }
4 案例实现
所有实验会用到通知脚本和RS配置脚本,所以,将这两个脚本单独放置
4.1示例通知脚本
这里例子是发邮件的脚本,实际情况当角色发生变化的时候,需要服务器执行什么操作可以直接写入脚本里,而不仅仅是发邮件通知,从而实现其他应用的高可用。
#!/bin/bash # contact=‘[email protected]‘ 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
.脚本的调用方法:
直接写入配置文件VRRPD配置段里
notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
重启服务,用mail查看
4.2 RS配置
#!/bin/bash # #****************************************************************************** #Author: Sunny #Date: 2017-10-24 #FileName: lvs_dr_rs.sh #version: 1.0 #Your change info: #Description: For auto set RS_dr #DOC URL: http://ghbsunny.blog.51cto.com/7759574/1975813 #Copyright(C): 2017 All rights reserved #***************************************************************************** vip=172.18.50.80 mask=‘255.255.255.255‘ dev=lo:1 rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null service httpd start &> /dev/null && echo "The httpd Server is Ready!" echo "<h1>`hostname`</h1>" > /var/www/html/index.html case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $dev $vip netmask $mask broadcast $vip up echo "The RS Server is Ready!" ;; stop) ifconfig $dev down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo "The RS Server is Canceled!" ;; *) echo "Usage: $(basename $0) start|stop" exit 1 ;; esac
4.3 keepalive实现LVS高可用
实现效果是当有请求过来时,根据轮询规则调度到后端RS,同时实现了对RS的健康性检查,同时实现VS的高可用
拓扑图如下
4.3.1 HA1 配置如下
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.50.50.50 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass sunny } virtual_ipaddress { 172.18.50.80 } notify_master "/etc/keepalived/vip1_notify.sh master" notify_backup "/etc/keepalived/vip1_notify.sh backup" notify_fault "/etc/keepalived/vip1_notify.sh fault" virtual_server 172.18.50.80 80 { delay_loop 3 lb_algo wrr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 172.18.50.65 80 { weight 2 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 2 delay_before_retry 1 } } real_server 172.18.50.75 80 { weight 1 HTTP_GET { url { path / status_code 200 } connet_timeout 1 nb_get_retry 2 delay_before_retry 1 } } } }
HA2只需调整优先级,stats 为BACKUP,网卡等相关信息,其他不变,RS配置参考3.2,注意VIP使用32位,防止路由问题,导致调度不通,然后测试
4.4 keepalive通过fwmark实现LVS高可用
基于fwmark双主模式的lvs集群,基于fwmark,实现双主高可用的前提下,根据防火墙prerouting链上的mark会将所有的请求均匀调度。
4.4.1 打标签
在两台63和73上keepalive机器上防火墙的mangle表打标签,命令如下
iptables -t mangle -A PREROUTING -d172.18.50.80,172.18.50.90 -p tcp --dport 80 -j MARK --set-mark 6
4.4.2 HA1 上配置
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.50.50.50 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass sunny } virtual_ipaddress { 172.18.50.80 } notify_master "/etc/keepalived/vip1_notify.sh master" notify_backup "/etc/keepalived/vip1_notify.sh backup" notify_fault "/etc/keepalived/vip1_notify.sh fault" } virtual_server fwmark 6 { delay_loop 3 lb_algo wrr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 172.18.50.65 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 2 delay_before_retry 1 } } real_server 172.18.50.75 80 { weight 1 HTTP_GET { url { path / status_code 200 } connet_timeout 1 nb_get_retry 2 delay_before_retry 1 } } }
4.4.3 配置RS1和RS2,参考3.2,然后进行测试
4.5 keepalive实现Nginx高可用
.keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
.vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外
.track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
.分两步:(1)先定义一个脚本;(2) 调用此脚本。
vrrp_script <SCRIPT_NAME> { script " " #这里写脚本的真实路径,也可以是bash命令 interval INT #多久执行一次脚本 weight -INT #当主服务异常,把之前定义的vrrp权重减掉多少,减少得比backup的值还低,这样就可以实现对别得应用的高可用性的支持 } track_script { #以下是调用脚本,这里相当于是虚拟路由器的代码段 SCRIPT_NAME_1 SCRIPT_NAME_2 }
示例:高可用nginx服务
两台nginx服务器上分别安装keepalive,通过脚本检查keepalive 和 nginx是否存在,实现高可用。
一般只有一台keepalive的级别高,所以该机器的nginx起作用,负责调度,当nginx异常,权重减去20后,备用的keepalive起作用,备用机器删的nginx接管工作。后端的RS是定义在nginx的http配置段里
chk_down 的函数作用是检查/etc/keepalived/down文件存在时,就返回1,就将keepalive权重减去20。vip将配置到另一台主机,使得备用主机生效。当/etc/keepalived/down删掉后,该主机的优先级就会自动加上20.重新抢占vip。
chk_nginx 的函数作用是检查nginx是否正常运行,当nginx异常时,就将keepalive优先级减去20。vip将配置到另一台主机,使得另一台的keepalive生效当nginx重新工作后,该主机的优先级就会自动加上20.重新抢占vip。
4.5.1 HA1配置如下
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.50.50.50 } vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -20 } vrrp_script chk_nginx { script "killall -0 nginx && exit 0 || exit 1" interval 1 weight -20 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass sunny } virtual_ipaddress { 172.18.50.80 } notify_master "/etc/keepalived/vip1_notify.sh master" notify_backup "/etc/keepalived/vip1_notify.sh backup" notify_fault "/etc/keepalived/vip1_notify.sh fault" track_script { chk_down chk_nginx } }
4.5.2 nginx 配置如下
http{ ...... upstream websrvs { server 172.18.50.75:80 weight=1; server 172.18.50.65:80 weight=2; server 127.0.0.1:8000 backup; } ...... } server { ..... location / { proxy_pass http://websrvs; } ...... }
4.5.3 测试
创建/etc/keeplived/down文件以及关闭keepalive查看实验