LVS-DR-Keepalived
简介
keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件,也就是我们平时说的第 3 层、第 4层和第 5 层交换。 Keepalived 的作用是检测服务器的状态,如果有一台 服务器死机,或工作出现故障, Keepalived 将检测到,并将有故障的服务器从系统中剔除,当服务器工作正常后Keepalived 自动将 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
原理
Layer3,4&5 工作在 IP/TCP 协议栈的 IP 层, TCP 层,及应用层,。
Layer3: Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向服务器群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序) , 如果发现某台服务的 IP 地址没有激活, Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。 Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。
Layer4: 主要以 TCP 端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。
Layer5: Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除
keepalived作用
-
管理VIP VIP地址会在分发器之间切换
-
监控 LVS 分发器
-
管理后端节点
运行在主分发的 Keepalived 会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认为主 LVS 挂了,开始接手主分发器工作,把 VIP 配给自己。
Keepalived 会每隔一个时间段去做一次类似于访问的操作如:探针: elinks http://192.168.1.1 –dump
搭建Keepalived
网络拓扑
Master配置
安装keepalived
[root@LVS-Master ~]# yum install -y keepalived
[root@LVS-Master ~]# systemctl start keepalived.service && systemctl enable keepalived.servic
修改配置文件
[root@LVS-Master ~]# cd /etc/keepalived/
[root@LVS-Master keepalived]# cp keepalived.conf keepalived.conf.bak # 文件备份
[root@LVS-Master keepalived]# vim keepalived.conf
global_defs { ##全局定义块
notification_email { ##邮件通知
root@localhost
}
#设置邮件的发送地址
notification_email_from root@localhost
smtp_server 127.0.01 #设置 smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间
router_id LVS_Master #load balancer 的标识 ID,用于 email 警报
}
#配置实例
vrrp_instance apache {
state MASTER
interface eth33 #生成VIP地址的接口
virtual_router_id 10 #主、备机的 virtual_router_id 必须相同,取值 0-255
priority 100 #主机的优先级,备份机改为 50,主机优先级一定要大于备机
advert_int 1 #主备之间的通告间隔秒数
authentication {
auth_type PASS #设置验证类型,主要有 PASS 和 AH 两种
auth_pass root
}
virtual_ipaddress {
192.168.1.111
}
}
## 虚拟服务配置
virtual_server 192.168.1.111 80 {
delay_loop 6 #Keepalived 多长时间监测一次 RS
lb_algo rr #lvs 调度算法,这里使用轮叫
lb_kind DR #LVS 是用 DR 模式
#persistence_timeout 50 #同一 IP 50 秒内的请求都发到同个 real server 超过50S 发到另外一个节点
protocol TCP #指定转发协议类型,有 tcp 和 udp 两种
real_server 192.168.1.109 80 { #配置服务节点
weight 1 ##默认为1,0为失效
TCP_CHECK{ ##TCP方式的健康检查,realserve 的状态检测设置部分,单位是秒
connect_timeout 3 #10 秒无响应超时
retry 3 #重试次数
delay_before_retry 3 #重试间隔
connect_port 80 # 连接端口
}
}
real_server 192.168.1.110 80 {
weight 1
TCP_CHECK{
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
}
Slave配置
安装keepalived
[root@LVS-Slave ~]# yum install -y keepalived
[root@LVS-Slave ~]# systemctl start keepalived.service && systemctl enable keepalived.servic
修改配置文件
[root@LVS-Slave ~]# cd /etc/keepalived/
[root@LVS-Slave keepalived]# cp keepalived.conf keepalived.conf.bak # 文件备份
[root@LVS-Slave keepalived]# vim keepalived.conf
global_defs { ##全局定义块
notification_email { ##邮件通知
root@localhost
}
#设置邮件的发送地址
notification_email_from root@localhost
smtp_server 127.0.01 #设置 smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间
router_id LVS_Slave #load balancer 的标识 ID,用于 email 警报
}
#配置实例
vrrp_instance apache {
state BACKUP # 大写
interface eth33 # 生成VIP的接口
virtual_router_id 10 #主、备机的 virtual_router_id 必须相同,取值 0-255
priority 90 #主机的优先级,备份机改为 90,主机优先级一定要大于备机
advert_int 1 #主备之间的通告间隔秒数
authentication {
auth_type PASS #设置验证类型,主要有 PASS 和 AH 两种
auth_pass root
}
virtual_ipaddress {
192.168.1.111
}
}
## 虚拟服务配置
virtual_server 192.168.1.111 80 {
delay_loop 6 #Keepalived 多长时间监测一次 RS
lb_algo rr #lvs 调度算法,这里使用轮叫
lb_kind DR #LVS 是用 DR 模式
#persistence_timeout 50 #同一 IP 50 秒内的请求都发到同个 real server 超过50S 发到另外一个节点
protocol TCP #指定转发协议类型,有 tcp 和 udp 两种
real_server 192.168.1.109 80 { #配置服务节点
weight 1 ##默认为1,0为失效
TCP_CHECK{ ##TCP方式的健康检查,realserve 的状态检测设置部分,单位是秒
connect_timeout 3 #10 秒无响应超时
retry 3 #重试次数
delay_before_retry 3 #重试间隔
connect_port 80 # 连接端口
}
}
real_server 192.168.1.110 80 {
weight 1
TCP_CHECK{
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
}
测试VIP地址切换
# 在master关闭服务
[root@LVS-Master ~]# systemctl stop keepalived.service
节点配置
Node1与Node2配置一样
# 抑制ARP
[root@Node1 ~]# yum -y install httpd
[root@Node1 ~]# systemctl start httpd && systemctl enable httpd
[root@Node1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@Node1 ~]# sysctl -p
# 添加VIP路由
[root@Node1 ~]# ifconfig lo:1 192.168.1.111 netmask 255.255.255.255 broadcast 192.168.1.111 up
[root@Node1 ~]# route add -host 192.168.1.111 dev lo
[root@Node1 ~]# echo "Node1 test page" > /var/www/html/index.htnl
[root@Node2 ~]# echo "Node2 test page" > /var/www/html/index.htnl
客户端进行测试
节点全部正常运行
[root@client ~]# curl 192.168.1.111
[root@client ~]# curl 192.168.1.111
[root@client ~]# curl 192.168.1.111
Node1节点损坏
[root@Node1 ~]# systemctl stop httpd
Node1节点恢复正常
[root@Node1 ~]# systemctl start httpd
Keepavlied双向主从
master配置
[root@LVS-Master ~]# cd /etc/keepalived/
[root@LVS-Master keepalived]# cp keepalived.conf keepalived.conf.bak # 文件备份
[root@LVS-Master keepalived]# vim keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id DR2
}
vrrp_instance apache {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass root
}
virtual_ipaddress {
192.168.1.111
}
}
vrrp_instance mysql {
state BACKUP
interface ens33
virtual_router_id 53
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass root
}
virtual_ipaddress {
192.168.1.112
}
}
virtual_server 192.168.1.111 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.1.109 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.110 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.1.112 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.1.109 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.110 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
slave配置
[root@LVS-Slave ~]# cd /etc/keepalived/
[root@LVS-Slave keepalived]# cp keepalived.conf keepalived.conf.bak # 文件备份
[root@LVS-Slave keepalived]# vim keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id DR2
}
vrrp_instance apache {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass root
}
virtual_ipaddress {
192.168.1.111
}
}
vrrp_instance mysql {
state MASTER
virtual_router_id 53
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass root
}
virtual_ipaddress {
192.168.1.112
}
}
virtual_server 192.168.1.111 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.1.109 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.110 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.1.112 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.1.109 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.110 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
master查看VIP地址
[root@LVS-Master keepalived]# ip a show ens33
slave查看VIP地址
[root@LVS-Slave keepalived]# ip a show ens33
客户端测试
访问apache实例
[root@client ~]# curl 192.168.1.111
[root@client ~]# curl 192.168.1.111
访问mysql实例
[root@client ~]# curl 192.168.1.112
[root@client ~]# curl 192.168.1.112