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]#

最新文章

  1. Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
  2. node中定时器的“先进”用法
  3. CI 同时上传多个图片
  4. Object C学习初步
  5. oracle-12c-rac 报:ORA-01078
  6. Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法
  7. Neral的前言
  8. cf492A Vanya and Cubes
  9. 前端jquery实现点击图片弹出大图层(且滚动鼠标滑轮图片缩放)
  10. UltraEdit的语法高亮显示配置
  11. Vim扩展YouCompleteMe插件
  12. UWP 返回顶部按钮
  13. JSP+javaBean:简易投票网页练习
  14. k8s Docker私有仓库认证
  15. JAVA核心技术第二卷 第一章
  16. span i s等行内元素标签之间出现奇怪空格符号
  17. bzoj 3191
  18. Python_二维数组
  19. Faster rcnn代码理解(4)
  20. Advanced Installer 14.9 – WPF或winform应用程序打包成exe文件

热门文章

  1. windows自动关机(任务计划程序 + exe文件)
  2. Rxjava Retrofix2 okhttp3网络框架自解(转)
  3. Eigen ,MKL和 matlab 矩阵乘法速度比较
  4. spring boot poi 导出Excel
  5. shell 根据路径获取文件名和目录
  6. Java中的小知识。
  7. bzoj 2015
  8. thinkphp 根据文件后缀的不同返回不同的结果
  9. PHP【Laravel】delayer基于redis的实现订单超时改变状态
  10. Linux系统Centos查看IP地址,不显示IP地址或者显示127.0.0.1