keepalived

前言

本文记录了keepalived

一、keepalived

1、keepalived概述

keepalived用于实现高可用集群
最初是为LVS设计的,专门监控各服务器
节点的状态
后来加入VRRP功能,防止单点故障

2、keepalived运行原理

keepalived检测每个服务器节点状态
当服务器节点异常或工作出现故障,keepaliived将故障节点从集群系统中剔除
故障节点恢复后,keepalived再将其加入集群系统中
所有工作自动完成,无需人工干预

3、配置keepalived

(1)配置高可用web集群

主机清单:

主机名ip
web1192.168.88.100
web2192.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
client1192.168.88.10
lvs1192.168.88.5
lvs2192.168.88.6
web1192.168.88.100
web2192.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 # 连接超时时间为346             nb_get_retry 3    # 3次访问失败则认为真实服务器故障
 47             delay_before_retry 3  # 两次检查时间的间隔348         }
 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依然可用
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值