正常情况:单台主机操作是,无论操作的是备服务器还是主服务器
服务启动,都会显示vip 服务关闭都会删除vip;前提是单台服务器的情况下。如果是一个主一个备,正常情况下在主服务不停止时是不会出下备服务器上出现vip的。
keepalive服务异常问题分析
:
keepalived启动时报错
:(不是systemctl时报错,是在关闭主服务时,备服务器没有出现vip–该出现的没有出现。)
正是因为如此,所以这个问题才变得难排查了。
Can’t open PID file /var/run/keepalived.pid (yet?) after start: No such file or directory 不能打开pid文件。
解决:是因为没有完全关闭服务,虽然systemctl显示停止了,但是查看进程的话,就会发现还是有残余的进程。因为没有完全关机,所以导致无法正常启动。使用pkill杀死进程后再启动服务(这是暂时的办法,不能彻底解决,一出现这个错误就可以这样做。)查看pid文件信息。
这种问题出现的原因是:系统版本问题
。
这个版本不适合安装keepalive1.3.5
使用系统版本
安装keepalive1.3.5没有问题。
补充
:服务程序满足什么条件称为启动成功
1)检查服务状态信息 systemctl status 服务名称
2)检查服务进程信息 ps -ef|grep 进程名
3)检查服务进程文件 查看进程文件是否创建成功([root@localhost yum.repos.d]# ll /var/run/*.pid
)
4)检查服务的日志信息 (有些错误日志里面也记录)日志信息不会产生
如何进行高可用服务快速切换(监控nginx负载均衡服务状态)
keepalive核心作用:
1)实现高可用冗余作用
2)实现负载均衡服务的冗余 (如果nginx服务出现问题,keepalive就没有意义,需要切换到另外的nginx负载上)
对高可用服务进行监控服务管理
影响网站访问:数据存储问题
出现脑裂问题:主和备主机上同时出现vip地址
出现问题原因:备服务器无法接收到主服务器组播包
1)心跳线
2)网络安全服务影响组播通讯
3)服务程序或系统环境出现bug
解决:及时发现脑裂情况:利用监控方式发现
利用脚本进行监控:
思路:
1.监控脚本编写在那个主机上 ?
编写在主服务器上
2. 编写脚本命令信息 ?
curl -I -H host:www.oldboy.com 10.0.0.5 -s | awk 'NR==1{print $2}'
200
curl -I -H host:www.oldboy.com 10.0.0.5 -s -w "%{http_code}\n" -o /dev/null
200
或者是根据下面信息判断
ps -ef |grep nginx / netstat -ntpul |grep 80 /
ps -ef |grep -v grep | grep nginx
这种方式是根据查看nginx进程的方式,中间的grep -v是排除grep搜索nginx而产生的进程。
监控方式一:服务状态 /进程 /端口号 /判断pid文件是否存在
[root@lb01 script]# cat /server/script/web_check.sh
#!/bin/bash
web_info=$(ps -ef|grep -v grep|grep -c nginx)
if [ $web_info -lt 2 ]
then
systemctl stop keepalived
fi
注意配置脚本文件的执行权限
监控方式二:监控网站页面状态
#!/bin/bash
status_code=$(curl -I -H host:www.oldboy.com 10.0.0.5 -s -w "%{http_code}\n" -o /dev/null)
if [ $status_code -ne 200 ]
then
systemctl stop keepalived
fi
那么问题来了:多少时间进行一次判断呢?
首先想到的是定时任务,但是定时任务会有一个一分钟的bug
实现keepalive服务进行执行脚本
实现利用keepalived服务进行执行脚本
keepalived配置文件中:放在全局配置下面
vrrp_script check_web { — 加载需要监控脚本信息 upstream oldboy
script “/server/scripts/web_check.sh” — 加载脚本路径信息
interval 2 — 加载脚本间隔时间(每隔2s钟)
weight 2 — ???
}
keepalived配置文件中:放在vrrp配置里面
track_script { --- 进行触发指定脚本信息 proxy_pass http://oldboy
check_web
}
配置文件完整配置
[root@lb01 script]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/server/script/web_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web
}
}
提示:配置完毕后服务进行重启服务
systemctl restart keepalived
keepalive的服务提升安全性
(说明:设置nginx负载只监听vip地址,使得nginx负载的外网网卡地址让外网不能访问。----如果不设置的话,用户可以通过外网网卡地址和vip地址进行访问。等于用户有两个路线—这样设置的话,只让用户通过vip地址进行访问,在vip地址前面加上防火墙,以这样的方式来防止黑客攻击)
第一个历程:修改负载均衡配置文件
只监听vip地址–lb01上修改
(其实是在主配置文件上配置的,但是我在web服务上配置的—为了实验简单)
[root@lb01 conf.d]# cat /etc/nginx/conf.d/default.conf
server {
listen 10.0.0.3:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
监听地址要求:nginx配置的监听地址必须是网卡上有的地址
但是对于备用keepalive服务器来说,vip地址还在主服务器上,备服务器上没有vip地址,那么是没有办法实现监听的。
解决
:
在备用keepalive上设置
[root@lb02 ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
[root@lb02 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
server {
listen 10.0.0.3:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
systemctl restart nginx
这样就可以实现提高keepalive的安全性了。
如何实现双主配置
lb01上的配置(在lb01上:10.0.0.3为主;10.0.0.4为备)
[root@lb01 conf.d]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/server/script/web_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4
}
}
track_script {
check_web
}
lb02上配置(lb02上10.0.0.4为主,10.0.0.3为备)
[root@lb02 etc]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server smtp.162.com
smtp_connect_timeout 30
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4
}
}
但是我是出现了几次错误后才成功的,错误现象就是:lb01 上有两个vip 10.0.0.3 10.0.0.4
lb02上有两个vip 10.0.0.3 10.0.0.4
前后配置都一样,后来就莫名的好了,每次配置完都重启了。不知道什么原因。
小技巧
:
在vim里面 底行模式下查看有没有空字符:
set list
42,44copy44 拷贝内容从42行到44行,拷贝到44行下面