9.4 KiB
keepalived 高可用集群
一:keepalived 简介
1. 简介
keepalived
是集群管理中保证集群高可用(HA)
的一个服务软件,其功能类似于heartbeat
,用来防止单点故障。
2. 工作原理
keepalived
是以VRRP
协议为实现基础的,当backup
收不到vrrp
包时就认为master
宕掉了,这时就需要根据VRRP
的优先级来选举一个backup
当master
。这样我们就可以保证集群的高可用。
keepalived
是以VRRP
协议为实现基础的,VRRP
全称Virtual Router Redundancy Protocol
,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N
台提供相同功能的路由器组成一个路由器组,这个组里面有一个master
和多个backup
,master
上面有一个对外提供服务的vip
(该路由器所在局域网内其他机器的默认路由为该vip),master
会发组播,当backup
收不到vrrp
包时就认为master
宕掉了,这时就需要根据VRRP
的优先级来选举一个backup
当master
。这样的话就可以保证路由器的高可用了。
keepalived
主要有三个模块,分别是core
、check
和vrrp
。core
模块为keepalived
的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check
负责健康检查,包括常见的各种检查方式。vrrp
模块是来实现VRRP
协议的。
3. 什么是脑裂
脑裂(split-brain)
:指在一个高可用(HA)
系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。
对于无状态服务的HA
,无所谓脑裂不脑裂;但对有状态服务(比如MySQL
)的HA
,必须要严格防止脑裂。
究竟是有状态服务,还是无状态服务,其判断依据——两个来自相同发起者的请求在服务器端是否具备上下文关系。
脑裂:backup
强资源,master
不认为自己会死,他俩抢着为客户端服务。
解决方案:shoot the other in the head 爆头 master
注意:在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。由于HTTP
协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的session
,将用户挑选的商品(购物车),保存到session
中,当付款的时候,再从购物车里取出商品信息。
二:LVS + Keepalived
1. 环境准备
服务器 | IP | VIP | 说明 |
---|---|---|---|
master | 192.168.159.131 | 主节点 | |
backup | 192.168.159.132 | 备用节点 | |
real server 1 | 192.168.159.133 | lo:0:192.168.159.100 | 真实服务器 |
real server 2 | 192.168.159.134 | lo:0:192.168.159.100 | 真实服务器 |
2. director server 部署
安装keepalived、ipvsadm
[root@master/backup ~]# yum -y install keepalived ipvsadm
修改配置文件
master:
[root@master ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER
interface ens33 // 网卡名称,根据实际情况修改
virtual_router_id 51 // 主备必须一致
priority 100 // 定义优先级
advert_int 1 // 设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
authentication {
auth_type PASS // 主要有PASS和AH两种
auth_pass 1111 // 主备密码一致
}
virtual_ipaddress {
192.168.159.100 // 虚拟IP(VIP)
}
}
virtual_server 192.168.159.100 80 {
delay_loop 6 // 健康检查时间间隔
lb_algo rr
lb_kind DR
#persistence_timeout 50 // 设置会话保持时间,对动态网页非常有用
protocol TCP // 指定转发协议类型,有TCP和UDP两种
real_server 192.168.159.133 80 {
weight 1
TCP_CHECK {
connect_timeout 3 // 连接超时
retry 3 // 重连次数
delay_before_retry 3 // 重试间隔
}
}
real_server 192.168.159.134 80 {
weight 1
TCP_CHECK {
connnect_timeout 3
retry 3
delay_before_retry 3
}
}
}
backup:
[root@backup ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_BACKUP
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.159.100
}
}
virtual_server 192.168.159.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.159.133 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.159.134 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
3. real server 配置
安装httpd
[root@real-server1/2 ~]# yum -y install httpd
设置测试网页
[root@real-server1/2 ~]# echo "Real Server 1/2" > /var/www/html/index.html
启动服务
[root@real-server1/2 ~]# systemctl start httpd
[root@real-server1/2 ~]# systemctl enable httpd
配置 ARP 抑制
[root@real-server1/2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
查看:
[root@real-server1/2 ~]# sysctl -p
添加 VIP 到 lo 接口
[root@real-server1/2 ~]# echo 'DEVICE=lo:0 IPADDR=192.168.159.100 NETMASK=255.255.255.255 ONBOOT=yes' > /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@real-server1/2 ~]# ifup lo:0
4. 启动 keepalived
[root@master/backup ~]# systemctl start keepalived
[root@master/backup ~]# systemctl enable keepalived
5. 检测
其他服务器查看
[root@wxin ~]# for i in {1..10}; do
> curl http://192.168.159.100
> done
Real Server 2
Real Server 1
Real Server 2
Real Server 1
Real Server 2
Real Server 1
Real Server 2
Real Server 1
Real Server 2
Real Server 1
主节点
查看IP
[root@master ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:ba:8f:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.131/24 brd 192.168.159.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.159.100/32 scope global ens33 # 主节点存在,备节点不存在
valid_lft forever preferred_lft forever
inet6 fe80::9e8b:2599:99f6:4087/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@backup ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1a:96:29 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.132/24 brd 192.168.159.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::e859:ecb:5e5:4b9a/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::9e8b:2599:99f6:4087/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::32c3:53e0:5709:d314/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
主节点宕机后
[root@master ~]# systemctl stop keepalived
[root@master ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:ba:8f:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.131/24 brd 192.168.159.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::9e8b:2599:99f6:4087/64 scope link noprefixroute
valid_lft forever preferred_lft forever
VIP 转移到backup后
[root@backup ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1a:96:29 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.132/24 brd 192.168.159.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.159.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::e859:ecb:5e5:4b9a/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::9e8b:2599:99f6:4087/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::32c3:53e0:5709:d314/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever