前言
网上已经有不少相关文章,对各类概念介绍的比较清楚,也有各类详细的步骤,这里主要记录本要在ubuntu16.04下的布署过程,主要记录编译安装keepalived时遇到的坑及解决办法。html
能够参考的文章:前端
Nginx+keepalived 高可用双机热备(主从模式/双主模式)nginx
LVS+KeepAlived+Nginx高可用实现方案https://blog.csdn.net/lupengfei1009/article/details/86514445shell
环境
系统: ubuntu16.04ubuntu
keepalived: 2.0.15vim
nginx:1.14.2后端
架构
双机高可用方法目前分为两种:bash
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 高可用双机热备(主从模式/双主模式)