Keepalived实现Mysql高可用

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角色
test192.168.139.156测试登录mysql数据库
mysql01192.168.139.157mysql数据库
mysql02192.168.139.158mysql数据库

       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安装

       点击此处下载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双主高可用架构已搭建完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值