前言
本文记录了keepalived
一、keepalived
1、keepalived概述
keepalived用于实现高可用集群
最初是为LVS设计的,专门监控各服务器
节点的状态
后来加入VRRP功能,防止单点故障
2、keepalived运行原理
keepalived检测每个服务器节点状态
当服务器节点异常或工作出现故障,keepaliived将故障节点从集群系统中剔除
故障节点恢复后,keepalived再将其加入集群系统中
所有工作自动完成,无需人工干预
3、配置keepalived
(1)配置高可用web集群
主机清单:
主机名 | ip |
---|---|
web1 | 192.168.88.100 |
web2 | 192.168.88.200 |
配置
# 在两台web上安装keepalived
# pubserver主机
# vim 07-installkeepalived.yml
---
- name : install keepalived
hosts : webservers
tasks :
- name : install keepalived
yum :
name : keepalived
state : present
###
# 运行ansible
ansible-playbook 07-installkeepalived
# 修改配置文件(web1)
# vim /etc/keepalived/keepalived.conf
12 router_id web1 # 设置本机在集群中的唯一识别符
13 vrrp_iptables # 自动配置iptables放行规则
... ...
20 vrrp_instance VI_1 {
21 state MASTER # 状态,主为MASTER,备为BACKUP
22 interface eth0 # 网卡
23 virtual_router_id 51 # 虚拟路由器地址
24 priority 100 # 优先级
25 advert_int 1 # 发送心跳消息的间隔
26 authentication {
27 auth_type PASS # 认证类型为共享密码
28 auth_pass 1111 # 集群中的机器密码相同,才能成为集群
29 }
30 virtual_ipaddress {
31 192.168.88.80/24 # VIP地址
32 }
33 }
###
# 删除下面所有行
# 在末行模式下dG
# 启动keepalived
systemctl start keepalived
# 查看vip
ip a s eth0 | grep '88'
# 修改配置文件(web2)
# vim /etc/keepalived/keepalived.conf
12 router_id web2 # 设置本机在集群中的唯一识别符
13 vrrp_iptables # 自动配置iptables放行规则
... ...
20 vrrp_instance VI_1 {
21 state BACKUP # 状态,主为MASTER,备为BACKUP
22 interface eth0 # 网卡
23 virtual_router_id 51 # 虚拟路由器地址
24 priority 80 # 优先级
25 advert_int 1 # 发送心跳消息的间隔
26 authentication {
27 auth_type PASS # 认证类型为共享密码
28 auth_pass 1111 # 集群中的机器密码相同,才能成为集群
29 }
30 virtual_ipaddress {
31 192.168.88.80/24 # VIP地址
32 }
33 }
###
# 删除下面所有行
# 在末行模式下dG
# 启动keepalived
systemctl start keepalived
# 查看ip,web2不会出现vip
ip a s eth0 | grep '88'
在client1主机上
# 测试,现在访问88.80,看到是web1上的内容
curl http://192.168.88.80
输出
Welcome from web1
在web1主机上
# 模拟web1出故障
systemctl stop keepalived.service
在client1主机上
#访问测试,看到web2上的内容
curl http://192.168.88.80
输出
Welcome from web2
在web2主机上
# 在web2上查看vip,可以查看到vip 192.168.88.80
ip a s | grep '88'
使用跟踪脚本
keepalived默认只提供一个vip对运行了什么服务不知道
track_script用于检查一个脚本的返回值,如果返回值为1,则当前主机处于异常状态,需要将vip地址切换到另一台备用机上,返回值为0就是正常的
track_script来检测应用程序或服务是否正常,可以增加vip地址更准确、可靠的自动切换功能,提高系统的可用性和可靠性
# 在MASTER上创建监视脚本 (web1)
# vim .etc/keepalived/check_http.sh
#!/bin/bash
ss -tlnp | grep :80 &> /dev/null && exit 0 || exit 1
###
# 添加可执行权限
chmod +x /etc/keepalived/check_http.sh
#修改MASTER配置文件,使用脚本
# vim /etc/keepalived/keepalived.conf
1 ! Configuration File for keepalived
2
3 global_defs {
...略...
18 }
19
20 vrrp_script chk_http_port { # 定义监视脚本
21 script "/etc/keepalived/check_http.sh"
22 interval 2 # 脚本每隔2秒运行一次
23 }
24
25 vrrp_instance VI_1 {
26 state MASTER
27 interface eth0
28 virtual_router_id 51
29 priority 100
30 advert_int 1
31 authentication {
32 auth_type PASS
33 auth_pass 1111
34 }
35 virtual_ipaddress {
36 192.168.88.80/24
37 }
38 track_script { # 引用脚本
39 chk_http_port
40 }
41 }
###
# 重起服务
systemctl restart keepalived.service
#测试,关闭web1的nginx后,VIP将会切换至web2
在web1主机
systemctl stop nginx.service
ip a s | grep 88
在web2主机
ip a s | grep 88
#当MASTER的nginx修复后,VIP将会切换回至web1
在web1主机
systemctl start nginx.server
ip a s | grep 88
在web2主机上
ip a s | grep 88
(2)配置高可用、负载均衡的web集群
主机清单:
主机名 | ip |
---|---|
client1 | 192.168.88.10 |
lvs1 | 192.168.88.5 |
lvs2 | 192.168.88.6 |
web1 | 192.168.88.100 |
web2 | 192.168.88.200 |
LVS模式:LVS-DR |
# 环境准备
# 关闭并卸载两台web的keepalived
在pubserver上
# vim 08-rmkeepalived.yml
---
- name : remove keepalived
hosts : webservers
tasks :
- name : stop keepalived
service :
name : keepalived
state : stopped
- name : uninstall keepalived
yum :
name : keepalived
state : absent
# 运行ansible
ansible-playbook 08-rmkeepalived.yml
新建lvs2并设置ip地址192.168.88.6
配置高可用、负载均衡
# 在两台web上配置lo口vip
配置两台web的内核参数
删除lvs1上的eth0的ip,因为会在keepalived上配置
# vim 09-dellvs1vip.yml
---
- name: del lvs1 vip
hosts: lvs1
tasks:
- name: rm vip
lineinfile: # 在指定文件中删除行
path: /etc/sysconfig/network-scripts/ifcfg-eth0
regexp: 'IPADDR2=' # 正则匹配
state: absent
notify: restart system
handlers:
- name: restart system
shell: reboot
###
# 运行ansible
ansible-playbook 09-dellvs1vip.yml
# 查询结果
ip a s eth0 | grep 88
# 删除lvs1上的规则
ipvsadm -Ln
ipvsadm -D -t 192.168.88.15:80
在LVS上配置keepalived
pubserver上
# 修改pubserver的主机清单,添加lvs1
#vim inventory
...
[lb]
lvs1 ansible_host=192.168.88.5
lvs2 ansible_host=192.168.88.6
###
#安装软件包,直接使用01的yml文件修改
cp 01-yum.yml 10-yum.yml
# vim 10-yum.yml
---
- hosts : lb
name : config repos.d
tasks :
- name : delete repos.d
file :
path : /etc/yum.repos.d/
state : absent
- name : create repos.d
file :
path : /etc/yum.repos.d/
state : directory
mode : '0775'
- name : upload local88
copy :
src : files/local88.repo
dest : /etc/yum.repos.d/
###
# 运行ansible
ansible-playbook 10-yum.yml
# vim 11-installlvs2.yml
---
- name : install lvs keepalived
hosts : lb
tasks :
- name : install pkgs
yum :
name : keepalived,ipvsadm
state : present
###
# 运行ansible
ansible-playbook 11-installlvs2.yml
# 修改配置文件
在lvs1上
#vim /etc/keepalived/keepalived.conf
12 router_id lvs1 # 为本机取一个唯一的id
13 vrrp_iptables # 自动开启iptables放行规则
... ...
20 vrrp_instance VI_1 {
21 state MASTER
22 interface eth0
23 virtual_router_id 51
24 priority 100
25 advert_int 1
26 authentication {
27 auth_type PASS
28 auth_pass 1111
29 }
30 virtual_ipaddress {
31 192.168.88.15 # vip地址,与web服务器的vip一致
32 }
33 }
# 以下为keepalived配置lvs的规则
35 virtual_server 192.168.88.15 80 { # 声明虚拟服务器地址
36 delay_loop 6 # 健康检查延迟6秒开始
37 lb_algo wrr # 调度算法为wrr
38 lb_kind DR # 工作模式为DR
39 persistence_timeout 50 # 50秒内相同客户端调度到相同服务器
40 protocol TCP # 协议是TCP
41
42 real_server 192.168.88.100 80 { # 声明真实服务器
43 weight 1 # 权重
44 TCP_CHECK { # 通过TCP协议对真实服务器做健康检查
45 connect_timeout 3 # 连接超时时间为3秒
46 nb_get_retry 3 # 3次访问失败则认为真实服务器故障
47 delay_before_retry 3 # 两次检查时间的间隔3秒
48 }
49 }
50 real_server 192.168.88.200 80 {
51 weight 2
52 TCP_CHECK {
53 connect_timeout 3
54 nb_get_retry 3
55 delay_before_retry 3
56 }
57 }
58 }
# 以下部分删除
###
# 启动keepalived
systemctl start keepalived
# 测试(lvs1主机)
ip a s | grep 88
ipvsadm -Ln
# 测试(client1主机)
for i in {1..6}; do curl http://192.168.88.15/; done
ps:我这里出错了,能查到ip但是无法正常访问,检错后发现vip子网掩码错误,修改配置文件vip地址
virtual_ipaddress {
31 192.168.88.15/24 # vip地址,与web服务器的vip一致
32 }
35 virtual_server 192.168.88.15/24 80 { # 声明虚拟服务器地址
修改ip后发现依然没有修复,最后发现是因为上一个配置的ipvsadm添加的规则没有删除,导致80端口被监听到上一个5ip去了,所以要记得删规则。
正常情况下会连续输出同一个web2,因为配置文件里由保持同一个服务器给同一个用户,想要看到加权轮询只需要禁用就可以
在lvs1上
# vim /etc/keepalived/keepalived.conf
39 #persistence_timeout 50
# 重启keepalived
配置lvs2
在lvs1上
scp /etc/keepalived/keepalived.conf 192.168.88.6:/etc/keepalived/
在lvs2上
# vim /etc/keepalived/keepalived.conf
12 router_id lvs2
21 state BACKUP
24 priority 80
###
# 启动keepalived
systemctl start keepalived
ipvsadm -Ln
# 测试
lvs1:
poweroff
lvs2:
ip a s | grep 88
client1:
# 多次运行
curl http://192.168.88.15/
#vip依然可用