前言
Vrrp技术
- 虚拟路由器:Virtual Router 不是真实存在 ,虚构出来的
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器 (标记组 是否为同一组)
- VIP:Virtual IP 比如: 192.168.64.99 路由1 路由2
- VMAC:Virutal MAC (00-00-5e-00-01-VRID)
- 物理路由器:
- master:主设备
- backup:备用设备
- priority:优先级
虚拟路由器的主备 是由priority:优先级决定的
keepalived架构
- 用户空间核心组件:
- vrrp stack:VIP消息通告 虚拟ip
- checkers:监测real server(简单来说 就是监控后端真实服务器的服务)是否存活
- system call:实现 vrrp 协议状态转换时调用脚本的功能
- SMTP:邮件组件(报警邮件)
- IPVS wrapper:生成IPVS规则(直接生成ipvsadm)
- Netlink Reflector:网络接口(将虚拟地址ip(vip)地址飘动)
WatchDog:监控进程(整个架构是否有问题)
- 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
keepalived工作原理
keepalived 通过选举(按照服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,外部程序可通过该 ip 访问这台服务器,如果这台服务器出现故障(断网,重启等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。
选举策略是根据 VRRP 协议,完全按照权重大小,权重最大(0~255)的是 MASTER 机器,下面几种情况会触发选举
- keepalived 启动的时候
- master 服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等,而本机器上其他应用程序 crash 不算)
- 有新的备份服务器加入且权重最大
编译安装keepalive
[root@localhost keepalived-2.2.0]# yum install gcc curl openssl-devel libnl3-devel net-snmp-devel -y #安装依赖环境
wget https://keepalived.org/software/keepalived-2.2.0.tar.gz
#或者从本地上传至对应文件夹(按需上传对应文件夹就可以)
tar xf keepalived-2.2.0.tar.gz
cd keepalived-2.2.0
.\configure --prefix=/usr/local/keepalived
make -j2 && make install #后自动生成service文件
#编译安装完成后 是没有配置文件的在etc目录下
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf #配置文件模板复制到对应配置文件目录下面
#配置文件虚拟网卡需要修改下接口 按照网卡接口名称 否则无法启动
相关文件: (已知文件名 可以查看官方文档或者使用
find / -name "keepalived.conf" 2>/dev/null #查看配置文件 2>/dev/nul 错误信息输出到黑洞文件
)
- 软件包名:keepalived
- 主程序文件:/usr/sbin/keepalived
- 主配置文件:/etc/keepalived/keepalived.conf
- 配置文件示例:/usr/share/doc/keepalived/
- Unit File:/lib/systemd/system/keepalived.service
- Unit File的环境配置文件:
- /etc/sysconfig/keepalived CentOS
配置组成: /etc/keepalived/keepalived.conf 配置组成
- GLOBAL CONFIGURATION
Global definitions(全局配置):定义邮件配置,route_id,vrrp配置,组播地址 等
- VRRP CONFIGURATION
VRRP instance(s):定义vrrp协议中的每个vrrp虚拟路由器的规则,基本信息
- LVS CONFIGURATION(lvs调度服务器的规则设置)
Virtual server group(s) Virtual server(s):LVS集群的VS和RS
LVS(Nginx)+keepalived高可用集群
实验思路:
客户机:64.16
VIP:64.99
主:64.11
备:64.10
真实服务器:64.17 64.18
以Nginx举例子 首先 11 10 两台机器上需要安装Nginx 编译 yum 都可以 配置文件更改:
[root@localhost ~]# vim /etc/nginx/nginx.conf
建立负载均衡群组 以及指定location
keepalived安装 上面已经安装完成 修改配置文件 主服务64.11:
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS06
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_down {
script "/etc/keepalived/ng.sh" #指定检查脚本位置
niterval 1 #执行时间间隔1s
weight -30 #默认0 负数表示 检测出异常是 权重-30
fall 3 #连续执行3次失败 转为备
rise 2 #连续几次成功 从失败重新为主
timeout 2 #超时时间
}
vrrp_instance VI_1 {
state MASTER #指定为主
interface ens33 #网卡名称
virtual_router_id 66 #群组标识 主备需要一致 。
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.64.99 #vip 地址
}
track_script{
check_down
}
[root@xyy-7 nginx]# systemctl restart keepalived.service #重启keepalived
[root@xyy-7 nginx]# systemctl status keepalived #查看是否启动成功
cd /etc/keepalived
vim ng.sh
#!/bin/bash #指明解释器
killall -0 nginx #检测信号 非0 异常
chmod +x /etc/keepalived/ng.sh #添加脚本的执行权限
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell命令或脚本路径(注意执行权限)
interval <INTEGER> #间隔时间,单位为秒,默认1秒
timeout <INTEGER> #超时时间
weight <INTEGER:-254..254> #默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
fall <INTEGER> #执行脚本连续几次都失败,则转换为失败,建议设为2以上
rise <INTEGER> #执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] #执行监测脚本的用户或组
init_fail #设置默认标记为失败状态,监测成功之后再转换为成功状态
}
重启keepalived后 注意状态显示 异常报错 这个位置会有提示
备机器64.10
[root@localhost ~]# vim /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 127.0.0.1
smtp_connect_timeout 30
router_id LVS06 # id一致和主
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_down {
script "/etc/keepalived/ng.sh"
interval 1
weight -30
fall 3
rise 2
timeout 3
}
vrrp_instance VI_1 {
state BACKUP #修改为备服务器
interface ens33
virtual_router_id 66 #标识需要和主一致
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.64.99
}
track_script {
check_down
}
}
也需要写一个和主一样的脚本
chmod +x /etc/keepalived/ng.sh #需要添加执行全向
客户端: 可以准备两个httpd 或者nginx web即可
根据对应路径选择建立页面的地方
echo "17 17 17 17 17 17" > /apps/nginx/html/index.html
echo "18 18 18 18 18 18 18" > /var/www/html/index.html
[root@xyy1 ~]# curl 192.168.64.99
17 17 17 17 17 17
[root@xyy1 ~]# curl 192.168.64.99
18 18 18 18 18 18
#手动关闭主服务器的nginx 确认是否影响请求服务
[root@xyy-7 nginx]# systemctl stop nginx
[root@xyy1 ~]# curl 192.168.64.99
18 18 18 18 18 18
[root@xyy1 ~]# curl 192.168.64.99
17 17 17 17 17 17
[root@xyy1 ~]# curl 192.168.64.99
17 17 17 17 17 17
[root@xyy1 ~]# curl 192.168.64.99
18 18 18 18 18 18
[root@xyy1 ~]# curl 192.168.64.99
脑裂
[root@localhost keepalived]#iptables -A INPUT -s 192.168.64.11 -j REJECT
#在备份主机中加入此项
[root@localhost keepalived]#ip a
#可以在主备上都发现vip地址
什么是脑裂?
什么是脑裂?
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,
就分裂成为2个独立的个体。
由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享
资源”、争起“应用服务”,就会发生严重后果。共享资源被瓜分、两边“服务”都起不来了;或者两边
“服务”都起来了,但同时读写“共享存储”,导致数据损坏
都有哪些原因导致脑裂?
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
因心跳线间连接的设备故障(网卡及交换机)
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
多组keepalive服务器造成 组播冲突 1.换组播地址 2.改成单播
默认:
单播:
组播:
广播:
A 1 -127
B 128-191
C 192-223
D 224-239 224.0.0.18
20. 如何解决keepalived脑裂问题?
在实际生产环境中,我们从以下方面防止脑裂:
#同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息
#当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源
rsyslog 分割日志
#做好对脑裂的监控报警解决常见方案:
如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
开发检测程序通过监控软件检测脑裂