当前位置:   article > 正文

[MySQL]-双主+keepalived实现高可用_mysql keepalived

mysql keepalived

[MySQL]-双主+keepalived实现高可用


森格 | 2023年1月

本文旨在记录学习主从时的拓展内容,怎么借助keepalived实现简单的高可用。

一、环境介绍


1.1 keepalived


keepalived的作用是检测服务器的状态,若某一台服务器宕机,会通过VIP(虚拟IP)的漂移选择另一台服务器,从而实现高可用。

它的工作原理是VRRP,即虚拟路由冗余协议,其中有两组重要概念:

  • VRRP路由器 & 虚拟路由器
  • 主控路由器 & 备份路由器

其实也好理解,对于第一组概念,VRRP路由器是物理实体,指的是运行VRRP的路由器;虚拟路由器是VRRP创建的,是一种逻辑概念,一组VRRP路由器协同工作,共同构成一台虚拟路由器。

对于第二组概念,其协议中存在着一种选举机制,用于选出提供服务的路由即为主控路由,其他的则成了备份路由。当主控路由失效后,会从备份路由中重新选举出一个主控路由,来继续工作,保障服务的不间断。

1.2 双主


对于主从同步的模式分为很多,这里选择用双主模式,个人理解为,两台机器互为主备,一台主机宕机,另一台机器可以继续提供服务。

1.3 基本原理


在这里插入图片描述

两台机器做双主同步,如果一台宕机,在没有VIP的时候,是不是需要我们手动去切换节点,这个过程是相对是非常耗时的,加入keepalived后,我们服务器的请求直接发送到VIP上,由VIP选择要去访问的IP,对于用户可以认为是无感知的,这也是它最大的优点。

二、实战操作


2.1 双主的配置


和主从同步的配置是一样的,这里可以参照我的上一篇文章《[MySQL]-主从同步实战》

唯一要注意的就是,这篇文章是一主一从,对于双主,就是在两台机器上都布置下一主一从就可以,同时第二台机器部署主从同步时,可以不需要再去dump了。

2.2 keepalived的部署


开始之前呢,我们需要两台机器,和一个其他机器的IP当做VIP来使用。

要在两台机器上都部署keepalived

# 下载
wget http://www.keepalived.org/software/keepalived-1.4.5.tar.gz

# 解压缩
tar -zxf keepalived-1.4.5.tar.gz

# 编译安装
cd keepalived-1.4.5
./configure --prefix=/xx/xx/keepalived (你的安装路径)
make && make install

# 复制所需文件
cp /xx/xx/keepalived/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
cp /xx/xx/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

# 复制配置文件
mkdir /etc/keepalived
cp /xx/xx/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
echo "/etc/init.d/keepalived start" >> /etc/rc.local
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
  • 1
  • 2

机器1的配置:

! Configurateon Fll-cmd --list-portsile for keepalived
       
global_defs {
router_id 1
}
       
vrrp_script chk_mysql_port {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/etc/keepalived/mysql.sh"   #这里通过脚本监测
    interval 2                   #脚本执行间隔,每2s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
       
vrrp_instance VI_1 {
#    state MASTER        
    state BACKUP     
    nopreempt    #非抢占模式
    interface ens192      #指定虚拟ip的网卡接口
    mcast_src_ip IP2		#机器1的IP 
    virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
    priority 101            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        VIP		#虚拟IP 
    }
      
track_script {               
   chk_mysql_port             
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

机器2的配置:

! Configuration File for keepalived
       
global_defs {
router_id 2 
}
       
vrrp_script  {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/etc/keepalived/mysql.sh"   #这里通过脚本监测
    interval 2                   #脚本执行间隔,每2s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
       
vrrp_instance VI_1 {
#    state MASTER        
    state BACKUP     
    nopreempt    #非抢占模式
    interface ens192      #指定虚拟ip的网卡接口
    mcast_src_ip IP2		#机器2的IP 
    virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
    priority 100            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        VIP		#虚拟IP 
    }
      
track_script {               
   chk_mysql_port             
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

检测脚本 mysql.sh (我这里的两台机器数据库的端口为3307)

#!bin/bash
source ~/.bash_profile
counter=$(netstat -na|grep "LISTEN"|grep "3307"|wc -l)
if [ "${counter}" -eq 0 ]; then
    /etc/init.d/keepalived stop
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
chmod 755 /etc/keepalived/mysql.sh
  • 1

启动

/etc/init.d/keepalived start
正在启动 keepalived:                                      [确定]
  • 1
  • 2

2.3 测试


# 查看两台机器的网卡情况
# 因为我们给机器1的priority要大一些,所以机器1的网卡上可以看到VIP的信息
inet VIP/32 scope global ens192
  • 1
  • 2
  • 3

下面我们试着让机器1的mysql宕机,宕机之后我们再看一下VIP是在哪台机器上

# 这里模拟的比较简单,直接将3307端口干掉了
lsof -i:3307 | awk 'NR!=1{print $2}' | xargs kill -9
  • 1
  • 2

之后如果你的配置一切正常,再次查看两台机器的网卡情况后,如果在机器2上看到VIP的信息,那么到这里就说明你的双主+keepalived的高可用配置成功了。你的用户只需要访问VIP的地址,对IP的漂移是无感知的。这样一来,等到下次你的机器挂掉一台,就不用再去进行手动切换了。

三、总结


本文章介绍了MySQL最普通的一种高可用方案,优点很明显,但是回过头来,我们也要去思考是否存在缺点。下面是小编个人总结的优缺点:

优点:

  • 部署方便,成本低
  • 对用户无感知,不用再让运维人员手动进行切换

缺点:

  • 脚本检测不完美。想要写出一份完美的检测脚本是很困难的,简单地去判断端口是否有服务是不够,倘若数据库假死怎么去避免呢?
  • 数据的延迟。主从同步在大量数据写入时宕机,怎么保证数据的一致性呢?

所以,这么看来,任何一种方案都不是完美的,继续加油学习吧!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/675525
推荐阅读
相关标签
  

闽ICP备14008679号