为什么需要keepalived(保持存活)
keepalived实现高可用的工作原理
1. 准备一个集群,为了实现高可用,如nginx负载均衡的2个机器,确保用户的请求,能正确,高可用性的到达这个nginx集群
2. 部署keepalived,生成VIP,虚拟IP资源。
3. keepalived是将 一组服务器,组成一个虚拟设备组,实现他们之间的心跳通信(可以通过抓包,查看他们的通信协议,其实是VRRP虚拟路由冗余协议。)
vrrp协议图解
虚拟,路由, 冗余,协议 ,vrrp
在同一组虚拟网络设备中,master可以和backup互相通信,知道对方的存活。
vip的漂移条件是,
心跳机制。
当backup收不到master发来的心跳数据包之后,就确认master挂掉了
vrrp工作原理
1. keppalived高可用是基于VRRP虚拟路由冗余协议实现的,因此我从VRRP给您描述起
2. VRRP也就是虚拟路由冗余协议,是为了解决静态路由的单点故障;
3. VRRP通过竞选协议将路由任务交给某一台VRRP路由器。
4. VRRP正常工作时,master会自动发送数据包,backup接收数据包,目的是为了判断对方是否存活;如果backup收不到master的数据包了,自动接管master的资源;
backup节点可以有多个,通过优先级竞选,但是keepalived服务器一般都是成对出现;
5. VRRP默认对数据包进行了加密,但是官网默认还是推荐使用明文来配置认证;
说完了VRRP,我再给您描述下keepalived工作原理。
1.keepalived就是基于VRRP协议实现的高可用,master的优先级必须高于backup,因此启动时master优先获得机器的IP资源,backup处于等待状态;若master挂掉后,backup顶替上来,继续提供服务。
2.在keepalived工作时,master角色的机器会一直发送VRRP广播数据包,告诉其他backup机器,“我还活着”,此时backup不会抢夺资源,老实呆着。
当master出现问题挂了,导致backup收不到master发来的广播数据包,因此开始接替VIP,保证业务的不中断运行,整个过程小于1秒。
通过抓包工具,查看lb5和lb6的vrrp数据包的通信(心跳数据包的发送)
查看数据包
模拟master挂掉,查看数据包
目前,master会不断的向这个组播地址,发心跳数据包,。
查看数据包
恢复master机器,查看这个心跳数据包的走向。
keepalived组播原理
单播流量走向图
广播数据流
组播数据流
keepalived环境准备(实践部署)
1.先部署web机器组(web7、web8)
简单部署,让web7,web8分别提供一个不同的静态页面,能看出负载均衡的效果即可。
1. 安装nginx
yum install nginx -y
2. 部署nginx,提供静态页面的虚拟主机就OK
3.创建测试数据
echo 'web7 ~~~~~~~~~~~~~~' > /usr/share/nginx/html/index.html
echo 'web8 ====================' > /usr/share/nginx/html/index.html
4.启动2个web机器
nginx
5.本地测试,检查nginx
[root@web-7 ~]#ps -ef|grep nginx
root 2172 1 0 10:40 ? 00:00:00 nginx: master process nginx
nginx 2173 2172 0 10:40 ? 00:00:00 nginx: worker process
root 2175 2054 0 10:40 pts/1 00:00:00 grep --color=auto nginx
[root@web-7 ~]#
[root@web-7 ~]#netstat -tnlp|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2172/nginx: master
tcp6 0 0 :::80 :::* LISTEN 2172/nginx: master
[root@web-7 ~]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
2.部署负载均衡设备(lb5,lb6)
1. 安装nginx,使用它的负载均衡功能
yum install nginx -y
2. 创建负载均衡地址池
upstream web_pools {
server 10.0.0.7;
server 10.0.0.8;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://web_pools;
include proxy_params;
}
}
代理参数的配置
[root@lb-6 /etc/nginx/conf.d]#cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
3.启动nginx,查看负载均衡的效果
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
到这里,就明确配置好了 slb5 和slb6,都可以正确的进行负载均衡
3.部署两台lb设备,需要支持高可用了。(keepavlied技术)
这里得细心了,注意看配置文件。,默认基于epel源即可安装。
yum install keepalived -y
1. 部署slb5的keepalived(master角色,优先获取VIP资源,当master挂掉不可用,然后才轮到backup上场。)
注意,中文注释,别写入到配置文件中
global_defs {
router_id lb-5 # 路由器ID,每个机器不一样
}
vrrp_instance VIP_1 { # 设置VRRP路由器组组名,属于同一组的名字一样
state MASTER # 角色,master、backup两种
interface eth0 # VIP绑定的网卡
virtual_router_id 50 # 虚拟路由IP,同一组的一样
priority 150 # 优先级,优先级越高,权重越高
advert_int 1 # 发送组播间隔1s
authentication { # 认证形式
auth_type PASS # 密码认证,明文密码 1111
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 # 指定虚拟VIP地址,必须没人使用
}
}
# lb5机器的配置文件
global_defs {
router_id lb-5
}
vrrp_instance VIP_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
# 简单能理解,keepalived的配置文件,需要设置哪些参数的,扣6,
# 总结一波,如下设置,理解这个参数,是方便你如果出错,可以去拍错,检查这些参数即可。
#
router_id 在这个虚拟路由器组中的都不一样
state 只有一个master,可以有多个backup
interface 指定当前负载均衡机器的 通信的网卡即可,。
virtual_router_id 注意,每个机器,都一样,表示是一组内的设备
priority 优先级,master需要高于backup
authentication 一组设备中的master和backup的通信认证,是明文形式的 1111
这个信息,可以通过抓包看到。
virtual_ipaddress 指定VIP的ip地址,需要在局域网内,无人使用。。
# lb6机器的配置文件,注意如下部分参数,要和lb5机器区分开即可。
global_defs {
router_id lb-6
}
vrrp_instance VIP_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
4.分别启动两台机器的keepalived
systemctl start keepalived
5.绑定客户端的VIP,访问查看效果,查看日志
10.0.0.3 www.linux0224.cc
keepalived脑裂问题
2.如何解决脑裂
基于shell脚本去维护。
问题1,故障出在了backup机器,抢夺了VIP问题1,故障出在了backup机器,抢夺了VIP
[root@lb-6 /etc/keepalived]#ls
check_vip.sh keepalived.conf
# 1.在backup机器,设置好监控脚本
[root@lb-6 /etc/keepalived]#
[root@lb-6 /etc/keepalived]#cat check_vip.sh
#!/bin/bash
MASTER_VIP=$(ssh 10.0.0.5 ip a|grep 10.0.0.3|wc -l)
MY_VIP=$(ip a|grep 10.0.0.3|wc -l)
# 如果远程有VIP并且自己本地也存在了VIP,就干掉自己
if [ ${MASTER_VIP} == 1 -a ${MY_VIP} == 1 ]
then
systemctl stop keepalived
fi
# 2. 让keepalived去检测使用这个脚本,修改配置文件如下
【前提矫健是,lb5和lb6机器可以免密登录,才可以远程执行命令,以及给脚本添加可执行权限】
global_defs {
router_id lb-6
}
# 定义脚本
vrrp_script check_vip {
script "/etc/keepalived/check_vip.sh"
interval 5 # 脚本执行的时间间隔
}
vrrp_instance VIP_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
# 调动脚本
track_script {
check_vip
}
}
[root@lb-6 /etc/keepalived]#chmod +x check_vip.sh
[root@lb-6 /etc/keepalived]#ssh-copy-id root@10.0.0.5
确保可以正确重启keepavlied
[root@lb-6 /etc/keepalived]#systemctl restart keepalived
[root@lb-6 /etc/keepalived]#systemctl status keepalived
去手动,让backup机器,抢夺VIP资源,如开启防火墙服务
systemctl restart firewalld
3. 等待,查看backup机器的是否会干掉自己的keepalived以及检查VIP
故障2,master机器出现了nginx挂掉的解决方案
这个脚本,运行于 master机器
#!/bin/bash
NGINX_STATUS=$(ps -ef|grep ngin[x]|wc -l)
# 如果nginx挂了
if [ ${NGINX_STATUS} == 0 ]
then
systemctl restart nginx
# 如果重启失败
if [ $? == 1 ]
then
# keepalived没必要活着了
systemctl stop keepalived
fi
fi
# 给脚本执行权限
[root@lb-5 /etc/keepalived]#vim check-web.sh
[root@lb-5 /etc/keepalived]#chmod +x check-web.sh
修改keepalived配置文件
global_defs {
router_id lb-5
}
vrrp_script check_web {
script "/etc/keepalived/check_web.sh"
interval 5
}
vrrp_instance VIP_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web
}
}
[root@lb-5 /etc/keepalived]#systemctl restart keepalived
[root@lb-5 /etc/keepalived]#systemctl status keepalived
[root@lb-5 ~]#echo 'yuchaoit.cn' >> /etc/nginx/nginx.conf
[root@lb-5 ~]#systemctl stop nginx
5.此时已经正确切换到backup了。
标签:负载,lb,etc,keepalived,nginx,master,均衡,root
From: https://www.cnblogs.com/btcm409181423/p/18111695