前言
         网上已经有很多相关文章,对各种概念介绍的比较清楚,也有各种详细的步骤,这里主要记录本要在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. 60、springmvc-异步请求-返回Callable

    60.springmvc-异步请求-返回Callable @Controller public class AsyncController { @RequestMapping("async0 ...

  2. 39、扩展原理-BeanFactoryPostProcessor

    39.扩展原理-BeanFactoryPostProcessor BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 BeanFactoryPostPro ...

  3. [ARIA] Accessible animations with reduced motion

    Animations can make people sick, or worse! By adding animation toggles and listening in to the user' ...

  4. 011_Python3 集合

    集合(set)是一个无序的不重复元素序列. 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典.   创 ...

  5. 后缀数组 TYVJ P1860 后缀数组

    /*P1860 后缀数组时间: 1000ms / 空间: 131072KiB / Java类名: Main描述 我们定义一个字符串的后缀suffix(i)表示从s[i]到s[length(s)]这段子 ...

  6. TensorFlow(四):手写数字识别

    一:数据集 采用MNIST数据集:-->官网 数据集被分成两部分:60000行的训练数据集和10000行的测试数据集. 其中每一张图片包含28*28个像素,我们把这个数组展开成一个向量,长度为2 ...

  7. 爬虫(十四):scrapy下载中间件

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 激活Downloader Midd ...

  8. 使用Keras训练神经网络备忘录

    小书匠深度学习 文章太长,放个目录: 1.优化函数的选择 2.损失函数的选择 2.2常用的损失函数 2.2自定义函数 2.1实践 2.2将损失函数自定义为网络层 3.模型的保存 3.1同时保持结构和权 ...

  9. SDN与IXP

    IXP 互联网交换中心(IXP)在互联网生态系统中发挥着关键作用.在全球范围内,100多个国家/地区有超过400个IXP,其中最大的IXP具有接近10 Tbps的峰值数据速率并连接数百个网络.IXP提 ...

  10. HttpClient学习(二)—— MinimalHttpClient源码解析

    依赖关系 方法 class MinimalHttpClient extends CloseableHttpClient { //连接管理器 private final HttpClientConnec ...