目录
一、高可用集群简介
1.1 集群的类型
1.2系统的可用性
1.3 如何实现高可用
1.4 VRRP(虚拟路由冗余协议)---解决静态网关单点风险
1.4.1 VRRP相关术语
1.4.2 VRRP相关技术
二、Keepalived 部署
2.1 keepalived 架构
2.2 环境准备
三、keepalived基本配置
3.1 全局配置以及虚拟路由器
3.1.1 在ka1上面的配置
3.1.2 在ka2上面的配置
3.1.2 抓包测试
3.2 使得ka1,ka2能够ping vip
3.2.1 加上vrrp_iptables
3.2.2 注释vrrp_iptables和vrrp_strict
3.3 实现日志独立功能
3.4 实现独立子配置文件
四、应用示例配置
4.1 抢占模式和非抢占模式
4.2 抢占延迟模式 preempt_delay
4.3 VIP单播配置
4.3.1 ka1上面
4.3.2 ka2上面
4.3.3 抓包测试
4.4 邮件配置并实现脚本调用
4.4.1 编辑邮件文件
4.4.2 编写脚本
4.4.3编写主配置文件----添加
4.4.4 重启服务测试
前言:前面我们学到了通过lvs实现四层负载均衡,haproxy实现七层负载均衡,但是有一个不足的地方就是,当haproxy或者lvs的中心调度器出现故障了,该服务就失效了。于是我们就可以通过备份这个调度器来解决问题。这个就是高可用集群,其可以让负载均衡实现高性能。本章主要讲解高可用集群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系统的可用性
简单来说就是:A = MTBF / (MTBF+MTTR )99.95%:(60*24*30)*(1-0.9995)=21.6 分钟 # 一般按一个月停机时间统计
1.3 如何实现高可用
提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)
就是使用冗余机制:有以下几种形式
- active/passive 主/备
- active/active 双主
- active --> HEARTBEAT(心跳线) --> passive
- active <--> HEARTBEAT <--> active
keepalived的原理就是使用vrrp协议来做,来实现主备,双主。
1.4 VRRP(虚拟路由冗余协议)---解决静态网关单点风险
物理层:路由器、三层交换机实现
软件层:keepalived实现
主要原理就是为了让外部人员访问内部网络。
1.4.1 VRRP相关术语
- 虚拟路由器:Virtual Router
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
- VIP:Virtual IP
VMAC : Virutal MAC (00-00-5e-00-01-VRID)物理路由器:
- master:主设备
- backup:备用设备
- priority:优先级---------主要是优先级起作用来起到主备切换。
1.4.2 VRRP相关技术
通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式
安全认证:
- 无认证
- 简单字符认证:预共享密钥
- MD5
工作模式:
- 主/备:单虚拟路由器
- 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
二、Keepalived 部署
keepalived的功能作用:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
2.1 keepalived 架构
- 用户空间核心组件:
- vrrp stack:VIP消息通告
- checkers:监测real server
- system call:实现 vrrp 协议状态转换时调用脚本的功能
- SMTP:邮件组件
- IPVS wrapper:生成IPVS规则
- Netlink Reflector:网络接口
- WatchDog:监控进程
- 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
2.2 环境准备
准备四台虚拟机其IP,主机名配置如下
主机名 | IP | 虚拟IP(VIP) | 功能 |
ka1 | 172.25.254.10 | 172.25.254.100 | keepalived服务 |
ka2 | 172.25.254.20 | 172.25.254.100 | keepalived服务 |
rs1 | 172.25.254.110 | web服务 | |
rs2 | 172.25.254.120 | web服务 |
注意一定要关闭selinux,和防火墙,不然在后面配置vrrp时不起作用。
在rs1,rs2 上面配置web服务:
[root@rs1 ~]# yum install httpd -y
[root@rs1 ~]# setenforce 0
[root@rs1 ~]# systemctl stop firewalld.service
[root@rs1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@rs1 ~]# systemctl enable --now httpd
[root@rs2 ~]# yum install httpd -y
[root@rs2 ~]# setenforce 0
[root@rs2 ~]# systemctl stop firewalld.service
[root@rs2 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@rs2 ~]# systemctl enable --now httpd
#在ka上面能够访问
[root@ka1 ~]# curl 172.25.254.110
172.25.254.110
[root@ka1 ~]# curl 172.25.254.120
172.25.254.120
[root@ka2 ~]# curl 172.25.254.110
172.25.254.110
[root@ka2 ~]# curl 172.25.254.120
172.25.254.120
在ka1,ka2上面配置keepalived:
[root@ka1 ~]# setenforce 0
[root@ka1 ~]# systemctl stop firewalld.service
[root@ka1 ~]# yum install keepalived -y
[root@ka1 ~]# systemctl enable --now keepalived
[root@ka2 ~]# setenforce 0
[root@ka2 ~]# systemctl stop firewalld.service
[root@ka2 ~]# yum install keepalived -y
[root@ka2 ~]# systemctl enable --now keepalived
以上咋们的环境就搭建好了,现在就可做实验配置了。
三、keepalived基本配置
3.1 全局配置以及虚拟路由器
首先我们得keepalived的主配置文件为/etc/keepalived/keepalived.conf,我们主要是在这里面进行配置,也可以弄成子配置文件,这将会在后面进行讲解。
3.1.1 在ka1上面的配置
首先打开配置文件,找到global_defs(全局),vrrp_instance VI_1 (配置虚拟子接口)进行如下配置:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
其优先级为100,其作为主服务器。
然后我们要重启服务,进行测试,其就出现VIP来供我们使用。
[root@ka1 ~]# systemctl restart keepalived
[root@ka1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.10 netmask 255.255.255.0 broadcast 172.25.254.255
inet6 fe80::20c:29ff:fe3e:a08f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:3e:a0:8f txqueuelen 1000 (Ethernet)
RX packets 42163 bytes 3462633 (3.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 41245 bytes 3390930 (3.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:3e:a0:8f txqueuelen 1000 (Ethernet)
3.1.2 在ka2上面的配置
ka2也是先修改配置文件。其相对于主服务器的修改变动内容如下标红地方,其他地方的配置都是一样的。
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
优先级设为80 ,其就作为备份服务器使用,
重启测试,然后就发现ka2上是没有VIP的。
3.1.2 抓包测试
[root@ka1 ~]# tcpdump -i ens33 -nn host 224.0.0.18
首先是10为主在发送数据。然后关闭ka1的keepalived服务再查看该走向,其VIP就会到ka2上面
然后再重启ka1的服务,再查看,发现又出现了。
以上就是我们主备之间简单的配置。实现简单的主备服务。
3.2 使得ka1,ka2能够ping vip
3.2.1 加上vrrp_iptables
在配置文件里面加上vrrp_iptables,就可以实现了。-----注意ka1,ka2都要设置,这样才能都实现。
测试界面如下:在ka1,ka2上面
3.2.2 注释vrrp_iptables和vrrp_strict
在配置文件里面注释vrrp_iptables和vrrp_strict,就可以实现了。-----注意ka1,ka2都要设置,这样才能都实现。如下
测试界面如下:
3.3 实现日志独立功能
这个我就在ka1上做示例啦。
修改/etc/sysconfig/keepalived配置。如下:
[root@ka1 ~]# vim /etc/sysconfig/keepalived
[root@ka1 ~]# cat /etc/sysconfig/keepalived
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D -S 6"
然后再修改/etc/rsyslog.conf,添加内容如下。
最后重启测试查看。
[root@ka1 ~]# systemctl restart keepalived
[root@ka1 ~]# systemctl restart rsyslog.service
查看日志,就出现以下内容了
3.4 实现独立子配置文件
主要是在主配置文件中用include来包含子配置文件。
这里我是把配置vip的配置写到子配置文件中的
然后我们需要在外面创建目录文件。
[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
然后我们重启一下,发现服务还能启用,子配置文件就使用完成。
四、企业应用示例
4.1 抢占模式和非抢占模式
默认为抢占模式 preempt ,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色,这样会使 vip 在 KA 主机中来回漂移,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色非抢占模块下 , 如果原主机 down 机 , VIP 迁移至的新主机 , 后续也发生 down 时 , 仍会将 VIP 迁移回原主机
注意:要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP
ka1上主配置文件的配置:添加nopreempt,并修改BACKUP。
ka2上面也要添加nopreempt。
然后我们可以通过在ka1,和ka2上面stop,restart keepalived 服务来观察vip的走向。
4.2 抢占延迟模式 preempt_delay
preempt_delay # # 指定抢占延迟时间为 #s ,默认延迟 300s注意:需要各 keepalived 服务器 state 为 BACKUP, 并且不要启用 vrrp_strict
然后我们可以 通过stop再进行start 查看VIP,间隔时间为抢占延时时间。做完这个实验之后建议删掉此配置。
4.3 VIP单播配置
# 在所有节点 vrrp_instance 语句块中设置对方主机的 IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络unicast_src_ip <IPADDR> # 指定发送单播的源 IPunicast_peer {<IPADDR> # 指定接收单播的对方目标主机 IP......}# 启用 vrrp_strict 时,不能启用单播 , 否则服务无法启动 , 并在 messages 文件中记录下面信息Jun 16 17:50:06 centos8 Keepalived_vrrp[23180]: (m44) Strict mode does notsupport authentication. Ignoring.Jun 16 17:50:06 centos8 Keepalived_vrrp[23180]: (m44) Unicast peers are notsupported in strict modeJun 16 17:50:06 centos8 Keepalived_vrrp[23180]: Stopped - used 0.000606 usertime, 0.000000 system timeJun 16 17:50:06 centos8 Keepalived[23179]: Keepalived_vrrp exited with permanenterror CONFIG. TerminatingJun 16 17:50:06 centos8 systemd[1]: keepalived.service: Succeeded.Jun 16 17:50:06 centos8 Keepalived[23179]: Stopped Keepalived v2.0.10(11/12,2018)
4.3.1 ka1上面
#ka1,添加如下内容
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
}
4.3.2 ka2上面
#ka2,添加如下内容
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
}
4.3.3 抓包测试
以上配置做完后要重启服务。
可以发现,此时VIP在ka1--10上面。然后我们通过src:10------dst:20来抓包测试查看。
上面可以看出此时就是单播 ,因为此时src:20------dst:10来抓包测试时是不能实现这个服务。
然后我们stop,ka1主机,此时vip就在2上面,然后就可以src:20------dst:10来抓包测试。
但是src:10------dst:20是不能实现这个服务。
以上实验现象就是我们单播的实验现象啦。
4.4 邮件配置并实现脚本调用
mailx----这个就是我们发邮件的工具。可以通过yum install mailx -y 去下载。一般是有的。
然后我使用的邮箱是QQ邮箱,然后要在在Linux配置邮件服务器代理,需要在QQ邮箱,启动邮件授权码,把这个复制过来,会有用。就是下面这个界面
4.4.1 编辑邮件文件
/etc/mail.rc -------注意两台上都要配置。
[root@ka1 ~]# vim /etc/mail.rc
#添加
set bsdcompat
set bsdcompat
set from=2758655249@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=2758655249@qq.com
set smtp-auth-password=‘这就是我复制的授权码’
set smtp-auth=login
set ssl-verify=ignore
[root@ka2 ~]# vim /etc/mail.rc
#添加
set bsdcompat
set bsdcompat
set from=2758655249@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=2758655249@qq.com
set smtp-auth-password=‘这就是我复制的授权码’
set smtp-auth=login
set ssl-verify=ignore
测试发送邮箱:
[root@ka1 ~]# echo hello world | mail -s test 2758655249@qq.com
然后我就会在QQ上收到邮件
4.4.2 编写脚本
我们通过脚本来实现监控我们vip的变化位置再将其发送到邮箱上面。
编写脚本:
ka1上面:
[root@ka1 ~]# vim /etc/keepalived/mail.sh
[root@ka1 ~]# cat /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='2758655249@qq.com'
mail_send()
{
mail_subj="$HOSTNAME to be $1 vip 转移"
mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
ka2上面:
[root@ka2 ~]# vim /etc/keepalived/mail.sh
[root@ka2 ~]# cat /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='2758655249@qq.com'
mail_send()
{
mail_subj="$HOSTNAME to be $1 vip 转移"
mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
然后给执行权限
[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh
[root@ka2 ~]# chmod +x /etc/keepalived/mail.sh
4.4.3编写主配置文件----添加
(两台都要添加)--vim etc/keepalived/keepalived.conf 添加下面标红的地方注意脚本文件路径是我们自己写的脚本路径。然后后面的参数就是我们脚本中需要输入的$1。
4.4.4 重启服务测试
然后我们在ka1,ka2上可以重启服务,停止服务,我们的邮箱就会收到邮件。
以下就是我重启和停止服务收到邮件的信息
关闭ka1上面的keepalived的服务,其VIP会转移到ka2上面
以上就是本章的所有内容啦。 我会在下一章再补充讲解一些企业应用的示例。