(目录)
Keepalived的作用
是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作 正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
keepalived 安装
cd /home
yum install gcc gcc-c++ openssl openssl-devel #安装Keepalived需要的扩展
wget https://www.keepalived.org/software/keepalived-1.2.18.tar.gz
tar -zxvf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
./configure --prefix=/usr/local/keepalived
make && make install
将 keepalived 安装成 Linux 系统服务
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
chkconfig keepalived on
主机 | 备用 |
---|---|
192.168.34.170 | 192.168.34.129 |
按照keepalived的按照方法分别给上述2台服务器按照keepalived。
配置 keepalived.conf 【/etc/keepalived】
<font color="red">192.168.34.170</font>
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight 2 ## 如果条件成立,权重+2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 79
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.34.104 #虚拟IP
}
track_script {
chk_nginx
}
}
==192.168.34.129==
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx.sh" ## 检测 haproxy 状态的脚本路径
interval 2 ## 检测时间间隔
weight 2 ## 如果条件成立,权重+2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 79
priority 90
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.34.104
}
track_script {
chk_nginx
}
}
nginx 配置
2台服务器一样。
upstream blogs{
server 192.168.34.170:80;
server 192.168.34.129:80;
#upsync 192.168.34.170:8500/v1/kv/upstreams/nginx_test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
#upsync_dump_path /vhost/server_test.conf;
#include /vhost/server_test.conf;
}
server{
listen 8080;
server_name 192.168.34.104;
index index.html index.php;
location ~ \.php$ {
proxy_pass http://blogs;
}
}
==/etc/keepalived/nginx.sh==
检测nginx状态的脚本文件
#! /bin/bash
START_NGINX="service nginx start"
LOG_FILE="/usr/local/nginx/logs/nginx_upstreams.log"
HAPS=`ps -C nginx --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check nginx status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
echo $START_HAPROXY >> $LOG_FILE
/usr/local/nginx/nginx -c /usr/local/nginx/nginx.conf
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
echo "start nginx failed, killall keepalived" >> $LOG_FILE
killall keepalived
service keepalived stop
fi
fi
开启keepalived
service keepalived start
linux 输入ip a
ip a
==192.168.34.170==
<font color="red">192.168.34.129</font>
开始测试
pkill -9 nginx #关掉nginx进程
==注:如果发现nginx.sh文件无法运行,可能是文件权限的问题,修改 文件nginx.sh 的权限就好了==
发现nginx自己又启动成功了。
如果nginx启动失败了,虚拟IP 192.168.34.104 会漂移到 备份机【192.168.34.129】上
当主机 【192.168.34.170】修复成功后,就会立马抢占虚拟IP!
综上 keepalived的高可用算是完成了。
可能遇到的问题
上述主机恢复后会立马抢占虚拟IP,这样可能会造成一定的延时。 解决方法也很简单:可以采用不抢占的模式
==keepalived.conf==
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight 2 ## 如果条件成立,权重+2
}
vrrp_instance VI_1 {
state state BACKUP
nopreempt
interface ens33
virtual_router_id 79
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.34.104
}
track_script {
chk_nginx
}
}
2台服务器的 state 都为 BACKUP,并加入了nopreempt这个参数。 这样keepalived将会从2台服务器中根据 priority 的值推选出一个Master。这样如果这台Master宕机了,另一个就成为了Master,而且当另一台服务器修复后,也不会发生抢占。