原理

nginx 可以实现负载均衡,但 nginx 自身存在单点故障的问题,这时候最先想到的就是 keepalived,可以解决单点故障的问题

由于没有使用 lvs,所以这里 nginx 之间不存在负载均衡

同时,如果 keepalived 的 master 节点 nginx 服务宕了以后,如果 keepalived 还在运行,则用户就访问不到 nginx 服务了,所以需要添加监控脚本,当 nginx 宕机时,杀死本机的 keepalived 服务

这样,keepalived 的 master 就会切换,同时用户访问的 nginx 服务也会切换到原来的 backup 节点

测试节点

  RIP VIP
MASTER 192.168.132.136 192.168.132.200
SLAVE 192.168.132.140 192.168.132.200

配置nginx

安装 nginx 不是重点,这里就是用 yum 简单安装
  1. yum -y install nginx
  2. systemctl start nginx

配置keepalived

安装 keepalived 使用 yum 安装即可
keepalived 配置如下:
  1. global_defs {
  2. notification_email {
  3. chen@test.com
  4. }
  5. notification_email_from chen@test.com
  6. smtp_server smtp.exmail.qq.com
  7. smtp_connect_timeout
  8. router_id my-slave
  9. }
  10.  
  11. vrrp_script chk_nginx {
  12. script "/etc/keepalived/nginx_check.sh"
  13. interval
  14. }
  15.  
  16. vrrp_instance my_nginx {
  17. state MASTER # BACKUP 节点这里配置成 BACKUP
  18. interface ens37
  19. virtual_router_id
  20. priority # BACKUP 节点配置要比该值小
  21. advert_int
  22.  
  23. # vrrp_script定义的chk_nginx需要放到vrrp_instance里,用track_script指定,才能执行
  24. track_script {
  25. chk_nginx
  26. }
  27.  
  28. authentication {
  29. auth_type PASS
  30. auth_pass
  31. }
  32. virtual_ipaddress {
  33. 192.168.132.200/ dev ens37 label ens37:
  34. }
  35. }
以上配置中,重点在脚本 /etc/keepalived/nginx_check.sh
该脚本会被每 5s 执行一次,用来检测 nginx 是否存活,如果不存活,则尝试重启 nginx,启动失败的话,会将本机的 keepalived 服务也杀死,保证切换主节点,不影响 nginx 访问
脚本 /etc/keepalived/nginx_check.sh 内容如下:
  1. #!/bin/bash
  2.  
  3. # 注意,整个脚本的执行时间必须小于keepalived中定义的时间间隔,即interval定义的时间,否则下次执行脚本时,会杀死上次正在执行的脚本
  4. systemctl status nginx &> /dev/null
  5. # 检查nginx状态,nginx正常运行,$?为0,否则为非零数
  6. if [ $? -ne ];then
  7. systemctl start nginx
  8.  
  9. # 启动nginx后等待2s,保证nginx已经正常启动运行,如果nginx还未正常运行,则关闭keepalived服务,使用备用keepalived
  10. sleep
  11. systemctl status nginx &> /dev/null
  12.  
  13. if [ $? -ne ];then
  14. systemctl stop keepalived
  15. fi
  16. fi

keepalived 配置公网虚拟IP

因为内网IP我们可以随意支配,随意容易配置,但配置公网虚拟IP时,还是有很大不同的,这里以云厂商提供的云主机为例
首先,需要主备keepalived机器都包含两个网卡,其中一个网卡为绑定内网,另一个绑定公网
事实上,两台云主机只需要有一个绑定了公网即可,但网卡数量不能少
大部分云厂商提供的云主机中,都包含公网网卡,但是也有只有内网网卡的
之所以可以使用公网IP访问,应该是通过路由器设置的,如金山云的云主机就只有内网网卡,这种机器暂时不知道怎么配置keepalived 的虚拟公网IP
 
这里服务器ip如下:
服务器 内网 外网
A 192.168.10.30 118.110.20.14
B 192.168.10.40  
外网IP的默认路由为118.110.20.11
内网网卡名为 ens224
外网网卡名为 ens160
 
方法一:
这里需要将两个服务器外网网卡都配置成不包含IP的配置并启动:
  1. [admin@test ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens160
  2. # 其中大部分配置都不是必须的,只需要能保证网卡能正常启动且不包含IP即可
  3. HWADDR=:::8b::
  4. NAME=ens160
  5. # GATEWAY=118.110.20.12
  6. # NETMASK=255.255.255.240
  7. # IPADDR=118.110.20.14
  8. DNS1=8.8.4.4
  9. DNS2=8.8.8.8
  10. DOMAIN=example
  11. DEVICE=ens160
  12. ONBOOT=yes
  13. USERCTL=no
  14. BOOTPROTO=static
  15. PEERDNS=no
  16.  
  17. check_link_down() {
  18. return ;
  19. }
keepalived配置如下:
  1. # 这里只列出了主要部分,其他部分按照前面的例子来即可
  2. vrrp_instance my_nginx {
  3. state MASTER
  4. interface ens224 # 这里必须写成内网网卡名,不能写成外网网卡名
  5. virtual_router_id
  6. priority
  7. advert_int
  8.  
  9. track_script {
  10. chk_nginx
  11. }
  12.  
  13. authentication {
  14. auth_type PASS
  15. auth_pass 111111
  16. }
  17. virtual_ipaddress {
  18. 118.110.20.14/ dev ens160 # 这里配置和上面的例子不一样,相当于直接配置ens160网卡,没用到label
  19. }
  20. virtual_routes {
  21. default via 118.110.20.12 # 这里配置默认路由
  22. }
  23. }
注意,我们前面的例子中,interface 和虚拟网卡指定的网卡名都是一样,但事实上,这两个是没有联系的
interface 指定的网卡是用来发送arrp包的源地址,而虚拟网卡指定的网卡是为了做虚拟IP的
因为,如果我们这里interface 指定的网卡名为ens160,由于这个网卡没有IP,则由于发送arrp包时找不到源地址,而导致启动keepalived失败,报错如下,在/var/log/message中能找到报错信息:
  1. Cannot find an IP address to use for interface
方法二:
主要思路是,两台机器都配置好公网网卡,IP都配置成118.193.20.4,然后让主的公网网卡启动,从的公网网卡关闭
具体步骤如下:
网卡配置如下:
  1. [root@test sites]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
  2. HWADDR=:::8b:0e:
  3. NAME=ens160
  4. GATEWAY=118.110.20.12
  5. DNS1=8.8.4.4
  6. DNS2=8.8.8.8
  7. DOMAIN=example
  8. DEVICE=ens160
  9. ONBOOT=yes
  10. USERCTL=no
  11. BOOTPROTO=static
  12. NETMASK=255.255.255.240
  13. IPADDR=118.110.20.14
  14. PEERDNS=no
  15.  
  16. check_link_down() {
  17. return ;
  18. }
keepalived配置如下:
  1. vrrp_instance my_nginx {
  2. state BACKUP
  3. interface ens224 # 这里必须写成内网网卡名,不能写成外网网卡名
  4. virtual_router_id
  5. priority
  6. advert_int
  7.  
  8. track_script {
  9. chk_nginx
  10. }
  11.  
  12. authentication {
  13. auth_type PASS
  14. auth_pass 111111
  15. }
  16. notify_master /etc/keepalived/script/master.sh
  17. notify_backup /etc/keepalived/script/backup.sh
  18. }
这里master.sh内容如下,主要功能是保证公网网卡启动:
  1. #!/bin/bash
  2.  
  3. ifconfig | grep 118.110.20.14
  4. if [ $? -ne ];then
  5. ifconfig ens160 up
  6. fi
backup.sh内容如下,主要功能就是关闭公网网卡:
  1. #!/bin/bash
  2.  
  3. # 即使已经关闭了,再执行该命令也不会有报错,所以不用做判定
  4. ifconfig ens160 down

keepalived + nginx 实现高可用的更多相关文章

  1. Keepalived+Nginx实现高可用Web负载均衡

    1.安装编译 Nginx 所需的依赖包# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zli ...

  2. Keepalived+Nginx实现高可用(HA)

    Keepalived+Nginx实现高可用(HA) service iptables stopchkconfig iptables offsetenforce 0/etc/selinux/config ...

  3. Dubbo入门到精通学习笔记(十六):Keepalived+Nginx实现高可用Web负载均衡

    文章目录 Keepalived+Nginx实现高可用Web负载均衡 Keepalived+Nginx实现高可用Web负载均衡 高可用架构篇 Keepalived + Nginx 实现高可用 Web 负 ...

  4. Keepalived + Nginx 实现高可用 Web 负载均衡

    一.Keepalived 简要介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前 ...

  5. [转]搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

    [原文]https://www.toutiao.com/i6591714650205716996/ 一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最 ...

  6. KeepAlived+Nginx实现高可用负载

    一.环境及安装版本: centos6.5.Nginx1.4.7.keepalived1.3.2 虚拟IP 真是IP Nginx端口 主从分配 10.0.90.215 10.0.90.217 80 MA ...

  7. Keepalived+Nginx实现高可用负载均衡集群

    一 环境介绍 1.操作系统CentOS Linux release 7.2.1511 (Core) 2.服务keepalived+nginx双主高可用负载均衡集群及LAMP应用keepalived-1 ...

  8. Linux巩固记录(9) keepalived+nginx搭建高可用负载分发环境

    环境准备(继续服用hadoop节点) slave1  192.168.2.201(CentOs 7) slave2  192.168.2.202(CentOs 7) slave1 和 slave2 上 ...

  9. Keepalived+Nginx实现高可用和双主节点负载均衡

    简介 Nginx可以实现高并发反向代理,lvs集群可以实现负载均衡,但是他们都有一个共同的弊端,就是Nginx,lvs架构中Director是单点故障,有没有一个好的方案解决这个问题呢?答案是有.通过 ...

  10. keepalived + nginx实现高可用

    1. Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker. ...

随机推荐

  1. 将数据内容动态添加到HTML中

    // 申明一个数组用来装遍历的元素 var li = []; //遍历元素并加载到标签中 for(var i = 0; i<navGroup.self_first_nav.length; i++ ...

  2. 用私有构造器或枚举类型强化Singleton

    Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设 ...

  3. ajax请求及遍历

    $(".btn").click(function(){ $.ajax({ type:"POST", url:"../../js/info.json&q ...

  4. Python笔记25-----------创建二维列表【浅copy】和转置

    一.创建二维列表 1.二维列表创建第二维的时候,如果采用*2这种方式,这是一种浅复制的方式,同时引用到同一个list,如上图的C. 这种形式,不方便修改C[ i ][ j ]的数据,如果改C[ 0 ] ...

  5. reac实现控制输入框字符长度

    reac实现控制输入框字符长度 代码思路:

  6. ASP.NET-ActionFilter过滤器用法实例

    ActionFilter可以对每一个传过来的action请求进行过滤,非常有用,但是如果在这里判断过多,那么网站的性能和速度会不会变慢,这个问题值得思考,现在先放在这里. public class A ...

  7. Chrome插件Axure RP Extension

    Chrome插件Axure RP Extension 1.将文件夹“0.6.2_0”复制到Chrome文件夹中某个位置. 2.打开Chrome,打开[设置] - [扩展程序],勾选右上角的“开发者模式 ...

  8. glove入门实战

    前两天怒刷微博,突然发现了刘知远老师分享的微博,顿时眼前一惊.原Po例如以下: http://weibo.com/1464484735/BhbLD70wa 因为我眼下的研究方向是word2vec.暗自 ...

  9. Baby_Step,Gaint_Step(分析具体解释+模板)

    下面是总结自他人博客资料.以及本人自己的学习经验. [Baby_Step,Gaint_Step定义] 高次同余方程. BL == N (mod P) 求解最小的L.因为数据范围非常大,暴力不行 这里用 ...

  10. m_Orchestrate learning system---十、解决bug最根本的操作是什么

    m_Orchestrate learning system---十.解决bug最根本的操作是什么 一.总结 一句话总结:多学多练,遇到bug超级轻松 1.如何查看js代码的异常? 开发者选项里面可以查 ...