前言
         网上已经有很多相关文章,对各种概念介绍的比较清楚,也有各种详细的步骤,这里主要记录本要在ubuntu16.04下的布署过程,主要记录编译安装keepalived时遇到的坑及解决办法。

可以参考的文章:

Nginx+keepalived 高可用双机热备(主从模式/双主模式)

LVS+KeepAlived+Nginx高可用实现方案https://blog.csdn.net/lupengfei1009/article/details/86514445

环境
     系统: ubuntu16.04

keepalived: 2.0.15

nginx:1.14.2

架构
       双机高可用方法目前分为两种:

1)Nginx+keepalived 双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。

2)Nginx+keepalived 双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠。

下面分别是两种模式对应的架构示意图。需要说明的是,虽然每台服务器都配置了VIP,但正常情况下,对于每个VIP,同时只会有一台机器实际占用。

安装步骤
         说明:本文主要介绍安装keepalived时遇到的问题及解决办法,所以没有只用了两台机器,并没有介绍后端服务。另外这里只介绍了主从模式。

主要的问题归纳:

1. 需要从解压后的源码包去找 服务脚本,这是2.0之后的变化
          cp keepalived-2.0.15/keepalived/etc/init.d/keepalived /etc/init.d/ 
        2. 这个脚本里的默认路径配置不正确,需要针ubuntu做处理

3. 这个脚本里的命令有问题,需要修改

主从模式
  1. 安装nginx (两台都要安装)

apt-get update #更新包源

#安装gcc g++的依赖库、 pcre依赖库、 zlib依赖库、 openssl、libssl-dev
apt install build-essential
apt install libtool
apt install libpcre3 libpcre3-dev
apt install zlib1g-dev
apt install openssl libssl-dev

#下载nginx,解压
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -zxvf nginx-1.14.2.tar.gz
cp -r nginx-1.14.2 /usr/local/src

#添加www用户,其中 -M参数表示不添加用户家目录,-s参数表示指定shell类型
useradd www -M -s /sbin/nologin

#配置nginx 并安装
cd /usr/local/src/nginx-1.14.2
./configure --prefix=/usr/local/nginx --user=www
make && make install

#配置测试页,可以方便识别内容来自哪台服务器,主上是come from master,从上是slave
echo "come from master" >/usr/local/nginx/html/test.html
#启动nginx
/usr/local/nginx/sbin/nginx
#访问
curl localhost/test.html
come from master #从上的话应该返回 come from slave.
 2.安装 keepalived

#解压并安装
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/keepalived
  cp /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)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
#指定keepalived的角色,这里指定的不一定就是MASTER,实际会根据优先级调整,另一台为BACKUP
state MASTER
interface ens33 #当前进行vrrp通讯的网卡
virtual_router_id 200 #虚拟路由编号(数字1-255),主从要一致
# mcast_src_ip 192.168.79.191 #
priority 100 #定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
nopreempt
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication {
auth_type PASS
auth_pass 2222
}
#执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),
#否则nginx监控失效!!
track_script {
chk_nginx #引用VRRP脚本,即在 vrrp_script 部分指定的名字。
#定期运行它们来改变优先级,并最终引发主备切换。
}

virtual_ipaddress {#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
192.168.79.210
}
}
      #创建检查nginx状态的脚本

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.conf
sleep 2
counter=`ps -C nginx --no-heading|wc -l`
if [ "${counter}" = 0 ]; then
/etc/init.d/keepalived stop
fi
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个地方有问题。

图中1:  由于 ubuntu下没有 /etc/rc.d/init.d/functions,需要为其建立软链接

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

图中2:拷贝相应文件的源配置文件

注释内容有介绍 ,这个源配置文件(在里面设置keepalived启动参数)

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

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

1. 安装 daemon:  apt install daemon

2. 图中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, 可以看到帮助信息

可以看出, daemon命令的-D参数是需要一个path参数的,所以会出现系统日志里的错误。
    由 usage: daemon [options] [--] [cm arg...],可知正确的命令格式应该是:daemon -- keepalived -D
    所以上面力中标示的第3处,应该修改为 daemon -- keepalived ${KEEPALIVED_OPTIONS}

注意:每次修改/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漂移到另一台服务器

3)通过curl http://192.168.79.210/test.html 可以查看返回内容是来自主还是来自从。

更多细节和 双主模式,可以参考 Nginx+keepalived 高可用双机热备(主从模式/双主模式)

Ubuntu16.04下KeepAlived+Nginx 布署的更多相关文章

  1. Ubuntu16.04下部署 nginx+uwsgi+django1.9.7(虚拟环境pyenv+virtualenv)

    由于用的新版本系统,和旧的稍有差别,在网上搜了很多相关资料,搞了三天终于搞好在Ubuntu16.04下的部署,接下来就详细写写步骤以及其中遇到的问题.前提是安装有虚拟环境pyenv+virtualen ...

  2. Ubuntu16.04下安装nginx+mysql+php+redis

    一.redis简介 Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记 ...

  3. Linux:Ubuntu16.04下创建Wifi热点

    Linux:Ubuntu16.04下创建Wifi热点 说明: 1.Ubuntu16.04里面可以直接创建热点,而不用像以前的版本,还要其他辅助工具. 2.本篇文章转载自编程人生 具体步骤如下: 1.  ...

  4. Ubuntu16.04下安装数据库oracle客户端

    在Ubuntu16.04下安装oracle数据库客户端,使Django项目连接到远程Oracle数据库. 1.下载oracle客户端安装包: 进入官网http://www.oracle.com/tec ...

  5. 【原创】Octovis在Ubuntu16.04下运行出现core dump的解决方案

    本人SLAM研究新手,使用系统为Ubuntu16.04.本文原址:http://www.cnblogs.com/hitlrk/p/6667253.html 在学习SLAM的过程中,使用Octomap进 ...

  6. Ubuntu16.04下安装redis

    Ubuntu16.04下安装redis 保证网络畅通,选定好下载工作路径,执行以下命令下载redis-3.2.6: sudo wget http://download.redis.io/release ...

  7. Ubuntu16.04下Office替代品Office Online

    Ubuntu16.04下Office替代品 Ubuntu16.04下的office Libreoffice 这个是Ubuntu自带的Office,总是存在各种问题,如果用来阅读还是不错的,但是编辑就不 ...

  8. Linux入门(13)——Ubuntu16.04下将图片和pdf互转

    Ubuntu16.04下将图片和pdf互转 将图片转为PDF: convert 图片 PDF convert pic.jpg pic.pdf 将PDF转为图片: convert PDF 图片 conv ...

  9. Linux入门(16)——Ubuntu16.04下配置sublime text 3使用markdown

    sublime text 3安装两个插件: MarkDown Editing OmniMarkupPreviewer 有的人使用 MarkDown Editing markdownpreviewer ...

随机推荐

  1. 随便写一个c++类

    为了让代码更贴合实际项目需要,我们分别用xxx.h文件,xxx.cpp文件来包含类的定义,类的声明和类的调用部分,实验平台vs2010 mycoach.h文件 #pragma once #includ ...

  2. ADB命令使用详解

    ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备. 1.连接android设置 adb connect 设备名 例如: adb connect 12 ...

  3. Vue多语言支持

    i18n插件实现多语言支持,本文以中英文为例记录一下配置过程. 1.配置 1.1安装:npm install vue-i18n --save 1.2创建中英文配置项文件 src/lang目录下创建以下 ...

  4. learning scala Function Recursive Tail Call

    可以使用scala库,可以从字面上看出是在调用 递归函数: code import scala.util.control.TailCalls._ val arrayDonuts: Array[Stri ...

  5. 块状链表 bzoj 3343教主的魔法

    //块状链表//分块排序,然后每次查找时在暴力查找头和尾两个块.//中间那些块,因为有序所以只需2分查找即可.我用的是lower_pound();//插入是,也是头和尾暴力插入,中间那些加到一个累计里 ...

  6. 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest

    目录 Contest Info Solutions B. Counting Inversion C. Divisors of the Divisors of An Integer E. Helping ...

  7. spring boot 对某个接口进行次数限制,防刷。简易版。demo。

    一般的项目 如果没有做防刷 容易被人爆接口 或者就是说没有做token防刷过滤. 容易被人用正常的token刷接口.有些token非一次性. 用户登录之后生成token会有一个过期时间,但一般没有做频 ...

  8. Semaphore信号量原理

    package com.maven.info.semaphore; import java.util.ArrayList; import java.util.List; import java.uti ...

  9. java设计模式学习-单例模式

    java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供.”单例模式可以保证一个应用中有且只有一个实例,避免了资源的浪费和多个实例多次调用导致出错. 单例模式有以下特点: 1.单 ...

  10. 如何查看Linux cpu核数、版本等信息

    CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 1.查看CPU信息(型号): [root@iZ2ze1rl2qy ...