热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Keepalived高可用

一、Keepalived高可用概念1.什么是高可用一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的自动接管,称为高可用。对于访问的用户是

一、Keepalived高可用概念

1.什么是高可用

一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的自动接管,称为高可用。对于访问的用户是无感知的。
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。
keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

2.常用的工具

1.硬件通常使用 F5
2.软件通常使用 keepalived

3.keepalived高可用故障切换转移原理

Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色

4.高可用keepalived思考问题

1.如何确定谁是主节点谁是备节点
2.如果Master故障,Backup自动接管,那么Master恢复后会夺权吗(抢占试、非抢占式)
3.如果两台服务器都认为自己是Master会出现什么问题(脑裂)

二、Nginx+Keepalived+LVS搭建

实现思路:将keepalived中的vip作为nginx负载均衡的监听地址,并且域名绑定的也是vip的地址

说明:nginx负载均衡实现高可用,需要借助keepalived地址漂移功能

1.环境准备

技术分享图片


2.保证七层负载均衡完全一致

#下载zhihu软件,web1和web2的站点内容要一致
[root@web02 ~]# ll /code/zhihu/
total 52
drwxr-xr-x. 2 www www 72 Jun 4 2018 api
drwxr-xr-x. 37 www www 4096 Jun 4 2018 app
drwxr-xr-x. 14 www www 243 Jun 4 2018 cache
-rw-r--r--. 1 www www 17603 Jun 1 2018 changelog.txt
-rw-r--r--. 1 www www 707 Jun 12 2016 index.php
drwxr-xr-x. 3 www www 50 Jun 4 2018 install
drwxr-xr-x. 2 www www 39 Jun 4 2018 language
-rw-r--r--. 1 www www 2802 Jun 12 2016 license.txt
drwxr-xr-x. 5 www www 4096 Jun 4 2018 models
drwxr-xr-x. 4 www www 72 Jun 4 2018 plugins
-rw-r--r--. 1 www www 1885 Jun 12 2016 README.md
-rw-r--r--. 1 www www 224 Jun 12 2016 robots.txt
drwxr-xr-x. 9 www www 109 Jun 4 2018 static
drwxr-xr-x. 8 www www 4096 Jun 4 2018 system
drwxr-xr-x. 2 www www 101 Jun 1 2018 tmp
drwxr-xr-x. 2 www www 6 Jun 1 2018 uploads
-rw-r--r--. 1 www www 507 Jun 1 2018 version.php
drwxr-xr-x. 3 www www 21 Jun 1 2018 views
# web两端的zhihu配置文件要一致
[root@web01 ~]# cat /etc/nginx/conf.d/zhihu.com.conf
server {
listen 80;
server_name zhihu.com;

location / {
root /code/zhihu;
index index.php;
}

location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /code/zhihu/$fastcgi_script_name;
fastcgi_param HTTPS on;
include fastcgi_params;
}
}
#配置负载均衡的证书。先配置lb01,再用scp命令同步至lb02
[root@lb01 ~]# cd /etc/nginx/ssl_key/
[root@lb01 ssl_key]# ll
total 8
-rw-r--r-- 1 www www 1383 May 8 23:02 server.crt
-rw-r--r-- 1 www www 1708 May 8 23:02 server.key
#配置 负载均衡两个端的配置文件
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# cat zhihu.com.conf
upstream zhihu_https {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name zhihu.com;
rewrite (.*) https://$server_name$1;
}
server {
listen 443 ssl;
server_name zhihu.com;
ssl_certificate /etc/nginx/ssl_key/server.crt;
ssl_certificate_key /etc/nginx/ssl_key/server.key;
location / {
proxy_pass http://zhihu_https;
include proxy_params;
}
}
#配置代理的优化文件,lb1与lb2同步
[root@lb01 nginx]# cat proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
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.安装keepalived

[root@lb01 ~]# yum install -y keepalived
#lb2也安装

4.配置keepalived


1)查找配置文件

[root@lb01 ~]# rpm -qc keepalived
主配置文件: /etc/keepalived/keepalived.conf
主程序文件: /usr/sbin/keepalived
file服务: keepalived.service
环境配置文件:/etc/sysconfig/keepalived

2)配置主节点的配置文件

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.15.3
}
}
#解释
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
#全局配置
global_defs {
#身份识别
router_id lb01
}
#配置VRRP协议
vrrp_instance VI_1 {
#状态,MASTER和BACKUP
state MASTER
#绑定网卡
interface eth0
#虚拟路由标示,可以理解为分组
virtual_router_id 50
#优先级
priority 100
#监测心跳间隔时间
advert_int 1
#配置认证
authentication {
#认证类型
auth_type PASS
#认证的密码
auth_pass 1111
}
#设置VIP
virtual_ipaddress {
#虚拟的VIP地址
192.168.15.3
}
}

3)配置备节点

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.15.3
}
}

5.启动服务

[root@lb01 ~]# systemctl start keepalived.service
[root@lb02 ~]# systemctl start keepalived.service

6.keepalived开启日志

# 查看日志存放位置
[root@lb01 ~]# tail -f /var/log/messages
#配置keepalived
[root@lb01 ~]# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIOnS="-D -d -S 0" # 大S
#配置rsyslog抓取日志
[root@lb01 ~]# vim /etc/rsyslog.conf
local0.* /var/log/keepalived.log
#!local0 ,0代表是配置日志里面的KEEPALIVED_OPTIOnS="-D -d -S 0"末尾的数字。数字要对应
#重启服务
[root@lb01 ~]# systemctl restart keepalived.service rsyslog

三、keepalived的抢占式与 非抢占式

1.两个节点都启动的情况

#两个节点都启动时,由于节点1优先级高于节点2,所以只有节点1上有VIP
[root@lb01 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0

[root@lb02 ~]# ip addr | grep 192.168.15.3

2.停止主节点

[root@lb01 ~]# systemctl stop keepalived.service
[root@lb01 ~]# ip addr | grep 192.168.15.3
#由于节点1keepalived挂掉,节点2会自动接管节点1的工作,即VIP
[root@lb02 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0

3.重新启动主节点

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0
#由于节点1优先级高于节点2,所以当节点1恢复时,会将VIP抢占回来

4.配置非抢占式


1)主节点配置

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
... ...
vrrp_instance VI_1 {
state BACKUP #必需把2台节点的state状态改成一样的BACKUP
nopreempt #非抢占式的命令,两个节点都必须加上配置
priority 100 #其中一个节点的优先级必须要高于另外一个节点的优先级
... ...
}
[root@lb01 ~]# systemctl restart keepalived.service

2)备节点配置

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
... ...
vrrp_instance VI_1 {
state BACKUP
nopreempt
priority 90
... ...
}
[root@lb02 ~]# systemctl restart keepalived.service

四、keepalived 脑裂

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。

1.脑裂的故障

1.网线松动,网络故障
2.服务器硬件故障
3.服务器之间开启了防火墙

2.脑裂模拟


1)开启防火墙

[root@lb01 ~]# systemctl start firewalld.service
[root@lb01 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0

[root@lb02 ~]# systemctl start firewalld
[root@lb02 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0

2)访问网站

#因为开启了firewalld防火墙,默认拒绝所有连接,要开启80端口
[root@lb01 ~]# firewall-cmd --add-service=http
success
[root@lb02 ~]# firewall-cmd --add-service=http
success
[root@lb01 ~]# firewall-cmd --add-service=https
success
[root@lb02 ~]# firewall-cmd --add-service=https
success
#访问页面没有任何问题

3)关闭防火墙

[root@lb02 ~]# systemctl stop firewalld.service
[root@lb02 ~]# ip addr | grep 192.168.15.3
[root@lb01 ~]# systemctl stop firewalld.service
[root@lb01 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0

3.脑裂解决的办法

#如果发生闹裂,则随机kill掉一台即可
#编写检测脚本, “测试”如果能ping通主并且备节点还有VIP的话则认为产生了脑裂
[root@lb02 ~]# vim check_keepalive.sh
#!/bin/sh
vip=192.168.15.3
lb01_ip=172.16.1.5
while true;do
ssh $lb01_ip ‘ip addr | grep 192.168.15.3‘ &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
echo "ha is 脑裂"
else
echo "ha is ok"
fi
sleep 3
done

五、高可用keepalived与nginx

Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,所以可以访问到nginx所在机器
但是.....如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill掉keepalived

1.nginx故障切换脚本

[root@lb01 ~]# vim check_web.sh
#!/bin/sh
nginxpid=$(ps -ef | grep [n]ginx | wc -l)
if [ $nginxpid -eq 0 ];then
systemctl start nginx &>/dev/null
sleep 3
nginxpid=$(ps -ef | grep [n]ginx | wc -l)
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
#2.等待3秒后再次获取一次Nginx状态
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
[root@lb01 ~]# chmod +x /root/check_web.sh #给脚本增加执行权限

2.使用keepalived配置文件调用nginx切换脚本


1)配置抢占式时

#只需要在备节点配置
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 50
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.15.3
}
#调用计划的脚本
track_script {
check_web
}
}

2)配置非抢占式时

#配置非抢占式时,两边都要配置脚本
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.15.3
}
track_script {
check_web
}
}


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
13205340728wan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有