架构
双机高可用方法目前分为两种:
1)Nginx+keepalived 双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2)Nginx+keepalived 双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠。
下面分别是两种模式对应的架构示意图。需要说明的是,虽然每台服务器都配置了VIP,但正常情况下,对于每个VIP,同时只会有一台机器实际占用。

  1. 安装nginx
    省略
  2. 安装keepalived
    安装步骤
    说明:本文主要介绍安装keepalived时遇到的问题及解决办法,所以没有只用了两台机器,并没有介绍后端服务。另外这里只介绍了主从模式。
    主要的问题归纳:
    1. 需要从解压后的源码包去找 服务脚本,这是2.0之后的变化
    cp keepalived-2.0.15/keepalived/etc/init.d/keepalived /etc/init.d/
    2. 这个脚本里的默认路径配置不正确,需要针ubuntu做处理
    3. 这个脚本里的命令有问题,需要修改

#解压并安装

wget http://www.keepalived.org/software/keepalived-2.0.5.tar.gz
tar zxvf keepalived-2.0.15.tar.gz
cp -r keepalived-2.0.15 /usr/local/src
cd /usr/local/src/keepalived-2.0.15/
./configure --prefix=/usr/local/keepalived
make && make install

#使keepalived命令能直接使用

  cp /usr/local/keepalived/sbin/keepalived /sbin/

创建配置文件并修改

  mkdir -p /etc/keepalivedcp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/vim /etc/keepalived/keepalived.conf

为了测试方便,我的配置文件比较简单:

  cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
! Configuration File for keepalived
global_defs {router_id kp_s1   #在一个网络应该是唯一的
}
vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh" #定时检查nginx是否正常运行的脚本interval 2   #脚本执行间隔,每2s检测一次weight -5    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5fall 2       #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)rise 1       #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {#指定keepalived的角色,这里指定的不一定就是MASTER,实际会根据优先级调整,另一台为BACKUPstate MASTER   interface ens33        #当前进行vrrp通讯的网卡virtual_router_id 200  #虚拟路由编号(数字1-255),主从要一致# mcast_src_ip 192.168.79.191  #priority 100  #定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级nopreemptadvert_int 1   #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒authentication {auth_type PASSauth_pass 2222}#执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),#否则nginx监控失效!!track_script {chk_nginx    #引用VRRP脚本,即在 vrrp_script 部分指定的名字。#定期运行它们来改变优先级,并最终引发主备切换。}virtual_ipaddress {#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写192.168.79.210}
}#创建检查nginx状态的脚本
 安装 systemctl
sudo apt-get install --reinstall systemd
vim /etc/keepalived/nginx_check.sh

脚本的内容如下(检查nginx运行):

#!/bin/bash
counter=`ps -C nginx --no-heading|wc -l`
echo "$counter"
if [ "${counter}" = 0 ]; then/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confsleep 2counter=`ps -C nginx --no-heading|wc -l`if [ "${counter}" = 0 ]; then/etc/init.d/keepalived stopfi
fi
  #修改脚本权限,使其可以被执行

chmod +x /etc/keepalived/nginx_check.sh
3. 设置服务启动
复制服务脚本

  cp keepalived-2.0.15/keepalived/etc/init.d/keepalived /etc/init.d/

#注意:上面的服务启动脚本是在源文件目录,而不是安装目录(/usr/local/keepalived)下,这是2.0之后的变化。

修正相关配置问题
vim /etc/init.d/keepalived 可以看到下图内容,其中有3个地方有问题。
图中 由于 ubuntu下没有 /etc/rc.d/init.d/functions,需要为其建立软链接

 mkdir -p  /etc/rc.d/init.dln -s /lib/lsb/init-functions /etc/rc.d/init.d/functions

图中:拷贝相应文件的源配置文件
注释内容有介绍 ,这个源配置文件(在里面设置keepalived启动参数)

mkdir /etc/sysconfig
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

图中3:安装daemon,并修改命令

  1. 安装 daemon:  apt install daemon
  1. 图中3的命令 修改为daemon – keepalived ${KEEPALIVED_OPTIONS} #加了一个“–”
    说明:命令里的变量 ${KEEPALIVED_OPTIONS} 是在/etc/sysconfig/keepalived里设置的,默认内容如图。

    这里的-D 代表记录详细日志。那么命令 daemon keepalived ${KEEPALIVED_OPTIONS}的结果是
daemon keepalived -D

这个命令是有问题的,其中的-D本来是给keepalived用的,但这样组合后被认为是daemon命令的参数。这会导致服务不能启动。 如果不修改,会提示启动失败,但却不输出具体信息。但可以通过查看 /var/log/syslog 找到错误信息
$Starting keepalived: daemon: option requires an argument – ‘D’ 。这是一个底层错误,所以只在系统日志里看到。
执行 daemon --help, 可以看到帮助信息
注意:每次修改/etc/init.d/keepalived后,需要重新运行 systemctl daemon-reload 重新加载服务脚本
启动测试(两台都启动)

systemctl daemon-reload  #重新加载服务
service keepalived start  #启动keealived服务
service keepalived status #可以查看运行状态
ip a  #查看是否占用了VIP,只有主服务器可以占用,主有问题时,才会漂移到从服务器,并且从服务器状态变为MASTER 

如果启动出现问题,除了这里的输出信息,还可以通过 /var/log/syslog来查看问题
正常状态是
1) 在任意一台服务器上关闭nginx,会发现keepalived自动重启nginx
2) 关闭任意一台服务器,VIP漂移到另一台服务器

最终实现效果如下:
初始:

单点故障时:

小结:

模拟的时候先关闭keepalived,然后在关闭nginx;keepalived会不去检测nginx的状态,当其不再运行的时候就会去重启nginx,然后在检测是否为0,当重启失败的话,就关闭keepalived。然后另外一台接管。

两台机器在使用keepalived会产生脑裂现象,后续有机会在查找资料看下

参考资料:
1.https://blog.csdn.net/wwxuelei/article/details/89471839

KeepAlived+Nginx 模拟nginx单点故障转移,实现高可用相关推荐

  1. 图文教程,Nginx+Keepalived(双机热备)介绍已经搭建高可用负载均衡环境

    上一次分享了Nginx相关的应用场景如下: ​Nginx介绍以及一些应用场景说明 在实际使用,单机版的Nginx就不能满足高可用的要求了,在这种情况下,我们使用Nginx+Keepalived(双机热 ...

  2. 通过Keepalived实现金山云自建服务高可用

    通过Keepalived实现金山云自建服务高可用 用户在金山云上部署应用时,如需要MySQL, Redis等服务,建议尽量采用金山云提供的PaaS服务(比如关系型数据库-MySQL,云数据库Redis ...

  3. Windows上实现nginx的多负载,实现高可用,NLB 替代keepalived

    NLB 就是网络负载平衡,windows Server 2012 中该功能允许你将传入的请求传播到最多达32台的服务器上,即可以使用最多32台服务器共同分担对外的网络请求服务.网络负载平衡,保证即使是 ...

  4. Nginx 挂了怎么办?怎么实现高可用?

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:SimpleWu 出处:www.cnblogs.com/SimpleWu/p/11004902.html 什么是高可用? ...

  5. Nginx负载均衡之TCP端口高可用(二)

    在前面我们实现了基本的HTTP反向代理,从互联网过来的请求已经可以分发到后端多台网站服务器上,但不是所有的业务都是网络类型的,此篇文章我们主要讨论的是TCP 端口的负载均衡做法,昨天也有小伙伴提到了, ...

  6. ipvs-dr模型及算法、keepalived基本应用、keepalive+ipvs实现高可用

    keepalived应用案例及其ipvs-dr模型原理解释 [LVS--的调度方法] 分类:静态方法:只根据调度方法本身来调度,不关心RS的负载情况来调度. 动态方法:根据调度方法本身和RS的负载状况 ...

  7. Redis 那些故障转移、高可用方案

    欢迎关注方志朋的博客,回复"666"获面试宝典 Redis大家都不陌生,就算是没用过,也都听说过了. 作为最广泛使用的KV内存数据库之一,在当今的大流量时代,单机模式略显单薄,免不 ...

  8. 项目经理:你来设计一下Redis 故障转移、高可用的方案

    Redis大家都不陌生,就算是没用过,也都听说过了. 作为最广泛使用的KV内存数据库之一,在当今的大流量时代,单机模式略显单薄,免不了要有一些拓展的方案. 笔者下文会对各种方案进行介绍,并且给出场景, ...

  9. haproxy+keepalived+rabbitmq3.8实现集群的高可用

    rabbitmq部署在机房,添加镜像集群后,需要做高可用,当单机故障时可以切换到另外一台 1.修改rabbitmq的配置,引入修改相关配置的文件 # vim /usr/local/rabbitmq/s ...

  10. 【7W字长文】使用LVS+Keepalived实现Nginx高可用,一文搞懂Nginx

    往期文章一览 分布式会话与单点登录SSO系统CAS,包含完整示例代码实现 [15W字长文]主从复制高可用Redis集群,完整包含Redis所有知识点 使用LVS+Keepalived实现Nginx高可 ...

最新文章

  1. 打造生物智能和人工智能“双螺旋”,智源研究院发布“人工智能的认知神经基础”重大研究方向...
  2. 爬虫python需要什么软件-学python爬虫能做什么
  3. HDU 5239 上海大都会 D题(线段树+数论)
  4. Docker的私有镜像仓库搭建
  5. QT QTreeWidget 行切换时改变背景色
  6. stm32之电源管理(实现低功耗)
  7. BZOJ1045 HAOI2008糖果传递(贪心)
  8. SystemUI之状态栏notification icon加载流程
  9. 前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite
  10. android 图片墙拼贴,三步搞定 用APP打造图片文字拼贴效果
  11. 认识虚拟化(virtualization)
  12. 微信小程序-滚动消息通知
  13. 万能密码 php,PHP 万能密码
  14. C语言实现99乘法表
  15. 产品更新背后的达维多定律
  16. 社交鼻祖人人网被卖 曾意气风发比肩Facebook 一代人的回忆终结了
  17. 地面气象观测数据-A文件转excel方法
  18. CRC-16 CCITT
  19. 学习ARM开发(3)
  20. 利用python实现3种梯度下降算法

热门文章

  1. Eclipse — 如何导入包
  2. RK3288_Android7.1平台基于DRM框架的LCD开发
  3. rk3128平台Android7.1调试USB接口wifi总结
  4. 吴恩达深度学习笔记 第二章作业1
  5. hive中删除表的错误Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException...
  6. 第五章 MNIST数字识别问题(二)
  7. HTML5 DOM File API 转)
  8. JavaScript数字精度丢失问题总结
  9. Ajax关于readyState和status的讨论
  10. ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏...