第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. 2、linux基础-面试题

    自己写的答案 1.1GB 2.4 3.ubuntu.dbian.Fedora 4.系统.硬件.clock -w 5.文件 6.uname -a 7.centos是redhat的社区版,redhat是商 ...

  2. tensorflow中的学习率调整策略

    通常为了模型能更好的收敛,随着训练的进行,希望能够减小学习率,以使得模型能够更好地收敛,找到loss最低的那个点. tensorflow中提供了多种学习率的调整方式.在https://www.tens ...

  3. poj 3281 Dining (Dinic)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22572   Accepted: 10015 Descript ...

  4. nyoj 241-字母统计 (python count)

    241-字母统计 内存限制:64MB 时间限制:3000ms 特判: No 通过数:12 提交数:14 难度:1 题目描述: 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果 ...

  5. 力扣(LeetCode)验证回文字符串II 个人题解

    给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca" 输出: ...

  6. 四 linuk常用命令 2. 权限管理命令

    一 权限管理命令chmod 所有者u 所属组g 其他人o 所有人a 所有者和root超级用户可以更改该权限 普通更改权限是不会改变子目录的权限的,要想改变用递归修改 useradd增加用户 目录的r和 ...

  7. 官宣!Amazon EMR正式支持Apache Hudi

    ​Apache Hudi是一个开源的数据管理框架,其通过提供记录级别的insert, update, upsert和delete能力来简化增量数据处理和数据管道开发.Upsert指的是将记录插入到现有 ...

  8. 使用Executor框架创建线程池

    Executor框架 Executor类:在java.util.concurrent类中,是JDK并发包的核心类. ThreadPoolExecutor: 线程池. Excutors: 线程池工厂,通 ...

  9. 【前端】 在前端利用数学函数知识+box-shadow解波浪图形

    序 今天正在刷数学函数相关题目,刷到了下面这篇文章,哇哦-有意思. 利用cos和sin实现复杂的曲线.传送门在下面. CSS 技巧一则 -- 在 CSS 中使用三角函数绘制曲线图形及展示动画 正巧在复 ...

  10. 100天搞定机器学习|Day57 Adaboost知识手册(理论篇)

    Boosting算法 Boosting是一种用来提高弱分类器准确度的算法,是将"弱学习算法"提升为"强学习算法"的过程,主要思想是"三个臭皮匠顶个诸葛 ...