第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. 自建yum仓库,该仓库为默认仓库

    YUM REPO: http://content.example.com/rhel7.0/x86_64/dvd 创建自建yum REPO文件: vim /etc/yum.repos.d/redhat. ...

  2. 查找文件或目录(find、locate、whereis、which、whatis)

    find命令:可以按文件名.文件的类型.用户等条件来递归查找文件或目录 find  [路径]  [匹配表达式] ,常用选项如下 -name filename  按文件名 -user username ...

  3. Linux网络配置文件

    centos为例: /etc/sysconfig/network文件 用于基本的网络配置信息,包含了控制和网络有关的文件和守护进程的行为参数,包括主机名.网关等 (默认:我的cent0s7在为空,fe ...

  4. 你的文章里为什么不放源码Github链接了

    "你的文章里为什么不放源码Github链接了?",一个读者这么问我 我把这张图发给了他,这是我之前放文章中Demo源码的Github仓库 他一脸疑惑,问我怎么了 经常使用Githu ...

  5. 消除router-link 的下划线问题

    <div class="small-size"> <router-link to="/About"> <img src=" ...

  6. 理解Spark SQL(三)—— Spark SQL程序举例

    上一篇说到,在Spark 2.x当中,实际上SQLContext和HiveContext是过时的,相反是采用SparkSession对象的sql函数来操作SQL语句的.使用这个函数执行SQL语句前需要 ...

  7. 学习PHP框架只停留在会用层面,职业生涯肯定走不远!

    工作这么多年,也面试过很多PHP工程师,我发现很多PHP工程师只停留在使用框架的层面,然而对框架底层根本没有深入去了解,那么这就会给自己的职业生涯带来一定的瓶颈,当遇到问题的时候你就无从下手,不知道如 ...

  8. Java流程控制之(一)条件

    目录 条件语句 单if情况 单if/else情况 if/else多分支情况 switch条件语句 条件语句+循环语句,直接甩图甩代码! 条件语句 Java希望在某个条件为真时执行相应的语句. 单if情 ...

  9. SQL查询优化实践

    为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上,即随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,且数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时 ...

  10. Windows Server 2008 服务器重启后卡死在Windows Update 页面问题处理

    Windows Update 服务器 服务器是联想RD640 操作系统Windows Server 2008 R2 Enterprise版 补丁版本是SP1 远程windows服务器时,一直处于远程建 ...