keepalived

发布于 分类 liunx标签

0311lc.com说:

11.1 高可用服务的概念

11.1.1 高可用服务总体概念

  • 为了解决单点故障
  • 减轻服务器的压力

11.1.2 高可用keepalived的概念

  • 为了管理lvs服务
  • 由于lvs没有健康检查功能,keepalived可以进行健康检查
  • keepalived路由冗余协议

11.1.3 路由冗余协议

  • 利用vrrp协议进行相互之间的通信
  • 利用vrrp协议进行主备竞选
  • 发送组播包来告诉其他服务器我还正常的
  • 发送的时候使用的明文发送

11.2 安装高可用服务(172.16.1.5,172.16.1.6)

[root@lb01 conf.d] # yum -y install keepalived

11.3 高可用服务的原理

11.3.1 图示讲解

11.3.2 文字讲解

11.4 编辑配置文件

11.4.1 主配置文件编辑(172.16.1.5)

[root@lb01 ~] # cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

router_id lb01                    定义一个高可用的集群名称

}

}

 

vrrp_instance oldboy {                    设置一个实例(可以说是创建一个家族)

state MASTER                    指定这台服务器在家族的身份

interface eth0                    指定vip地址出现在哪台服务器的网卡上

virtual_router_id 66                指定家族的标识

priority 150                        指定服务器的优先级(优先级越高,越有可能是主服务器)

advert_int 1                        主服务器发送组播包的间隔

authentication {

auth_type PASS

auth_pass 1234                指定认证密码信息

}

virtual_ipaddress {

10.0.0.3                    指定vip地址信息

}

}

11.4.2 副配置文件编辑(172.16.1.6)

[root@lb02 ~] # cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

router_id lb02                    定义一个高可用集群名称

}

}

 

vrrp_instance oldboy {                    定义一个实例(家族)

state BACKUP                    定义这台服务器在家族中的身份地位

interface eth0                    定义vip出现哪个网卡上

virtual_router_id 66                家族的标识

priority 100                        定义服务器的级别信息

advert_int 1                        接收主服务器发送的组播信息间隔时间

authentication {

auth_type PASS

auth_pass 1234                定义指证密码信息

}

virtual_ipaddress {

10.0.0.3                    定义vip地址信息

}

}

11.5 重启keepalived服务(172.16.1.5,6都需要)

systemctl restart keepalived.service

11.6 测试是否搭建成功

11.6.1 将主服务器的高可用服务停止

[root@lb01 ~] # systemctl stop keepalived.service

11.6.2 在其他高可用服务器上查看vip地址是否已经切换成功

[root@lb02 ~] # ip a s eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

link/ether 00:0c:29:35:bd:57 brd ff:ff:ff:ff:ff:ff

inet 10.0.0.6/24 brd 10.0.0.255 scope global noprefixroute eth0

valid_lft forever preferred_lft forever

inet 10.0.0.3/32 scope global eth0                    切换成功

valid_lft forever preferred_lft forever

inet6 fe80::69eb:971b:2ae0:23cc/64 scope link tentative noprefixroute dadfailed

valid_lft forever preferred_lft forever

11.7 高可用服务企业常见的问题说明

11.7.1 脑裂问题

11.7.1.1 啥叫脑裂问题

简单的说就是其他服务器在主服务器正常的时候出现了vip地址信息

11.7.1.2 脑裂问题出现的原因

11.7.1.2.1 物理原因
  • 主和其他服务器连接的网线不通了,导致接收不到主发送的组播信息
  • 去往其他服务器的防火墙可能已经打开了,导致主服务器发送的信息不能正常的发送给其他服务器
11.7.1.2.2 逻辑原因

服务器的配置出现了问题

11.7.1.3 脑裂问题出现怎么解决

  • 写脚本进行监控,当出现了脑裂问题就进行发送邮件来进行解决
11.7.1.3.1 脚本的编写
  • 判断其他服务器是不是出现了vip地址信息

ip a s eth0 | grep -c “10.0.0.3” !=0 && 就进行发送邮件给运维人员

  • 开始编写(在其他服务器使用定时任务+脚本)

[root@lb02 scripts] # vim monitor_vip.sh

#!/bin/bash

 

VIP_COUNT=`ip a s eth0 | grep -c “10.0.0.3”`                验证vip地址是否存在

if [ “$VIP_COUNT” != 0 ]                        上面匹配的个数是不是大于0

then

echo “check vip addr” | mail -s “move vip” 460523471@qq.com                发送邮件信息

fi

11.7.2 实现监控nginx的服务状态进行主备切换

11.7.2.1 在主服务器上面进行监控

11.7.2.1.1 在主服务器上编写监控脚本
  • 思路:nginx服务停止以后,就将keepalived服务也给停止掉

netstat -anptu | grep -c nginx ==0 && systemctl stop keepalived

  • 脚本开始编写

[root@lb01 scripts] # vim monitor_nginx.sh

#!/bin/bash

count_nginx=`netstat -anptu | grep -c nginx`            判断nginx进程有几行

if [ “$count_nginx” == 0 ]                        如果为0行,则将keepalived服务停止

then

systemctl stop keepalived

else

exit 0

fi

 

[root@lb01 scripts] # sh -x monitor_nginx.sh             脚本执行过程

++ grep -c nginx

++ netstat -anptu

+ count_nginx=0

+ ‘[‘ 0 == 0 ‘]’

+ systemctl stop keepalived

 

[root@lb01 scripts] # systemctl is-active keepalived.service     发现keepalived服务已经停止

inactive

[root@lb01 scripts] #

  • 实时监控,一旦nginx挂了,立马将keepalived服务停止
  • 使用while死循环做

[root@lb01 scripts] # vim monitor_nginx.sh

#!/bin/bash

count_nginx=`netstat -anptu | grep -c nginx`

when true                     当为真的时候,进行下面的查看

do

if [ “$count_nginx” == 0 ]

then

systemctl stop keepalived

fi

sleep 1;                        每隔1秒进行一次循环判断

done

  • 使用主配置文件进行编辑(确认你的脚本有执行权限)

[root@lb01 scripts] # vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

router_id lb01

}

}

vrrp_script check_web {                    设置脚本的项目名称

script “/server/scripts/monitor_nginx.sh”        指定你要监控的脚本

interval 2                            指定2秒进行一次监控

#weight 2

}

 

vrrp_instance oldboy {

state MASTER

interface eth0

virtual_router_id 66

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

10.0.0.3

}

track_script {                        调用上面的项目名称信息函数

check_web

}

 

}

11.7.2.2 在其他服务器上面进行监控

11.7.2.2.1 使用权重值来进行vip地址的切换
  • 使用停止keepalived的方式虽然可以成功,但是是一次性的,可能nginx恢复以后,keepalived不会进行恢复,为了解决这个问题,我们可以使用权重值来进行解决
  • 权重值的概念
  • 权重值为正数的时候
  1. 返回为0的时候,实际值为权重值+默认优先级,权重值会进行增加操作
  2. 返回为非0的时候,实际值等于默认优先级
  • 权重值为负数的时候
  1. 返回为0的时候,实际值等于默认优先级
  2. 返回为非0的时候,实际值等于默认优先级+权重值
  • 编写脚本
  • 判断你访问的网站是不是200,如果是返回为真,如果不是返回为假
  • 使用curl -I -w “%{http_code}\n” -o /dev/null -s www.oldboy.com
  • 具体编写

[root@lb02 scripts] # vim monitor_nginx.sh

#!/bin/bash

code_info=”$(curl -I -w “%{http_code}\n” -o /dev/null -s www.oldboy.com)”

if [ $code_info -ne 200 ]

then

exit 0

else

exit 1

fi

 

[root@lb02 scripts] # vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

router_id lb02

}

}

vrrp_script check_web {

script “/server/scripts/monitor_nginx.sh”

interval 2

weight 60

 

}

vrrp_instance oldboy {

state BACKUP

interface eth0

virtual_router_id 66

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

10.0.0.3

}

track_script {

check_web

}

}


发表评论

电子邮件地址不会被公开。 必填项已用*标注