Keepalived简单介绍
Keepalived是Linux下一个轻量级别的高可用解决方案。健康检查和失败切换是keepalived的两大核心功能。
Keepalived起初是为LVS设计的专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除
概述
主要功能:提供负载均衡和高可用功能。其中,高可用通过VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)实现多台机器之间的故障转移服务。
特点:自动完成,无需人工干涉。能够检测服务器的状态,并在服务器出现故障时自动将其从系统中剔除,同时启用其他服务器接替工作。
LVS是 linux服务器的负载均衡实现组件
Linux virtual Server , keepalived已经包含了LVS的组件. 所以一般不需要单独安装.
工作原理
负载均衡:
Keepalived依赖于Linux的虚拟服务内核模块(IPVS)来实现负载均衡。
用户通过配置Keepalived的keepalived.conf文件来设定负载均衡的规则,然后Keepalived将这些规则发送到内核的IPVS模块中。
高可用:
基于VRRP协议,Keepalived通过设置MASTER和BACKUP节点来确保服务的高可用性。
MASTER节点会定期向BACKUP节点发送心跳信息,如果BACKUP节点在一定时间内未收到心跳信息,则认为MASTER节点出现故障,随后进行主备切换,由BACKUP节点接管服务。
VRRP协议
在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)来完成的
而主机之间的路由器一旦出现故障,就会通信失败
因此在这种通信模式下,路由器就会有单点瓶颈问题,为了解决这个问题,引入了VRRP 协议(虚拟路由冗余协议)
通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信
VRRP可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,VRRP角色如下:
1、角色
虚拟路由器:VRRP组中所有的路由器,拥有虚拟的IP+MAC(00-00-5e-00-01-VRID)地址
主路由器(master):虚拟路由器内部通常只有一台物理路由器对外提供服务,主路由器是由选举算法产生,对外提供各种网络功能
备份路由器(backup):VRRP组中除主路由器之外的所有路由器,不对外提供任何服务,只接受主路由的通告,当主路由器挂掉之后,重新进行选举算法接替master路由器
2、VRRP工作模式
VRRP有三种工作状态,分别是:
Initialize状态
Master状态
Backup状态
选举机制:
优先级
抢占模式下,一旦有优先级高的路由器加入,立即成为Master
非抢占模式下,只要Master不挂掉,优先级高的路由器只能等待
负载均衡模式
https://cloud.tencent.com/developer/article/1026003?policyId=1003
专业术语
DS(Director Server负载均衡节点服务器),
RS(Real Server后端真实服务器),
VIP(对外提供访问的虚拟IP),
RIP(真实后端服务器的IP),
CIP(访问客户端的IP),
DIP(负载均衡节点服务器IP),
VMAC(VIP对应的MAC地址)。
LVS三种负载均衡模式
https://cloud.tencent.com/developer/article/1026003?policyId=1003
1)NAT模式-网络地址转换
通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
VS/NAT是一种最简单的方式,所有的RealServer只需要将自己的网关指向Director即可。客户端可以是任意操作系统,但此方式下,一个Director能够带动的RealServer比较有限。在VS/NAT的方式下,Director也可以兼为一台RealServer。VS/NAT的体系结构如图所示。

RIP与DIP在同一IP网络,RIP的网关要指向DIP
支持端口映射
Director要打开核心转发功能
NAT模式的以上原理图简述:
1)客户端请求数据,目标IP为VIP
2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
5)客户端收到的就只能看到VIP\DIP信息。
NAT模式优缺点:
1)NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点。
2)只需要在LB上配置一个公网IP地址就可以了。
3)每台内部的节点服务器的网关地址必须是调度器LB的内网地址。
4)NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
2)TUN模式-IP隧道模式
将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为 VIP 的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

TUN模式下的以上原理图过程简述:
1)客户请求数据包,目标地址VIP发送到LB上。
2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,后续会讲)
3)DR模式-直接路由模式
DR模式也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。Director和RealServer必需在物理上有一个网卡通过不间断的局域网相连。 RealServer上绑定的VIP配置在各自Non-ARP的网络设备上(如lo或tunl),Director的VIP地址对外可见,而RealServer的VIP对外是不可见的。RealServer的地址即可以是内部地址,也可以是真实地址


隐藏IP

在前端网关做静态绑定
在各RS使用arptables
在各RS修改内核参数,来限制arp响应和通告的级别.
DR模式小结:
1)通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2)请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3)因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4)RS主机需要绑定VIP地址在LO接口上(防止IP冲突),并且需要配置ARP机制。
5)RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6)由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。

负载均衡算法

部署方式
实现原理

实现nginx负载均衡

haproxy数据库部署方式

安装
yum install -y keepalived
-- 一般keepalived已包含了ipvasadm,否则需要单独安装
-- yum install ipvasadm -y手动安装方式
# 1,上传keepalived-2.0.13.tar.gz安装文件
rz -bye
# 2,解压tar -zxvf keepalived-2.0.13.tar.gz
# 3,编译并安装
yum install -y gcc
yum install libnl3-develcd keepalived-2.0.13/
./configure --prefix=/usr/local/keepalivedmake && make install
# 4,配置开机启动mkdir /etc/keepalivedcp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
systemctl enable keepalived
# 5,上传配置文件keepalived.confcd /etc/keepalived
rz -bye
# 6,启动keepalived
systemctl restart keepalived
systemctl status keepalived
# 7,安装ipvsadm
yum -y install ipvsadm安装lvs
yum install -y ipvsadm
如果在start ipvsadm时有错误提示:
/bin/bash: /etc/sysconfig/ipvsadm: No such file or directory
> ipvsadm --save > /etc/sysconfig/ipvsadm
> systemctl start ipvsadm配置详情
配置文件主要在 /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置标识
global_defs {
##用于设置报警的邮件地址,可以设置多个,每行一个。如果要开启邮件报警,需要开启本机的sendmail服务
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
##邮件的发送地址
notification_email_from Alexandre.Cassen@firewall.loc
##设置邮件的smtp server地址
smtp_server 192.168.200.1
##设置连接smtp server的超时时间
smtp_connect_timeout 30
## 运行keepalived的一个标识,唯一
router_id LVS_DEVEL
##对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
vrrp_skip_check_adv_addr
##严格遵守VRRP协议,启用此项后以下状况将无法启动服务:1.无VIP地址 2.配置了单播邻居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置
vrrp_strict
##gratuitous ARP messages 报文发送延迟,0表示不延迟
vrrp_garp_interval 0
##unsolicited NA messages (不请自来)消息发送延迟
vrrp_gna_interval 0
#指定要在其下运行脚本的默认用户名/组名,如果未指定此选项,则如果该用户存在,则用户默认为keepalived_script,否则为root,如果未指定groupname,则默认为用户的组。
script_user root
#指定组播IP地址范围:
vrrp_mcast_group4 224.0.0.18
}
##vrrp_script仅仅通过监控脚本返回的状态码来识别集群服务是否正常,如果返回状态码是0,那么就认为服务正常,反之亦然。
#配置一个nginx_check的脚本, 每1秒执行一次
vrrp_script nginx_check {
#指定要执行的脚本的路径。
script"/tools/nginx_check.sh"
#指定脚本执行的间隔。单位是秒。默认为1s。
interval 1
#指定在多少秒后,脚本被认为执行失败。
#timeout 6
#调整优先级。默认为2.
#weight <-254 --- 254>
#执行成功多少次才认为是成功
#rise <INTEGER>
#执行失败多少次才认为失败
#fall <INTEGER>
#运行脚本的用户和组
#user <USERNAME> [GROUPNAME]
#假设脚本初始状态是失败状态。
#init_fail
}
##VRRP实例开始的标识 VI_1为实例名称
vrrp_instance VI_1 {
##指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备服务器
state MASTER
##指定检测网络的网卡接口,# 修改为实际网卡名,可以通过 ip a 查看
interface eth0
#负载均衡器之间监控接口
lvs_sync_daemon_inteface eth0
#强制VRRP实例使用IPV6.(当同时配置了IPV4和IPV6的时候)
#native_ipv6
##虚拟路由标识,数字形式,同一个VRRP实例使用唯一的标识,即在同一个vrrp_instance下,master和backup必须一致
virtual_router_id 52
##节点优先级,数字越大表示节点的优先级越高,在一个VRRP实例下,MASTER的优先级必须要比BACKUP高,不然就会切换角
priority 100
##用于设定MASTER与BACKUP之间同步检查的时间间隔,单位为秒
advert_int 1
#如果track的网卡接口有任何一个出现故障,都会进入FAULT状态。状态实现地址转移
track_interface {
eth0
eth1 weight <-254-254>
...
}
#组播模式,配置源地址master的IP地址
#mcast_src_ip 192.168.56.104
#单播模式,配置源地址master的IP地址
unicast_src_ip 192.168.56.104
#单播模式,从节点的IP地址
unicast_peer {
192.168.56.105
192.168.56.106
}
authentication {
##同一个虚拟路由器的keepalived节点必须一样,相互间访问选举
auth_type PASS
##设置密钥,仅前8位有效
auth_pass test
}
# 设置为非抢占模式,同一实例下主备设置必须一样
nopreempt
# 设置抢占模式的延时时间,单位为秒
#preemtp_delay
##设置虚拟IP地址,可以设置多种形式
#注意:当生产环境中虚拟IP过多,可以在 virtual_ipaddress{ }前加入子配置文件声明,如:include /etc/keepalived/conf.d/*.conf,删除或注释主配置文件virtual_ipaddress{ }虚拟IP部分,最后每个项目生成一个子文件夹。
virtual_ipaddress {
192.168.149.100
#10.0.0.100不指定网卡,默认为eth0,注意:不指定/prefix,默认为/32;
#10.0.0.101/24 dev eth1 指定VIP的网卡;
#10.0.0.102/24 dev eth2 label eth2:1 #指定VIP的网卡label
}
##track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script。实现主备切换,保证服务高可用
track_script {
nginx_check
#设置优先级
#<SCRIPT_NAME> weight <-254-254>
}
##当前节点成为主节点时触发的脚本
notify_master /tools/master.sh
##当前节点转为备节点时触发的脚本
notify_backup /tools/backup.sh
##当前节点转为“失败”状态时触发的脚本
notify_fault /tools/fault.sh
#当停止VRRP时触发的脚本
notify_stop /tools/stop.sh
#使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
#smtp_alert
}
#作用:将所有相关的VRRP实例定义在一起,作为一个VRRP Group,如果组内的任意一个实例出现问题,都可以实现Failover。
vrrp_sync_group VG_1 {
group {
VI_1 # vrrp instance name
VI_2 # vrrp instance name
...
}
...
}
#LVS配置
# 定义虚拟服务器192.168.200.16:1358,
virtual_server 192.168.200.16 1358 {
# 健康检查时间间隔
delay_loop 6
# lvs调度算法rr wrr lc wlc lblc sh dh
lb_algo rr
# 负载均衡转发规则 NAT DR RUN
lb_kind NAT
# 同一IP的连接50秒内被分配到同一台realserver,单位是秒。默认是6分钟。
persistence_timeout 50
# 使用的协议,TCP|UDP|SCTP:4层协议。
protocol TCP
#如果virtual server的IP地址没有设置,则不进行后端服务器的健康检查。
#ha_suspend
# 备用机,所有realserver失效后启用
sorry_server 192.168.200.200 1358
#在keepalived启动时,假设所有的RS都是down,以及健康检查是失败的。有助于防止启动时的误报。默认是禁用的。
#alpha
#在keepalived终止时,会执行quorum_down指令所定义的脚本。
#omega
#quorum <INT>:默认值1. 所有的存活的服务器的总的最小权重。
#quorum_up <STRING>:当quorum增长到满足quorum所定义的值时,执行该脚本。
#quorum_down <STRING>:当quorum减少到不满足quorum所定义的值时,执行该脚本。
#定义真实服务器192.168.200.2:1358
real_server 192.168.200.2 1358 {
# 权重,最大越高,lvs就越优先访问,默认是1.
weight 1
#inhibit_on_failure:当服务器健康检查失败时,将其weight设置为0,而不是从Virtual Server中移除。
#notify_up <STRING>:当服务器健康检查成功时,执行的脚本。
#notify_down <STRING>:当服务器健康检查失败时,执行的脚本。
#uthreshold <INT>:到这台服务器的最大连接数。
#lthreshold <INT>:到这台服务器的最小连接数
# keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
# 要检测的URL,可以有多个
url {
# 具体路径
path /testurl3/test.jsp
# 检测效验码
digest 640205b7b0fc66c1ea91c463fac6334d
--digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html
# 检测返回http状态码
status_code 200
}
##检查目标端口
connect_port 443
# 3秒无响应超时
connect_timeout 3
# 重连次数3次
retry 3
# 重连间隔时间
delay_before_retry 3
}
TCP_CHECK {
connect_timeout 3 --连接超时时间;
nb_get_retry 1 --重连次数;
delay_before_retry 1 --重连间隔时间;
connect_port 3306 --健康检查的端口;
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
keepalive高可用抢占式和非抢占式
(1)默认配置为抢占式:
master挂掉,backup上台,master重新启动则讲IP抢占过去。
(2)非抢占式配置:
两台均为backup,在优先级上做区分,如master挂掉,backup上台,则backup变成master,master变为backup。
a.两个节点的state均为backup(官方建议)
b.两个节点都在vrrp_instance中添加nopreempt
c.其中一个节点的优先级要高于另外一个节点
两台服务器角色都启用了nopreempt后,必须修改角色状态统一为backup,唯一的区别就是优先级不同。
#Master
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
#Backup
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}Keepalived 命令
[root@bogon ~]# keepalived -h
Usage: keepalived [OPTION...]
-f, --use-file=FILE 使用指定的配置文件,默认配置文件是/etc/Keepalived/Keepalived.conf
-P, --vrrp 仅运行 VRRP 子系统。这对于不使用 IPVS 负载平衡器的配置很有用。
-C, --check 检查配置文件
-l, --log-console 将消息记录到本地控制台
-D, --log-detail 日志详细信息
-S, --log-facility=[0-7] 将系统日志工具设置为 LOG_LOCAL[0-7]。默认的 syslog 工具是 LOG_DAEMON
-X, --release-vips Drop VIP on transition from signal.
-V, --dont-release-vrrp 不要在守护进程停止时删除 VRRP VIP 和 VROUTE。默认行为是在 Keepalived 退出时删除所有 VIP 和 VROUTE
-I, --dont-release-ipvs 不要在守护进程停止时删除 IPVS 拓扑。默认行为是在Keepalived 退出时从IPVS 虚拟服务器表中删除所有条目。
-R, --dont-respawn 不要重生子进程。如果任一进程退出,默认行为是重新启动 VRRP 和检查器进程。
-n, --dont-fork Don't fork the daemon process
-d, --dump-conf 转储配置数据。
-p, --pid=FILE 为父 Keepalived 进程使用指定的 pidfile。Keepalived 的默认 pidfile 是“/var/run/Keepalived.pid”。
-r, --vrrp_pid=FILE 为 VRRP 子进程使用指定的 pidfile。VRRP 子进程的默认 pidfile 是“/var/run/Keepalived_vrrp.pid”。
-c, --checkers_pid=FILE 为检查器子进程使用指定的 pidfile。检查器子进程的默认 pidfile 是“/var/run/Keepalived_checkers.pid”。
-a, --address-monitoring Report all address additions/deletions notified via netlink
-x, --snmp 启用 SNMP 子系统。
-A, --snmp-agent-socket=FILE Use the specified socket for master agent
-s, --namespace=NAME Run in network namespace NAME (overrides config)
-m, --core-dump Produce core dump if terminate abnormally
-M, --core-dump-pattern=PATN Also set /proc/sys/kernel/core_pattern to PATN (default 'core')
-i, --config_id id Skip any configuration lines beginning '@' that don't match id
-v, --version Display the version number
-h, --help Display this help message,如下:
#指定了keepalived配置文件的路径
keepalived -f /path/to/your/keepalived.conf
#指定PID文件的路径
keepalived -f /path/to/your/keepalived.conf -p /var/run/keepalived.pid
#不启动keepalived实例的情况下检查配置文件的语法错误
keepalived -C -f /path/to/your/keepalived.conf
#指定日志文件的路径
keepalived -f /path/to/your/keepalived.conf -l /var/log/keepalived.log
Keepalived genhash 命令生成密文密码
Genhash生产中经常频繁用来生成digest值用于Keepalived.conf。此命令用于生成安全的密码散列,该散列通常用于配置文件中的身份验证。以下是 genhash 命令的关键作用和参数概览:
假设我们想生成密码 “MySecurePassword” 的散列,并希望使用随机生成的盐值。以下是一个使用 genhash 命令的实例:
keepalived genhash -s MySecurePassword在这个例子中,-s 参数指定了明文密码 “MySecurePassword”,而盐值是自动生成的。
如果你想使用自定义的盐值,可以将 -r 参数添加到命令中:
keepalived genhash -s MySecurePassword -r MyCustomSaltkeepalived结合nginx
https://juejin.cn/post/7382039232380420096
首先安装Nginx
#安装nginx以及拓展源
yum install epel-release -y
yum install -y nginx安装Keepalived
yum install -y keepalived安装完 Nginx 之后接着配置 web 站点
#web1
[root@nginx1 ~]# vim /etc/nginx/conf.d/web.conf
server{
listen 8080;
root /usr/share/nginx/html;
index test.html;
}
[root@nginx1 ~]# echo "<h1>This is web1</h1>" > /usr/share/nginx/html/test.html
#web2
[root@nginx2 ~]# vim /etc/nginx/conf.d/web.conf
server{
listen 8080;
root /usr/share/nginx/html;
index test.html;
}
[root@nginx2 ~]# echo "<h1>This is web2</h1>" > /usr/share/nginx/html/test.html
nginx -t
nginx配置Keepalived(不同角色有些选项不一样)
web1:master
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 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script nginx_check {
script "/tools/nginx_check.sh"
interval 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass test
}
virtual_ipaddress {
192.168.149.100
}
track_script {
nginx_check
}
notify_master /tools/master.sh
notify_backup /tools/backup.sh
notify_fault /tools/fault.sh
notify_stop /tools/stop.sh
}
web2:slave
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 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script nginx_check {
script "/tools/nginx_check.sh"
interval 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass test
}
virtual_ipaddress {
192.168.149.100
}
track_script {
nginx_check
}
notify_master /tools/master.sh
notify_backup /tools/backup.sh
notify_fault /tools/fault.sh
notify_stop /tools/stop.sh
}
编写相关脚本
cd /tools
cat master.sh
ip=$(hostname -I | awk '{print $1}')
dt=$(date+'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log
cat backup.sh
ip=$(hostname -I | awk '{print $1}')
dt=$(date+'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log
cat fault.sh
ip=$(ip addr|grep inet| grep 192.168 |awk '{print $2}')
dt=$(date +'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log
cat stop.sh
ip=$(ip addr|grep inet| grep 192.168| awk '{print $2}')
dt=$(date +'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log
#两种不同的检测脚本
#检测脚本1
cat nginx_check.sh
#!/bin/bash
result=`pidof nginx`
if [ ! -z "${result}" ];
then
exit 0
else
exit 1
fi
#检测脚本2
cat nginx_check.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒后再次获取一次Nginx状态
nginxpid=$(ps -C nginx --no-header|wc -l)
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
#编写完脚本后我们对这些脚本加 x 权限,并启动 Keepalived
cd /tools/ && chmod +x *.sh
systemctl restart keepalived.servicelvspadm -Ln看一下有没有规则有没有设置成功
keepalived结合docker
其他示例1
关闭防selinux
关闭所有服务器selinux,修改/etc/selinux/config,将SELINUX由enforcing设置为disabled,重启服务器。
keepalived安装
yum -y install keepalived
lvs01配置
! Configuration File for keepalived
global_defs {
router_id MASTER ## keepalived 服务器标识符,可以随意设定( 貌似也是全局唯一 )
}
vrrp_instance VI_1 { ## 定义一个名为 VI_1 的 VRRP 实例
state MASTER ## Keepalived 服务器角色,MASTER 为主、BACKUP 为备
interface eth0 ## 指定 HA 监测网络接口
virtual_router_id 51 ## 虚拟路由标识,同一个 VRRP 实例使用唯一的标识,主备必须一样
priority 100 ## 节点优先级,同一 VRRP 实例中 MASTER 的优先级必须大于 BACKUP
advert_int 1 ## MASTER / BACKUP 之间同步检查间隔时间,单位 秒
authentication { ## 节点之间通信验证类型、密码 ,同一 VRRP 实例中,MASTER / BACKUP 必须使用相同的密码才可以通信
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { ## 虚拟 IP 地址,又称漂移 IP 。可以通过 ip add 在 MASTER 上查看是否绑定
10.1.28.123
}
}
virtual_server 10.1.28.123 8080 { ## 定义虚拟服务器
delay_loop 6 ## 定义健康检查时间间隔,单位 秒
lb_algo rr ## 负载均衡调度算法,支持 rr 、wrr 、lc 、wlc 、lblc 、sh 、dh 等
lb_kind DR ## LVS 负载均衡机制,支持 NAT 、TUN 、DR
persistence_timeout 120 ## 会话保持时间,单位 秒。提供动态页面 session 保持功能,同一 IP 该值时间内被持续分配到同一台节点服务器上
protocol TCP ## 转发协议类型,支持 TCP 、UDP
real_server 10.1.28.30 8080 { ## 定义节点服务器
weight 1 ## 节点权重值,数字越大权重越高,分配到的连接越多。主要用于后端节点服务器性能不统一
notify_down /etc/keepalived/real_down.sh ## 该节点服务器处于 DOWN 状态后执行的脚本
TCP_CHECK { ## 健康检测方式,支持 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK
connect_port 8080 ## 检测端口,不指定时默认为 real_server 指定的端口
connect_timeout 3 ## 无响应超时时间,单位 秒
nb_get_retry 3 ## 重试次数
delay_before_retry 3 ## 重试间隔,单位 秒
}
}
real_server 10.1.28.40 8080 { ## 第二台节点服务器
weight 1
notify_down /etc/keepalived/real_down.sh
TCP_CHECK {
connect_port 8080
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}lvs02配置
! Configuration File for keepalived
global_defs {
router_id lvs02
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.28.123
}
}
virtual_server 10.1.28.123 8080 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 10.1.28.30 8080 {
weight 1
TCP_CHECK{
connetct_timeout 10
retry 3
delay_before_retry 3
connetct_port 8080
}
}
real_server 10.1.28.40 8080 {
weight 2
TCP_CHECK{
connetct_timeout 10
retry 3
delay_before_retry 3
connetct_port 8080
}
}
}设置ARP
节点模式
[root@localhost ~]#systemctl stop firewalld
[root@localhost html]#ifconfig lo:0 10.1.28.123 netmask 255.255.255.255
[root@localhost html]#vim /etc/sysctl.conf
[root@localhost html]#sysctl -p
net.ipv4.conf.all.arp_ignore = 1 #回复目标IP地址是本地接口上配置的IP地址的ARP请求
net.ipv4.conf.all.arp_announce = 2 #表示始终使用最佳的本地IP地址作为源IP地址来发送ARP请求或响应
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1 # 设置专门应用于本地回环接口(lo)
net.ipv4.conf.lo.arp_announce = 2
#
#设置VIP 两台RS都要设置
ifconfig ens33:0 10.1.28.123/24
#设置路由
问题:
虚拟ip无法访问
这个问题有以下可能导致此问题
a. 网络配置错误,虚拟ip其实也是实际存在的,只是动态的分配到机器上的,当网卡被添加虚拟ip信息后,网关、掩码等信息不正确,导致客户机无法路由到虚拟ip机器。所以建议在实施keepalived方案前建议先对网络进行划分。
b. 启用严格遵守VRRP协议(全局设置中包含:vrrp_strict),此设置不一定会导致无法使用keepalived,但如果对网络并不是十分熟悉,仍建议删除此项设置。
组播和单播
组播
单播
配置方法:
global_defs {
router_id LVS_MAIN
}
vrrp_instance MAIN {
state MASTER
interface enp0s8
virtual_router_id 123
priority 200
advert_int 1
#单播模式,配置源地址master的IP地址
unicast_src_ip 192.168.56.104
#单播模式,从节点的IP地址
unicast_peer {
192.168.56.105
192.168.56.106
}
authentication {
auth_type PASS
auth_pass pwd123
}
virtual_ipaddress {
192.168.56.107
}
track_interface {
enp0s8
}
}