前言:
keepalived是vrrp协议的软件实现,原生设计目的为了提供高可用ipvs服务。现已成为为主流调度器提供冗余(双机热备),避免单点故障提高高可用性的一件利器。
索引:
1. 主要功能
2. HA Cluster 配置准备:
3. 程序组成
4. 主配置文件结构
5. 实现简单keepalive地址漂移配置(主从)
6. 实现负载分摊(双主)配置
7. keepalived 结合Ipvs
8. keepalived调用脚本进行资源监控
9.keepalived同步组
1.主要功能:
① vrrp协议完成地址流动(即为调度器做冗余,避免单点故障提高高可用性)
② 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
③ 为ipvs集群的各RS做健康状态检测
④ 基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,以此支持nginx、 haproxy等服务
Keepalived组成:
2. HA Cluster 配置准备:
(1) 各节点时间必须同步 ntp(centos 6), chrony(centos 7)
vim /etc/ntp.conf server 同步服务器IP ibrust #t添加一条 |
(2) 确保iptables及selinux不会成为阻碍
(3) 各节点之间可通过主机名互相通信(对KA并非必须)
建议使用/etc/hosts文件实现
(4) 各节点之间的root用户可以基于密钥认证的ssh服务完
成互相通信(对KA并非必须)
方法:
ssh-keygen #生成秘钥。第一次提示存放秘钥路径,默认~/.ssh/id_rsa回车就好。后两次是否加密秘 钥,实验方便直接回车不加密,安全性考虑应加密。 cd .ssh ssh-copy-id 目标主机名或IP #默认发送公钥,到目标主机后改名为authorized_keys |
3. 程序组成
keepalived安装配置:
CentOS 6.4+ Base源
主配置文件: /etc/keepalived/keepalived.conf
主程序文件: /usr/sbin/keepalived
Unit File: /usr/lib/systemd/system/keepalived.service
Unit File的环境配置文件: /etc/sysconfig/keepalived
配置范例:/usr/share/doc/keeplived-1.2.13/samples
配置日志:
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 2"
vim /etc/rsyslog.conf
local2.* /var/log/keepalived.log
4. 主配置文件结构(三大块)
cat /etc/keepalived/keepalived.conf GLOBAL CONFIGURATION #定义邮件通知相关,同组调度器间组播配置 Global definitions Static routes/addresses VRRPD CONFIGURATION VRRP synchronization group(s): vrrp同步组 VRRP instance(s):即一个vrrp虚拟 路由器 LVS CONFIGURATION Virtual server group(s) Virtual server(s): ipvs集群的vs和rs |
5. 实现简单keepalive地址漂移配置(主从)
5.1 实验拓扑
5.2 配置6m1
cd /etc/keepalived
cp keepalived.conf{,.bak}
vim keepalived.conf
global_defs { notification_email { root@localhost #发生故障给哪些邮箱发邮件通知 } notification_email_from 6m1@localhost #从哪个邮箱发出 smtp_server 127.0.0.1 #邮件服务器 smtp_connect_timeout 30 router_id 6m1 #当前调度器主机名(可自定义) vrrp_mcast_group4 224.100.100.43 #自定义同组调度器直接组播地址 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 #虚拟路由组id自定义,同组内调度器id应相同 priority 100 #优先级 advert_int 2 #发送间隔 authentication { auth_type PASS auth_pass centos #认证密码 } virtual_ipaddress { 172.18.43.77/24 #vip } track_interface { #当eth0出现故障时,eth1接替eth0工作 eth0 eth1 } } |
5.3 配置6m2
修改同组内另一台调度器配置,不同的配置项:
router_id 6m2
state BACKUP
priority 90
5.4 测试
两台主机启动服务,抓包观察双方组播通信过程:
可看到6m1主机一直发送自己的优先级,宣称自己的MASTER地位。6m2优先级小于100实力没人家强大,迫于淫威所以不发送信息。
将6m1服务停止,继续观察:
首先6m1发送prio=0表示自己放弃MASTER的地位,此时6m2优先级最高开始宣称主权。
另开一台主机ping 172.18.43.77可发现只有两台调度器同时服务停掉的情况下才会出现不通的状况,从侧面表现出了高可用的特性。
5.5 脚本方式实现通知功能
两台服务器自定义通知脚本,并加执行权限:
修改配置文件:
在虚拟路由器配置实例中添加如图三条配置
测试:
将6m1停止服务后,6m2会收到自己接任master的邮件
6. 实现负载分摊(双主)配置
实验目的:路由器的一个接口上创建多个虚拟路由器,使得一个实体路由器在一个虚拟路由器中作为master路由器,同时在其他的虚拟路由器中作为backup路由器。多台路由器应对不同业务分饰两角,同时承担业务实现负载均衡。
6.1 修改6m1配置文件
在实例1下新增实例2
6.2 修改6m2配置文件
新增实例2与6m1相比修改内容如下:
state MASTER
priority 100
7. keepalived 结合Ipvs
7.1keepalived.conf中关于IPVS配置段结构:
virtual_server IP port | virtual_server fwmark int { ... real_server { ... } ... } |
7.2 常用配置参数
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故障时,备用服务器地址 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 { ... }:#定义当前主机的健康状态检测方法 } |
7.3 KeepAlived应用层配置检测
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 <IP ADDRESS>: #向当前RS哪个IP地址发起健康状态检测请求 connect_port <PORT>: #向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS>: #发出健康状态检测请求时使用的源地址 bind_port <PORT>: #发出健康状态检测请求时使用的源端口 |
7.4 实验:实现keepalive结合DR模型ipvs高可用调度
实验拓扑:
① 后端真实服务器分别安装http,配置DR模型脚本
脚本如下:
#!/bin/bash # vip=172.18.43.77 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 route add -host $vip dev $dev 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 |
分别执行脚本:
② 分别配置keepalived
vim /etc/keepalived/keepalived.conf
virtual_server 172.18.43.77 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 172.18.43.71 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.18.43.72 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
③ 前端分别安装ipvsadm,重载keepalived,查看ipvs策略:
④ 测试
8. keepalived调用脚本进行资源监控
8.1 功能实现:
① keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
② vrrp_script:自定义资源监控脚本, vrrp实例根据脚本返回值(返回非0值执行下面脚本内容),公共定义,可被多个实例调用,定义在vrrp实例之外
③ track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
8.2 配置示例:
分两步: (1) 先定义一个脚本; (2) 实例中调用此脚本
vrrp_script <SCRIPT_NAME> { script "" interval INT weight -INT } track_script { SCRIPT_NAME_1 SCRIPT_NAME_2 } |
8.3 实验:
(1) 先定义一个脚本
见附件:定义脚本
(2) 实例中调用此脚本
见附件:调用脚本
9.keepalived同步组
使用场景:LVS NAT模型VIP和DIP需要同步,需要同步组
示例:
见附件:同步组
转载于:https://blog.51cto.com/arm2012/1978847