keepalive服务高可用快速切换、keepalive方式执行脚本、实现双主配置

正常情况:单台主机操作是,无论操作的是备服务器还是主服务器
服务启动,都会显示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行下面

发布了183 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42506599/article/details/104398866