目录
一.keepalive简要介绍
1.keepalive相关文件
2.keepalive配置组成
3.keepalive全局配置
4.配置虚拟路由器
5.抢占模式和非抢占模式
抢占模式(Preemptive Mode)
使用方法:
非抢占模式(Non-preemptive Mode)
使用方法:
二.配置真实服务器web1和web2
三.配置代理服务器
一.keepalive简要介绍
1.keepalive相关文件
软件包名: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
2.keepalive配置组成
/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和R
3.keepalive全局配置
#/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
#keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
root@localhost
360601212@qq.com
}
notification_email_from keepalived@localhost
#发邮件的地址
smtp_server 127.0.0.1
#邮件服务器地址
smtp_connect_timeout 30
#邮件服务器连接timeout
router_id R1
#每个keepalived主机唯一标识,建议使用当前主机名,但多节点重名不影响
vrrp_skip_check_adv_addr
#对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
vrrp_strict
#严格遵守VRRP协议,启用此项后以下状况将无法启动服务:1.无VIP地址 2.配置了单播邻居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置。
vrrp_garp_interval 0
#gratuitous ARP messages 免费ARP报文发送延迟,0表示不延迟
vrrp_gna_interval 0
#unsolicited NA messages (不请自来)消息发送延迟
vrrp_mcast_group4 224.0.0.18
#指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18
vrrp_iptables
#此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}
地址分类:
自定义组播,一般都有规划,不能瞎配
主和备要一样
A类:1-126
B 128-191
C 192-223
D 224-239
E 240-
#修改组播
默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
注意:启用 vrrp_strict 时,不能启用单播
#在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络
4.配置虚拟路由器
vrrp_instance <STRING> {
#<String>为vrrp的实例名,一般为业务名称
配置参数
......
}
#配置参数:
state MASTER|BACKUP
#当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME
#绑定为当前虚拟路由器使用的物理接口,如:eth0,bond0,br0,可以和VIP不在一个网卡
virtual_router_id VRID
#每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一
priority 100
#当前物理节点在此虚拟路由器的优先级,范围:1-254,值越大优先级越高,每个keepalived主机节点此值不同advert_int 1
#vrrp通告的时间间隔,默认1s
authentication {
#认证机制
auth_type AH|PASS
#AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
auth_pass <PASSWORD>
#预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
include /etc/keealived/conf.d/*.conf
virtual_ipaddress {
#虚拟IP,生产环境可能指定上百个IP地址
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.100
#指定VIP,不指定网卡,默认为,注意:不指定/prefix,默认为/32
192.168.200.101/24 dev eth1
#指定VIP的网卡,建议和interface指令指定的岗卡不在一个网卡
192.168.200.102/24 dev eth2 label eth2:1
#指定VIP的网卡label
}
track_interface {
#配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
eth0
eth1
…
}
[root@localhost keepalived]#tcpdump -i ens33 -nn host 224.0.0.18
#启动服务可以抓包查看
5.抢占模式和非抢占模式
抢占模式(Preemptive Mode)
使用方法:
- 在抢占式调度中,一个高优先级任务可以打断当前正在运行的低优先级任务,以确保高优先级任务得到及时处理。
- 操作系统如 Linux 和 Windows 都支持抢占式调度。
在编写多线程应用时,可以通过线程优先级的设置体现抢占式调度。
import threading import time def high_priority_task(): while True: print("High priority task running") time.sleep(0.5) def low_priority_task(): while True: print("Low priority task running") time.sleep(1) high_thread = threading.Thread(target=high_priority_task) low_thread = threading.Thread(target=low_priority_task)# 设置不同的线程优先级(注意:Python 的 threading 模块不直接支持优先级设置,这是示例) # 一些操作系统或高级库可能支持设置线程优先级 high_thread.setDaemon(True) low_thread.setDaemon(True) high_thread.start() low_thread.start() # 模拟主线程执行 time.sleep(10)非抢占模式(Non-preemptive Mode)
使用方法:
- 在非抢占式调度中,任务一旦开始执行,就会一直运行直到完成或者主动放弃 CPU,由调度器明确进行任务切换。
- 非抢占式调度较为简单,但可能导致高优先级任务无法及时处理。
可以通过使用协程或者明显的任务切换点模拟非抢占式调度。
import asyncio
async def task1():
while True:
print("Task 1 running")
await asyncio.sleep(1) # 显式让出控制权
async def task2():
while True:
print("Task 2 running")
await asyncio.sleep(1) # 显式让出控制权
async def main():
await asyncio.gather(task1(), task2())
# 运行事件循环
asyncio.run(main())
keepalive+nginx架构
二.配置真实服务器web1和web2
1.关闭防火墙,并在真实服务器下载http服务
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y
2.分别在web1和web2上制作网页,并开启http服务
web1
[root@localhost ~]# cd /var/www/html
[root@localhost html]# ls
[root@localhost html]# echo zxy13 > /var/www/html/index.html
[root@localhost html]# systemctl start httpdweb2
[root@localhost ~]# cd /var/www/html
[root@localhost html]# ls
[root@localhost html]# echo zxy14 > /var/www/html/index.html
[root@localhost html]# systemctl start httpd
web1
web2
三.配置代理服务器
代理服务器:主192.168.240.11
备192.168.240.12
1.关闭防火墙,并安装epel源和nginx
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install nginx -y
2.编辑nginx配置文件
在192.168.240.11上
配置文件http语句块下加入组和server语句块下加入location匹配实现负载均衡
3.将192.168.240.11代理服务器上/etc/nginx/nginx.conf文件远程拷贝到192.168.240.12的/etc/nginx/nginx.conf
4.安装下载keepalive服务,编辑配置文件
在192.168.240.11上 vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1 # 修改邮箱地址smtp_connect_timeout 30 router_id LVS01 # 修改名称vrrp_skip_check_adv_addr #vrrp_strict #关闭严格模式vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script check_down {script "/etc/keepalived/ng.sh" interval 1weight -30fall 3rise 2timeout 2
}vrrp_script check_down {script "/etc/keepalived/ng.sh" #指明脚本的位置 interval 1 #每隔1s 执行一次检测weight -30 #如果 脚本执行失败自动减少优先级30fall 3 # 3次不成功才标注为失败 rise 2 #nginx 重新起来后检测两次成功 才真的成功 timeout 2 #超时时间 2s
}vrrp_instance VI_1 {state MASTERinterface ens33 #修改网卡的名称virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.240.188 #修改ip}track_script {check_down}}
5.在192.168.240.13(由于12机上环境不干净换机做)上 vim /etc/keepalived/keepalived.conf
router_id LVS02 #修改为LVS02vrrp_skip_check_adv_addr#vrrp_strict #注释关闭严格模式vrrp_garp_interval 0vrrp_gna_interval 0
}
vrrp_script check_down {script "/etc/keepalived/ng.sh"interval 1weight -30fall 3rise 2timeout 2
}
vrrp_instance VI_1 {state BACKUP #修改为备interface ens33 #网卡virtual_router_id 51priority 80 #优先级advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.240.188 #地址}track_script {check_down}
}
6.在客户机上测试
(1)curl 虚拟地址192.168.240.188
tcpdump客户机上抓包主服务器在发送报文
(2)关闭主服务器nginx使用ip a 查看 192.168.240.188 已经不在主服务器上
tcpdump客户机上抓包备服务器在发送报文
使用 ip a 命令查看备服务器192.168.240.13 ,192.168.240.188在备服务器上
启动主服务器
ip a 查看主服务器,192.168.240.188 在主服务器上被主服务器抢占
tcpdump -i ens33 host 224.0.0.18 -nn 在客户机查看