Keepalived高可用服务

避免负载均衡服务出现单点问题

高可用服务原理

Keepalived的工作原理:

Keepalived高可用对之间是通过VRRP通信的,因此,我从 VRRP开始了解起:

1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。

2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。

3) VRRP用 IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信。

4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。

5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工作原理:

Keepalived高可用之间是通过 VRRP进行通信的, VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。

部署高可用服务

利用keepalived软件实现

作用:

1.为LVS服务而诞生出来的

2.实现高可用服务功能

第一个历程:准备高可用服务架构

lb01 lb02
10.0.1.5 10.0.1.6

第二个历程:安装keepalived软件

#lb01
[root@lb01 ~]# yum -y install keepalived #lb02
[root@lb02 ~]# yum -y install keepalived

keepalived配置文件说明

/etc/keepalived/keepalived.conf
GLOBAL CONFIGURATION --- 全局配置部分
VRRPD CONFIGURATION --- VRRP协议配置部分
LVS CONFIGURATION --- LVS服务管理配置部分 [root@lb01 ~]# 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 192.168.200.1 --- 设置邮箱服务器
smtp_connect_timeout 30 --- 定义超时时间
router_id LVS_DEVEL --- 高可用集群主机身份标识(集群中主机身份标识名称不能重复)
} vrrp_instance VI_1 { --- 定义实例名称
state MASTER --- 标识所在家族中的身份(MASTER/BACKUP)
interface eth0 --- 指定虚拟IP地址出现在什么网卡上
virtual_router_id 51 --- 标识家族身份信息(多台高可用服务器配置要一直)
priority 100 --- 设定优先级(优先级越高,就越有可能成为主)
advert_int 1 --- 定义组播包发送的间隔时间(秒)(主和备配置须一致)
authentication { --- 实现通讯需要有认证功能
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --- 配置虚拟IP地址信息
192.168.200.16
192.168.200.17
192.168.200.18
}
}
[root@lb01 ~]#

第三个历程:编写keepalived配置文件

lb01

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
router_id lb01
} vrrp_instance test {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.3/24
}
}

lb02

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
router_id lb02
} vrrp_instance test {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.3/24
}
}

第四个历程:启动keepalived服务

#lb01
[root@lb01 ~]# systemctl start keepalived #lb02
[root@lb02 ~]# systemctl start keepalived

第四个历程:进行访问测试

高可用服务应用

高可用服务常见异常问题 --- 脑裂问题

什么是裂脑

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台服务器占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被成为裂脑.

导致裂脑发生的原因

一般来说,裂脑的发生,有以下几种原因

  • 高可用服务器对之间心跳线链路发生故障,导致无法正常通信
  • 心跳线坏了(包括断了,老化)
  • 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
  • 心跳线之间连接的设备故障(网卡及交换机)
  • 高可用服务器上开启了iptables防火墙阻挠了心跳信息传输
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
  • 其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件bug等.

解决裂脑的常见方法

在实际成产环境中,我们可以从以下几个方面来防止裂脑问题发生:

同时使用串行电缆和以太网电缆连接,同时用两条心跳线,这样一条线路坏了,另一个还是好的,依然能传送心跳信息.

当检测到裂脑时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith,fence)相当于备节点接收不到心跳信息,通过单独的线路发送命令关闭主节点的电源.

做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失.

解决keepalived裂脑的常见方案

作为互联网应用服务器的高可用,特别是前端web负载均衡器的高可用,裂脑的问题对普遍业务的影响是可容忍的,如果是数据库或者存储的业务,一般出现裂脑问题就非常严重了.因此,通过增加冗余心跳线来避免裂脑问题发生,同时加强了对系统的监控.

如果开启防火墙,一定要让心跳消息通过.一般通过允许IP段的形式解决

可以拉一条以太网网线或者串口线作为主备节点心跳线路的冗余

开发检测程序通过监控软件检测裂脑,如zabbix检测如果主备都有VIP就报警.

比较严谨的判断,备节点出现对应VIP,并且主节点及对应服务(如果能远程连接主节点看是否有VIP就更好了)还活着,就说明发生裂脑了.

开发检测keepalived裂脑的脚本"

[root@lb01 conf.d]# vim /server/scripts/check_keepalived.sh
#!/bin/bash
lb01_vip=10.0.1.3
lb01_nginx=$(curl -x 10.0.1.5:80 -I -s -w "%{http_code}\n" -o /dev/null blog.test.com)
if [ ${lb01_nginx} -eq 200 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
echo "ha is bad" >> /tmp/check.txt
systemctl stop keepalived
else
echo "ha is ok" >> /tmp/check.txt
fi

如何实现keepalived服务自动释放vip地址资源

nginx+keepalived:nginx负载停止,keepalived也必须停止

第一个历程:编写监控nginx服务状态监控
[root@lb01 ~]# cat /server/scripts/check_web.sh
#!/bin/bash
num=`ps -ef | grep -c nginx`
if [ $num -lt 2 ];then
systemctl stop keepalived
fi
[root@lb01 ~]#
第二个历程:实时监控nginx服务状态---keepalived配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
router_id lb01
} vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance test {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.3/24
} track_script {
check_web
}
}

配置解释

vrrp_script check_web {
script "/server/scripts/check_web.sh" --- 定义需要监控脚本(脚本需要有执行权限)
interval 2 --- 执行脚本间隔时间(秒)
weight 2 --- 利用权重值和优先级进行运算,从而降低主服务优先级使之变为备服务器(建议先忽略)
} 求和运算:weight数值必须是整数 weight + priority 自动提升优先级,使主机可以成为主服务器
求差运算:weight数值必须是负数 weight - priority 自动降低优先级,使主机可以成为备服务器
track_script {
check_web --- 调用你执行的脚本信息
}

高可用集群双主配置

第一个历程:编写lb01的keepalived配置文件

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
router_id lb01
} vrrp_instance test {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.3/24
}
} vrrp_instance test2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.4/24
}
}
[root@lb01 ~]#

第二个历程:编写lb02的配置keepailved文件

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
router_id lb02
} vrrp_instance test {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.3/24
}
} vrrp_instance test2 {
state MASTER
interface eth0
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.4/24
}
}
[root@lb02 ~]#

第三个历程:配置nginx负载均衡服务

#lb01和lb02一样
[root@lb02 ~]# vim /etc/nginx/conf.d/lb.conf
upstream test {
server 10.0.1.7:80;
server 10.0.1.8:80;
server 10.0.1.9:80;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://test;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; }
}
server {
listen 80;
server_name bbb.test.com;
location / {
proxy_pass http://test;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; }
}

第三个历程:重启服务

#lb01
[root@lb01 ~]# systemctl restart keepalived
[root@lb01 ~]# systemctl restart nginx #lb02
[root@lb02 ~]# systemctl restart keepalived.service
[root@lb02 ~]# systemctl restart nginx

访问测试

高可用服务安全配置(负载均衡服务)

lb01和lb02负载均衡服务器配置一样

第一个历程:修改nginx负载均衡文件

[root@lb01 conf.d]# vim lb.conf
upstream test {
server 10.0.1.7:80;
server 10.0.1.8:80;
server 10.0.1.9:80;
}
server {
listen 10.0.1.3:80;
server_name www.test.com;
location / {
proxy_pass http://test;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 10.0.1.4:80;
server_name bbb.test.com;
location / {
proxy_pass http://test;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; }
}

第二个历程:修改内核信息

[root@lb01 conf.d]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
[root@lb01 conf.d]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
[root@lb01 conf.d]#

第三个历程:重启nginx服务

[root@lb01 conf.d]# systemctl restart nginx
[root@lb01 conf.d]# netstat -lntup|grep nginx
tcp 0 0 10.0.1.4:80 0.0.0.0:* LISTEN 6294/nginx: master
tcp 0 0 10.0.1.3:80 0.0.0.0:* LISTEN 6294/nginx: master
[root@lb01 conf.d]#

Keepalived高可用服务的更多相关文章

  1. 十一.keepalived高可用服务实践部署

    期中集群架构-第十一章-keepalived高可用集群章节======================================================================0 ...

  2. keepalived高可用服务配置管理

    实验环境: 主机 ipaddress 服务 备注 k8s-master1 10.0.0.63 nginx k8s-master2 10.0.0.64 nginx k8s-node1 10.0.0.65 ...

  3. 干货 | Keepalived高可用服务配置实例

    一个执着于技术的公众号 Keepalived系列导读 Keepalived入门学习 keepalived安装及配置文件详解 前言 在前面的章节中,我们学习了Keepalived简介.原理.以及Keep ...

  4. keepalived高可用简介与配置

    keepalived简介 keepalived介绍 Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP ...

  5. keepalived高可用集群。

    keepalived故障切换转移原理1vrrp协议:(vritual router redundancy protocol)虚拟路由冗余协议,2故障转移.keepalived三大功能1实现物理高可用, ...

  6. Linux系统——Keepalived高可用集群

    #### keepalived服务的三个重要功能1. 管理LVS负载均衡软件Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能,这使得 ...

  7. nginx keepalived 高可用方案(转)

    转自: https://www.cnblogs.com/leeSmall/p/9356535.html 一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含 ...

  8. Nginx入门篇(七)之Nginx+keepalived高可用集群

    一.keepalived介绍 keepalived软件最开始是转为负载均衡软件LVS而设计,用来管理和监控LVS集群系统中各个服务节点的状态,后来又加入了可实现高可用的VRRP功能.所以Keepali ...

  9. Linux实战教学笔记31:Keepalived高可用集群应用实践

    1.1 Keepalived高可用软件 1.1.1 Keepalived介绍 Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入 ...

随机推荐

  1. 七、hibernate的事务使用

    hibernate中事务隔离级别 1:读未提交 2:读已提交 4:可重复读 8:可串行化 hibernate事务使用 在核心配置文件中配置事务隔离级别 <property name=" ...

  2. docker镜像仓库

    搭建私有镜像仓库 Docker Hub作为Docker默认官方公共镜像,如果想自己搭建私有镜像仓库,官方也提供registry镜像,使得搭建私有仓库非常简单. 下载registry镜像并启动 [roo ...

  3. 42th 逻辑的连续性 取决于 细节的理解-------------我是个厨子:类的调用vs 对象调用方法

    类的调用vs 对象调用方法   class Cook5:    '''这是一个厨师的类'''        # 类是一系列对象相同的特征与技能的结合体        # 用变量表示特征(属性)    ...

  4. C++在windows平台下不存在strptime函数,可以绕过该函数

    https://blog.csdn.net/u011077672/article/details/50524469?utm_source=blogxgwz1

  5. SpringMvc返回给前端数据@ResponseBody响应体【支持Ajax】

    1).在Controller中写 //@ResponseBody响应体是jackson包提供的 用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格 ...

  6. Spring 讲解(四)

    Spring 中使用注解注入 注解:就是一个类,使用 @ 注解名称. 实际开发中:使用注解取代 xml 配置文件. 1.常用注解释义 @component 取代 <bean class=&quo ...

  7. 集合类中的Collection接口实现类

    今天学习一下集合包里面的内容,常见的有Collection和Map两个接口的实现类Collection中常见的又分为两种: 1.List ,支持放入重复的对象,实现类有arraylist,linked ...

  8. CDN技术之--该技术概述

    CDN关键技术:1. 缓存算法[Squid]:2. 分发能力:3. 负载均衡[Nginx](4. 基于DNS[BIND]):5. 支持协议: 缓存算法决定命中率.源服务器压力.POP节点存储能力分发能 ...

  9. angular-cli项目报Error encountered resolving symbol values statically. Function calls are not supported.错误的处理。

    安装同事打包的一个模块,报了这么个错,不过在其他地方使用是正常的. Error encountered resolving symbol values statically. Function cal ...

  10. getstu

    #coding: utf- #title..href... import urllib.request import time url=[ page= j= : url[j]='http://www. ...