第11章
高可用服务(keepalived)的配置

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 ]                        

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 ]                        行,则将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;                        秒进行一次循环判断

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                            秒进行一次监控

#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

}

}

5分钟教你看大神操作keepalived服务的更多相关文章

  1. JavaScript的运行机制!!!很重要很重要!!!!!!请看大神操作!

    https://juejin.im/post/59e85eebf265da430d571f89

  2. ScrollView嵌套ListView的滑动冲突问题,是看大神的方法的,作为学习以后用的到

    在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结 ...

  3. 10分钟教你Python+MySQL数据库操作

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 本文介绍如何利用python来对MySQL数据库进行操作,本文将主要从以下几个方面展开介绍: 1.数据库介绍 2.MySQL数据库安装和设置 ...

  4. 日常推荐大神操作,如何再oracle中delete数据后恢复

    http://blog.csdn.net/wangdinghai365/article/details/8593869

  5. 【leetcode】Wildcard Matching(hard) ★ 大神太牛了

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  6. PS大神的作品,每张都是科幻大片!

    相信大家在网上一定见过 各种PS的作品 但是要想成为“PS大神”, 不仅仅要会P图, 最关键的就是脑洞! 同样的马路破坏效果 在大神操作后变成了大片! 摩托车换成了骏马 这效果果然不一般! 这个绝对牛 ...

  7. 7天教你精通变大神,学CAD关键还要掌握方法,纯干货新手要看

    接触CAD初期是“痛苦”的,“煎熬”的,也是充满“成就”的. 痛苦是初学者怎么都不懂,需要学习的东西很多,整个过程是有些痛苦的. 煎熬也是每个求学阶段都会遇到的状态,眼睛会了,手不会,这个状态很难受. ...

  8. JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力。。

      JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力..   小森执行一 ...

  9. C语言简单实现链栈基本几个功能(适合新手看,大神可指正)

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

随机推荐

  1. CentOS7 编码编译安装或卸载http2.4.25 一键脚本

    待完善 CentOS 7测试 哈哈 #!/bin/bash #************************************************************** #Autho ...

  2. 如何在后台封装el-tree所需要的数据格式

    背景 最近遇到了一个分层级展示指标的需求,前端使用el-tree树形组件,要求按官方文档的格式提供数据. 数据格式: id: 1, label: '一级 1', children: id: 4, la ...

  3. Pytorch文本分类(imdb数据集),含DataLoader数据加载,最优模型保存

    用pytorch进行文本分类,数据集为keras内置的imdb影评数据(二分类),代码包含六个部分(详见代码) 使用环境: pytorch:1.1.0 cuda:10.0 gpu:RTX2070 (1 ...

  4. ZeroC ICE的远程调用框架 AMI与AMD -Why?

    在Ice有两种异步使用的方式,AMI和AMD.AMI是异步方法调用,AMD是异步方法调度(分派).前者用在代理端,后者用在饲服实现端. AMI其实就是在代理端,使用Future机制进行异步调用,而不阻 ...

  5. Andorid开发中遇到的问题

    最近开始学习开发Android App,找了本教程,学了一些基本知识后,就开始着手做一个例子. 我始终觉得在做中学,可能会稍微快一点.很快,一个具有初步功能的App被我撸出来了. 在模拟器上运行,我发 ...

  6. ubuntu 16.04上源码编译dlib教程 | compile dlib on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/c6ead512/,欢迎阅读! compile dlib on ubuntu 16.04 Series Part 1: compil ...

  7. Redis 的底层数据结构(对象)

    目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对 ...

  8. 新闻实时分析系统-Hadoop2.X分布式集群部署

    (一)hadoop2.x版本下载及安装 Hadoop 版本选择目前主要基于三个厂商(国外)如下所示: 1.基于Apache厂商的最原始的hadoop版本, 所有发行版均基于这个版本进行改进. 2.基于 ...

  9. 剑指Offer-32.丑数(C++/Java)

    题目: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 分析: ...

  10. vscode vue模版

    { "Print to console": { "prefix": "vue", "body": [ "< ...