keepalived服务器
keepalived服务器
keepalived高可用原理:搭建主、备服务器一样配置,在keepalived中配置相同的vip;主服务器发送“心跳消息”给备服务器,主服务器宕机,“心跳消息”停止发送,备服务器会让vip生效,产生“IP漂移”,备服务器成为主服务器;
- 注意不能同时有两个主服务器;
- 抢占模式(默认):主服务器优先级高于备服务器,主服务器恢复后会重新“抢回”vip;
- 非抢占模式(加上nopreempt参数才能开启):主服务器恢复后成为新的备份服务器,只有当原备份服务器宕机时,才会发生IP漂移;
- keepalived是基于VRRP协议来实现高可用的;
- VRRP 协议(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种 三层网络冗余协议,核心目标是解决 “网关单点故障” 问题 —— 通过将多台物理路由器(或服务器)虚拟化为一个 “逻辑网关”(即 “虚拟路由器”),确保当主网关故障时,备网关能自动接管,实现网络访问的 无感知高可用。
keepalived三大功能
-
高可用:VIP漂移,基于VRRP协议;
-
健康检测:通过执行检查脚本或网络请求等方式检测服务是否正常;
-
负载均衡:内置LVS管理器,通过keepalived配置LVS负载均衡功能;
keepalived的安装
#最少两台虚拟机一主一备
# CentOS7
yum install -y keepalived
# Ubuntu
apt install -y keepalived
高可用的配置
#主服务器配置
vim /etc/keepalived/keepalived.conf
-------------------------------------------
! Configuration File for keepalived
global_defs {
router_id hostname1 # 标识本节点的字符串,设置为hostname即可
}
vrrp_instance VI_1 {
state MASTER # 标识主节点服务(只有MASTER和BACKUP两种,大写)
interface ens33 # VIP板顶的网卡接口
virtual_router_id 51 # 虚拟路由id,和备节点保持一致
priority 100 # 优先级,高于备节点的即可。
# nopreempt # 禁止MASTER宕机恢复后抢占服务
# smtp_alert # 激活故障时发送邮件告警
mcast_src_ip 192.168.25.50 # 本机IP地址
advert_int 1 # MASTER和BACKUP节点之间的同步检查时间间隔,单位为秒
authentication { # 验证类型和验证密码
auth_type PASS # PAAS(默认),HA
auth_pass 1234 # MASTER和BACKUP使用相同明文才可以互通
}
virtual_ipaddress { # 虚拟IP地址池,可以多个IP
192.168.25.213 # 虚拟IP1(VIP)
}
}
-----------------------------------------------
# 保存退出
#重启keepalived
systemctl restart keepalived.service
#备服务器配置
vim /etc/keepalived/keepalived.conf
-----------------------------------------------------------------
! Configuration File for keepalived
global_defs {
router_id hostname2 # 标识本节点的字符串,设置为hostname即可
}
vrrp_instance VI_1 {
state BACKUP # 标识主节点服务(只有MASTER和BACKUP两种,大写)
interface ens33
virtual_router_id 51
priority 99 # 优先级,低于主节点的即可。
mcast_src_ip 192.168.25.51 # 本机IP地址
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
#和主服务器的vip保持一致
virtual_ipaddress {
192.168.25.213
}
}
------------------------------------------------------------------
# 保存退出
#重启keepalived
systemctl restart keepalived.service
#进行验证测试
先在客户端访问vip 192.168.25.213 出来的应该是主服务器的网页
之后停掉主服务器的keepalived服务
systemctl stop keepalived.service
在到客户端访问vip 192.168.25.213 出来的应该是备份服务器的网页
之后在重新开启主服务器的keepalived服务
systemctl start keepalived.service
到客户端访问vip 192.168.25.213 出来的应该是主份服务器的网页
Keepalived高可用裂脑
什么是裂脑?
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。
裂脑的原因
1)高可用服务器对之间心跳线链路故障,导致无法正常通信。
2)高可用服务器对上开启了iptables防火墙阻挡了心跳消息传输。
3)高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败。
4)keepalived配置问题。
解决裂脑的常见方案
1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路
2)当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith 、fence)。相当于备节点接收不到心跳消息,发送关机命令通过单独的线路关闭主节点的电源。 fence和Stonith设备其实就是一个智能电源。
LVS+Keepalived 高可用高并发集群
环境准备
一台 主 keepalived 192.168.25.52 192.168.25.100(VIP)
一台 备 keepalived 192.168.25.53 192.168.25.100(VIP)
一台 nginx 192.168.25.50 192.168.25.100(VIP)
一台 nginx 192.168.25.51 192.168.25.100(VIP)
#两台nginx 操作 192.168.25.50/192.168.25.51
#先下载nginx并配置网页
apt install nginx -y
#启动
systemctl start nginx
#配置网页
echo "<h1>Nginx Server 1 (192.168.25.211)</h1>" | sudo tee /var/www/html/index.nginx-debian.html
#网站验证一下网页
#配置dr
ifconfig lo:0 192.168.25.100 netmask 255.255.255.255 up
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#两台keepalived 操作
#下载keepalived 192.168.25.52/192.168.25.53
apt install keepalived -y
#修改主服务器 配置文件 192.168.25.52
vim /etc/keepalived/keepalived.conf
--------------------------------------------------------
! Configuration File for keepalived
global_defs {
router_id lvs_1
}
vrrp_instance apache {
state MASTER
interface ens33
virtual_router_id 51
priority 100
mcast_src_ip 192.168.25.52 # 本机IP地址
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.100/24
}
}
virtual_server 192.168.25.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
real_server 192.168.25.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
real_server 192.168.25.51 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
--------------------------------------------------------
#保存退出
#重启
systemctl restart keepalived.service
#修改备服务器 配置文件 192.168.25.53
vim /etc/keepalived/keepalived.conf
---------------------------------------------------------
! Configuration File for keepalived
global_defs {
router_id lvs_1
}
vrrp_instance apache {
state BACKUP
interface ens33
virtual_router_id 51
priority 10
mcast_src_ip 192.168.25.53 # 本机IP地址
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.100/24
}
}
virtual_server 192.168.25.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
real_server 192.168.25.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
real_server 192.168.25.51 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
--------------------------------------------------------
#保存退出
#重启
systemctl restart keepalived.service
#客户端验证
浏览器搜索 vip 地址
192.168.25.100
查看是否实现负载均衡
#关闭主keepalived服务器
查看是否实现高可用 继续浏览器搜索 192.168.25.100 查看是否成功
或其他虚拟机
while true; do curl http://192.168.25.100; sleep 1; done
Keepalived + nginx高可用集群
环境准备
一台 主 keepalived 192.168.25.52 192.168.25.100(VIP)
一台 备 keepalived 192.168.25.53 192.168.25.100(VIP)
一台 nginx 192.168.25.50
一台 nginx 192.168.25.51
一台 客户端 192.168.25.x
#先在主备 keepalived服务器上下载 192.168.25.52/192.168.25.53
#下载nginx 来搭建nginx集群 实现负载均衡
#下载 keepalived
apt update
apt install -y nginx
apt install keepalived -y
#先删除默认冲突配置
sudo rm /etc/nginx/sites-enabled/default
#配置nginx集群
vim /etc/nginx/nginx.conf
#添加一下内容
#两台web服务器的IP
upstream web {
server 192.168.25.50 max_fails=2 fail_timeout=3;#3秒内失败2次,则认为此节点失效
server 192.168.25.51 max_fails=2 fail_timeout=3;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
#保存退出
#重启nginx
systemctl restart nginx
#配置 主 keepalived 配置文件 192.168.25.52
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id NGINX_DEVEL
}
vrrp_script check_nginx { #定义脚本的名称为check_nginx
script "/etc/keepalived/nginx_pid.sh" #检查对应位置的文件是否存在
interval 2 #定义执行间隔为2秒
fall 1 #失败次数为1次
}
vrrp_instance nginx { #定义实例名称为nginx
state MASTER #定义主机状态
interface ens33 #定义通信接口,VIP绑定的接口
mcast_src_ip 192.168.25.52 #定义发送vrrp广播的源地址,模式使用VIP绑定网卡的主IP地址
virtual_router_id 51#定义VRID,主从设备vrid要抑制
priority 100#定义优先级
advert_int 1 #定义检查间隔,默认1秒
authentication { #设置认证,同一vrid的设备要抑制
auth_type PASS #认证方式为PASS
auth_pass 1111 #认证密码为1111
}
track_script {
check_nginx #调用在vrrp_script中定义的内容
}
virtual_ipaddress {
192.168.25.100/24
}
}
#保存退出
#配置 备 keepalived 配置文件 192.168.25.53
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id NGINX_DEVEL
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_pid.sh"
interval 2
fall 1
}
vrrp_instance nginx {
state BACKUP
interface ens33
mcast_src_ip 192.168.25.53
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.25.100/24
}
}
#保存退出
#编辑自动关联检测脚本 192.168.25.52/192.168.25.53
vim /etc/keepalived/nginx_pid.sh
#!/bin/bash
nginx_kp_check () {
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then
/usr/sbin/nginx
sleep 1
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
}
nginx_kp_check
#保存退出
#添加权限
chmod +x /etc/keepalived/nginx_pid.sh
#重启
systemctl restart keepalived.service
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#安装nginx 搭建web服务器 192.168.25.50/192.168.25.51
apt update
apt install -y nginx
#编辑网页内容
#192.168.25.50
echo "<h1>Nginx Server 1 (192.168.25.50)</h1>" | sudo tee /var/www/html/index.nginx-debian.html
#192.168.25.51
echo "<h1>Nginx Server 2 (192.168.25.51)</h1>" | sudo tee /var/www/html/index.nginx-debian.html
#启动nginx
systemctl start nginx
#浏览器测试网页是否正常
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#客户端操作 检查实验 是否成功
1.先客户端测试负载均衡是否正常
#清除客户端缓存
sudo ip neigh flush all
while true; do curl http://192.168.25.100; sleep 1; done
2.在主keepalived 上关闭nginx
#每隔秒执行一次killall nginx命令
watch -n1 'killall nginx'
#查看vip 是否存在(检查健康检查脚本是否正常)
ip a
#到备 keepalived 上 查看 vip 是否漂移过来
ip a
#在客户端测试网页是否正常
while true; do curl http://192.168.25.100; sleep 1; done
3.重启主 keepalived 上的keepalived 服务
systemctl restart keepalived.service
#查看vip 是否回来
ip a
#查看nginx 是否被自动启动
lsof -i :80
#再次客户端测试网页
while true; do curl http://192.168.25.100; sleep 1; done
4.数据服务器宕机测试
#停止一台nginx服务
systemctl stop nginx
#客户端测试网页
while true; do curl http://192.168.25.100; sleep 1; done
#重启停掉的nginx服务
systemctl start nginx
#客户端测试网页
while true; do curl http://192.168.25.100; sleep 1; done
浙公网安备 33010602011771号