文章目录
Keepalived简介
Keepalived两大核心
1、健康检查
Keepalived起初是为LVS实际的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型,在第三(网络层)、第四(传输层)、第五层(应用层),通过探测数据传送的状态判断节点状态是否正常。如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
2、故障切换
后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
Keepalived工作原理
1、虚拟路由冗余协议
VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了
2、切换机制与心跳
Keepalived dirctors之间的故障切换转移,是通过VRRP协议来实现的。在keepalived directors正常工作时,主Directors节点会不断的向备节点广播心跳信息,用以告诉备节点自己还存活,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身的备用角色
Keepalived配置文件详解
全局变量
global_defs {
notification_email { #设置 keepalived 在发生事件(比如切换)的时候,需要发送到的email地址,可以设置多个,每行一个。
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值。
smtp_server 192.168.200.1 #指定发送邮件的smtp服务器。
smtp_connect_timeout 30 #设置smtp连接超时时间,单位为秒。
router_id LVS_DEVEL #是运行keepalived的一个表示,多个集群设置不同。
rrp_skip_check_adv_addr #默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
vrrp_strict #严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1.没有VIP地 址。2.单播邻居。3.在VRRP版本2中有IPv6地址。
vrrp_garp_interval 0 #在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0.
vrrp_gna_interval 0
}
VRRPD配置
VRRPD 的配置是 Keepalived比较重要的配置,主要分为两个部分 VRRP 同步组和 VRRP实例,也就是想要使用 VRRP进行高可用选举,那么就一定需要配置一个VRRP实例,在实例中来定义 VIP、服务器角色等
1、VRRP Sync Groups
不使用Sync Group的话,如果机器(或者说router)有两个网段,一个内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题时,VRRPD认为自己仍然健康,那么不会发生Master和Backup的切换,从而导致了问题。Sync group就是为了解决这个问题,可以把两个实例都放进一个Sync Group,这样的话,group里面任何一个实例出现问题都会发生切换。
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
VI_1 #实例名
VI_2
......
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
2、VRRP实例(instance)配置
vrrp_instance VI_1 {
state MASTER #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。
interface eth0 #指定实例绑定的网卡
virtual_router_id 51 #设置VRID标记,多个集群不能重复(0..255)
priority 100 #设置优先级,优先级高的会被竞选为Master,Master要高于BACKUP至
少50
advert_int 1 #检查的时间间隔,默认1s
nopreempt #不抢占模式,只在优先级高的机器上设置即可,优先级低的机器上不设置。
preempt_delay #抢占延迟,默认5分钟
debug #debug级别
authentication { #设置认证
auth_type PASS #认证方式,支持PASS和AH,官方建议使用PASS
auth_pass 1111 #认证的密码
}
virtual_ipaddress { #设置VIP,可以设置多个,用于切换时的地址绑定。格式:#
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABE
192.168.200.16/24 dev eth0 label eth0:1
192.168.200.17/24 dev eth1 label eth1:1
192.168.200.18
}
}
LVS配置
虚拟服务器virtual_server定义块 ,虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。 该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在virtual_server模块中的,是子模块。
virtual_server 192.168.202.200 23 { #VIP地址,要和vrrp_instance模块中virtual_ipaddress地址一致
delay_loop 6 #健康检查时间间隔
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #负载均衡转发规则NAT|DR|RUN
persistence_timeout 5 #会话保持时间
protocol TCP #使用的协议
persistence_granularity <NETMASK> #lvs会话保持粒度
virtualhost <string> #检查的web服务器的虚拟主机(host:头)
sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用
real_server 192.168.200.5 23 { #RS的真实IP地址
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up <string> | <quoted-string> #在检测到server up后执行脚本
notify_down <string> | <quoted-string> #在检测到server down后执行脚本
TCP_CHECK { #常用检测
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 23 #健康检查的端口的端口
bindto <ip>
}
}
Mysql双主高可用实战部署
Keepalived安装配置
1、环境要求
[root@mysql01 ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
主机名 | IP | 角色 |
---|---|---|
test | 192.168.139.156 | 测试登录mysql数据库 |
mysql01 | 192.168.139.157 | mysql数据库 |
mysql02 | 192.168.139.158 | mysql数据库 |
2、同步时间
[root@mysql01 ~]# yum install ntpdate -y
[root@mysql01 ~]# ntpdate ntp1.aliyun.com
#另一台机器也执行相同操作
3、关闭防火墙
[root@mysql01 ~]# systemctl stop firewalld
[root@mysql01 ~]# systemctl disable firewalld
[root@mysql01 ~]# setenforce 0
[root@mysql01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
#测试机与两台服务机执行相同操作
4、下载Keepalived安装
#下载安装
[root@mysql01 ~]# wget https://www.keepalived.org/software/keepalived-2.1.0.tar.gz
[root@mysql01 ~]# tar -xf keepalived-2.0.11.tar.gz -C /usr/local/src
[root@mysql01 ~]# mkdir -p /data/keepalived #创建安装目录
[root@mysql01 ~]# yum install openssl-devel gcc gcc-c++ make #下载所需依赖
[root@mysql01 ~]# cd /usr/local/src/keepalived-2.0.11
[root@mysql01 keepalived-2.0.11]#./configure --prefix=/data/keepalived
#规范启动
[root@mysql01 etc]# pwd
/usr/local/src/keepalived-2.1.0/keepalived/etc
[root@mysql01 etc]# cp -R init /data/keepalived/
[root@mysql01 etc]# cp -R init /data/keepalived/etc/
[root@mysql01 etc]# cp -R init.d /data/keepalived/etc/
[root@mysql01 etc]# ll /data/keepalived/etc/
总用量 0
drwxrwxr-x. 2 1000 1000 86 8月 11 15:09 init
drwxrwxr-x. 2 1000 1000 135 8月 11 15:09 init.d
drwxr-xr-x. 3 root root 44 8月 11 15:11 keepalived
drwxr-xr-x. 2 root root 24 8月 11 15:11 sysconfig
[root@mysql01 etc]# cp /data/keepalived/etc/init.d/keepalived /etc/init.d/
[root@mysql01 etc]# cp /data/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@mysql01 etc]# mkdir /etc/keepalived
[root@mysql01 etc]# cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@mysql01 etc]# cp /data/keepalived/sbin/keepalived /usr/sbin/
4、启动Keepalived
[root@mysql01 ~]# systemctl start keepalived
[root@mysql01 ~]# ps -ef | grep keepalived
root 17165 1 0 10:12 ? 00:00:00 /data/keepalived/sbin/keepalived -D
root 17166 17165 0 10:12 ? 00:00:11 /data/keepalived/sbin/keepalived -D
root 28067 23123 0 13:06 pts/1 00:00:00 grep --color=auto keepalived
#此时看见两个进程,因为,第一个是主进程,第二个是故障切换的子进程,没有开启健康检查进程。
5、配置Keepalived
#节点1 ----> 192.168.139.157
[root@mysql01 ~]# cat /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 kp1
}
vrrp_script check_mysqld {
script "/etc/keepalived/check_mysqld.sh" #定义检查Mysql状态的脚本(绝对路径)
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens32 #网卡接口名称
virtual_router_id 51
priority 100
nopreempt #不抢占模式,只在优先级高的节点上配置
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.139.200/24 #浮动IP
}
track_script {
check_mysqld #引用检查MySQL进程的脚本
}
}
#节点2 ---> 192.168.139.158
[root@mysql02 ~]# cat /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 kp1
}
vrrp_script check_mysqld {
script "/etc/keepalived/check_mysqld.sh" #定义检查Mysql状态的脚本(绝对路径)
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens32 #网卡接口名称
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.139.200/24 #浮动IP
}
track_script {
check_mysqld #引用检查MySQL进程的脚本
}
}
6、在对应路径下编辑监控mysql状态脚本
#mysql01与mysql02节点都要编辑
[root@mysql01 ~]# cat /etc/keepalived/check_mysqld.sh
#!/bin/bash
user=root #mysql登录账户
pass=Centos@123 #mysql登录密码
/usr/bin/mysql -u$user -p$pass -e "show status;" > /dev/null 2>&1
if [ $? -eq 0 ];
then
MYSQL_STATUS=0
else
MYSQL_STATUS=1
fi
exit $MYSQL_STATUS
#mysql状态判断只有两个值,0和1,执行成功返回0,不成功返回1
7、重启Keepalived与mysql
[root@mysql01 ~]# systemctl restart keepalived
[root@mysql01 ~]# systemctl start mysqld
[root@mysql02 ~]# systemctl restart keepalived
[root@mysql02 ~]# systemctl start mysqld
Mysql创建账号测试
1、创建账号
mysql> create user 'keepalived'@'192.168.139.%' identified with mysql_native_password by 'Centos@123';
mysql> flush privileges;
2、登录测试
#测试节点 ---> 192.168.139.156
[root@test ~]# mysql -h 192.168.139.157 -u keepalived -pCentos@123
#在mysql01节点上查看ip
[root@mysql01 ~]# ip a
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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0f:47:f0 brd ff:ff:ff:ff:ff:ff
inet 192.168.139.157/24 brd 192.168.139.255 scope global noprefixroute ens32
valid_lft forever preferred_lft forever
inet 192.168.139.200/24 scope global secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe0f:47f0/64 scope link
valid_lft forever preferred_lft forever
#此时,mysql02节点上没有浮动ip,若有浮动ip,即为脑裂,检查防火墙是否关闭,看配置文件是否有问题。
#关闭mysql01节点
[root@mysql01 ~]# systemctl stop mysqld
#查看mysql01节点ip,查看mysql02节点ip,会发现浮动ip已经漂移到mysql02节点上,当再次启动mysql01节点时,浮动ip没有立即漂回,应为配置文件中配置了vip不抢占模式
[root@mysql01 ~]# ip a
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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0f:47:f0 brd ff:ff:ff:ff:ff:ff
inet 192.168.139.157/24 brd 192.168.139.255 scope global noprefixroute ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe0f:47f0/64 scope link
valid_lft forever preferred_lft forever
[root@mysql02 ~]# ip a
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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0f:47:f0 brd ff:ff:ff:ff:ff:ff
inet 192.168.139.157/24 brd 192.168.139.255 scope global noprefixroute ens32
valid_lft forever preferred_lft forever
inet 192.168.139.200/24 scope global secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe0f:47f0/64 scope link
valid_lft forever preferred_lft forever
此时,Keepalived实现Mysql双主高可用架构已搭建完成。