keepalived实现高可用
high availability——为了防止单点故障,要有备份,有替补
可使用软件——keepalived(开源免费)、heartbeat、HAproxy
keepalived的使用
工作原理
Keepalived是一个用c编写的路由软件。这个项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而健壮的负载平衡和高可用性设施。负载平衡框架依赖于众所周知的和广泛使用的Linux虚拟服务器(IPVS)内核模块提供第4层负载平衡。Keepalived实现了一组检查器,根据负载平衡服务器池的健康状况,动态、自适应地维护和管理负载平衡服务器池。另一方面,高可用性是通过以下方式实现的虚拟路由器冗余协议协议。VRRP是路由器故障转移的基础。此外,Keepalived实现了一组到VRRP有限状态机的挂钩,提供了低级和高速的协议交互。为了提供最快的网络故障检测,Keepalived实现了BFD协议。VRRP状态转换可以考虑BFD提示来驱动快速状态转换。Keepalived框架可以单独使用,也可以一起使用,以提供弹性基础设施
有两个功能:
1、负载均衡——》IPVS内核模块——》lvs
2、高可用
VRRP协议(虚拟路由冗余协议)——》网络里的技术
实现了高可用性,是路由器故障转移的基础
vrrp——网络层协议
虚拟IP地址——》漂移
vip: virtual ip 虚拟ip地址,这个地址是对外提供服务的
VRID——virtual router id 虚拟路由器标识——》你是哪个虚拟路由器组的
脑裂:出现了2个或者多个vip
Priority——优先级
选举——是否vrid相同,优先级越高越有可能
Adver Interval——宣告信息的间隔时间 默认1s
vrrp协议报文使用固定的组播地址224.0.0.18(D类地址)进行发送
没有安装keepalived软件的机器是读不懂的,不参与选举
搭建
-
准备工作:
两台中间件服务器
master——mysql-slave2 192.168.175.131
backup——backup-mysqlrouter 192.168.175.137
安装:mysqlrouter、keepalived
yum install keepalived -y
两台数据库服务器
master——mysql 192.168.175.138
backup——mysql-salve1 193.168.175.130
-
配置keepalived——vim /etc/keepalived/keepalived.conf
master中间件配置:! 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_strict 需要注释:因为会在iptables里添加一条规则,阻止网络通信,会导致脑裂 vrrp_garp_interval 0 vrrp_gna_interval 0 } #定义一个vrrp协议的实例,名字叫VI_1,第一个vrrp实例 vrrp_instance VI_1 { state MASTER #做master角色 interface ens33 #指定监听网络的接口,其实就是vip绑定到哪个网络接口上 virtual_router_id 51 #虚拟路由器id——类比帮派 51是帮派的编号 1~255之间 priority 100 #优先级 advert_int 1 #vip向外宣告消息的时间间隔 1s authentication { auth_type PASS #密码认证 auth_pass 1111 #具体密码 } virtual_ipaddress { #VIP 虚拟ip地址 192.168.175.188 } }
backup中间件配置:
! 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_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.175.188
}
}
-
分别重启两台中间件的keepalived服务
service keepalived restart
-
查看vip状态——此时master中间件占有vip
-
master中间件
[root@mysql-slave2 keepalived]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:0c:29:0b:4e:b7 brd ff:ff:ff:ff:ff:ff inet 192.168.175.131/24 brd 192.168.175.255 scope global noprefixroute dynamic ens33 valid_lft 1596sec preferred_lft 1596sec inet 192.168.175.188/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::4ab1:7a94:7274:c1ae/64 scope link noprefixroute valid_lft forever preferred_lft forever
-
backup中间件
[root@backup-mysqlrouter keepalived]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:b3:32:01 brd ff:ff:ff:ff:ff:ff inet 192.168.175.137/24 brd 192.168.175.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::fa07:4df1:e933:ca99/64 scope link noprefixroute valid_lft forever preferred_lft forever
-
-
模拟master中间件服务器宕机——关闭keepalived服务
[root@mysql-slave2 keepalived]# service keepalived stop Redirecting to /bin/systemctl stop keepalived.service
-
再次查看vip状态——此时backup中间件占有vip
-
backup中间件
[root@backup-mysqlrouter keepalived]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:b3:32:01 brd ff:ff:ff:ff:ff:ff inet 192.168.175.137/24 brd 192.168.175.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.175.188/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::fa07:4df1:e933:ca99/64 scope link noprefixroute valid_lft forever preferred_lft forever
-
-
同理当重启master中间件的keepalived服务时,vip将会被master中间件从backup中间件中夺回,因为在配置keepalived配置文件时,在同一虚拟路由器id下master的优先级比backup的优先级高。
脑裂现象
定义:
出现了2个或者多个vip
出现的原因:
1、两台中间件在keepalived的配置文件中虚拟路由器id(vrid)不一样,且虚拟ip地址一致
2、网络通信有问题:中间件之间有防火墙阻止了网络之间的选举过程,vrrp报文的通信
3、两台中间件在keepalived的配置文件中认证密码不一样
扩展
脑裂是否有危害?
没有影响,可以正常访问业务,还可以起到负载均衡的作用
正常——》发生脑裂,以及脑裂过程中是没有影响的
脑裂——》恢复正常,这个过程mysql这种有状态的服务肯会导致数据丢失,连接中断
单vip的情况,另外一台backup服务器是闲置的,如何利用起来?
1、故意脑裂
2、双VIP
双VIP:跟MySQL里的主主复制非常相似
2个实例:
VI_1:
master:192.168.175.131 vip:192.168.175.188
backup:192.168.175.137
VI_2:
backup:192.168.175.131
master:192.168.175.137 vip:192.168.0.189
# master中间件——192.168.175.131
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.175.188
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.175.189
}
}
# backup中间件——192.168.175.137
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.175.188
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.175.189
}
}
分别重启两台中间件的keepalived服务
[root@mysql-slave2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:0b:4e:b7 brd ff:ff:ff:ff:ff:ff
inet 192.168.175.131/24 brd 192.168.175.255 scope global noprefixroute dynamic ens33
valid_lft 1627sec preferred_lft 1627sec
inet 192.168.175.188/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::4ab1:7a94:7274:c1ae/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@backup-mysqlrouter keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:b3:32:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.175.137/24 brd 192.168.175.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.175.189/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::fa07:4df1:e933:ca99/64 scope link noprefixroute
valid_lft forever preferred_lft forever