【linux】keepalived
一.高可用集群
1.1 集群类型
LB:Load Balance 负载均衡
LVS/HAProxy/nginx(http/upstream, stream/upstream)
HA:High Availability 高可用集群
数据库、Redis
SPoF: Single Point of Failure,解决单点故障
HPC:High Performance Computing 高性能集群
1.2 系统可用性
SLA:Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约)
1.3 系统故障
硬件故障:设计缺陷、wear out(损耗)、非人为不可抗拒因素
软件故障:设计缺陷 bug
1.4 实现高可用
提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)
解决方案:建立冗余机制
- active/passive 主/备
- active/active 双主
- active --> HEARTBEAT --> passive
- active <--> HEARTBEAT <--> active
1.5.VRRP:Virtual Router Redundancy Protocol
虚拟路由冗余协议,解决静态网关单点风险
- 物理层:路由器、三层交换机
- 软件层:keepalived
1.5.1 VRRP 相关术语
- 虚拟路由器:Virtual Router
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
- VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID)
- 物理路由器:
- master:主设备
- backup:备用设备
- priority:优先级
1.5.2 VRRP 相关技术
通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式
安全认证:
- 无认证
- 简单字符认证:预共享密钥
- MD5
工作模式:
- 主/备:单虚拟路由器
- 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
二.Keepalived 部署
2.1 keepalived 简介
vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务
官网:http://keepalived.org/
功能:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
2.2 Keepalived 架构
- 用户空间核心组件:
- vrrp stack:VIP消息通告
- checkers:监测real server
- system call:实现 vrrp 协议状态转换时调用脚本的功能
- SMTP:邮件组件
- IPVS wrapper:生成IPVS规则
- Netlink Reflector:网络接口
- WatchDog:监控进程
- 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
2.3 Keepalived 环境准备
拓扑:
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信:非必须
- 建议使用/etc/hosts文件实现:非必须
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
2.4 Keepalived 相关文件
- 软件包名:keepalived
- 主程序文件:/usr/sbin/keepalived
- 主配置文件:/etc/keepalived/keepalived.conf
- 配置文件示例:/usr/share/doc/keepalived/
- Unit File:/lib/systemd/system/keepalived.service
- Unit File的环境配置文件:/etc/sysconfig/keepalived
2.5 Keepalived 安装
[root@KA1 ~]# dnf install keepalived -y
[root@KA1 ~]# systemctl start keepalived
2.6 KeepAlived 配置说明
2.6.1 配置文件组成部分
配置文件:/etc/keepalived/keepalived.conf
配置文件组成
- GLOBAL CONFIGURATION
Global definitions: 定义邮件配置,route_id,vrrp配置,多播地址等
- VRRP CONFIGURATION
VRRP instance(s):
定义每个vrrp虚拟路由器
- LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):
LVS集群的VS和RS
三.实验步骤
设备 | IP |
KA1 | 172.25.254.20 |
KA2 | 172.25.254.30 |
RS1 | 172.25.254.40 |
RS2 | 172.25.254.50 |
cilent | 172.25.254.110 |
1.设置IP地址和主机名,并关闭防火墙
通过脚本,前两篇文章有脚本
KA1、KA2
RS1、RS2
所有机器:
2.KA1和KA2间设置NTP(时间同步)
KA1:KA1设置允许其他主机找自己进行时间同步
KA2:KA2找KA1进行时间同步
KA2校验时间同步:
3.KA1、KA2安装keepalived和ipvsadm包,RS1、RS2安装nginx和mariadb-server包,cilent安装mariadb包
KA1、KA2:
RS1、RS2:
cilent:
4.配置主备模式
4.1配置全局参数:global_defs:(KA1、KA2都配置一样)
4.2配置虚拟路由器
KA1:
KA1使用-t -f 检测配置:
KA2:
KA2使用 -t -f检测配置:
也可以使用单播进行配置:
单播效果:
4.3检验效果
KA1监听组播地址
当KA1的keepalived挂掉的时候,再查看监听:
说明KA1挂掉的时候,KA2已经接替了KA1的工作,VIP现在在KA2上:
KA2,VIP在KA2上:
KA1,当KA1再次启动的时候,VIP又因为KA1的优先级高,自动切换回来:
5.启动keepalived日志功能:
编辑.etc.sysconfig.keepalived文件,启动日志功能:
编辑.etc.rsyslog.conf文件:
重启syslog服务:
成功启动日志:
6.配置独立子配置文件
7.非抢占模式配置、抢占模式延迟
非抢占模式:
抢占模式延迟:
8.企业级应用实例(双主模式)
KA1配置:
global_defs {notification_email {weiyihong@163.com}notification_email_from keepalived@KA1.comsmtp_server 172.0.0.1smtp_connect_timeout 30router_id KA1.wyh.comvrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:0}
}vrrp_instance VI_2 {state BACKUPinterface eth0virtual_router_id 52priority 80nopreemptadvert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:1}
}virtual_server 172.25.254.100 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 80}}real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1retry 3delay_before_retry 1}}
}
KA2配置:
global_defs {notification_email {weiyihong@163.com}notification_email_from keepalived@KA1.comsmtp_server 172.0.0.1smtp_connect_timeout 30router_id KA1.wyh.comvrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44
}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:0}
}vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 52priority 100nopreemptadvert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:1}
}virtual_server 172.25.254.100 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 80}}real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1retry 3delay_before_retry 1}}
}
开启双主模式:
KA1:
KA2:
效果1:
效果2:
效果3:
9.在其基础上配置后端RS服务
RS1、RS2写默认网页区别:
RS1使用脚本绑定VIP至web服务器lo网卡:
RS2使用脚本绑定VIP至web服务器lo网卡:
KA1服务配置,KA2同理:
后端RS1、RS2配置回环IP:
RS1、RS2都添加环回网卡100:
IPVS效果1:
IPVS效果2:ipvs高可用,当RS1故障时,流量自动打到RS2上
当RS1恢复的后,流量又开始负载均衡
ipvs高可用,当ka1失效时,ka2接管VIP,流量也同样可以负载均衡:
10.再次基础上再在RS上加一个服务,使得两个VIP都可以用上,实现KA的互相负载,RS的互相负载。
RS1、RS2都添加环回网卡200:
KA1、KA2配置都一样:
virtual_server 172.25.254.200 3306 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 172.25.254.40 3306 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 3306}}real_server 172.25.254.50 3306 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 3306}}
}
编辑/etc/my.cnf文件,测试的时候标识是哪台数据库
标识RS1:
标识RS2: