Mysql 高可用方案 Keepalived

前言:当mysql有了主主或者主备配置后,数据备份有了保障,但是当其中一个master挂掉后,mysql还是无法使用,本文采用Keepalived来保障一个master挂掉后,另一个master立即切换使用

1、MHA和Keepalived

  • MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
  • 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
  • MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
  • MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
问题:mysql初学者,目前在mysql的高可用架构上有些疑问。我的理解:
  1. 只使用MHA(不用使用keepalived)可以实现自动故障切换,配合master_ip_failover_script等脚本可以实现透明故障切换,以及VIP的自动漂移.
  2. 只使用keepalived (不用MHA) 也可以配置"主--从" 或者"主--主"架构,并且实现VIP的自动漂移和故障切换
我的理解
  1. 那么要MHA和keepalived从高可用架构这个角度上来说应该是完成相同功能, 只是keepalived可以实现"双主"和"主--从"架构,MHA只能实现"主--从"架构,
  2. 什么情况下应该使用MHA,什么情况下使用keepalived?
    网上找的一句户:MHA,其实是实现了数据一致性的问题的,主要考虑在master宕机了后保证slave的数据损失最小;keepalived就是实现vip的高可用而已
一 、本文采用Keepalived搭建高可用,配合mysql使用(物理机)
  • 先在一台机器上部署keepalived和mysql(mysql已默认安装)
1、查看本地ip
image.png
2、安装Keepalived
# 可直接用yum源安装
yum install keepalived

查看keepalived的配置文件位置,修改配置文件

3、keepalived.conf
! Configuration File for keepalived 
global_defs {
    notification_email {                #关于邮件的设置
        sachin_0906@183.com             #email send to
    }

    notification_email_from notice@keepalived.cn
        smtp_server 127.0.0.1 
        smtp_connect_timeout 30
        router_id MASTER-HA
}

vrrp_script chk_mysql_port {            #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/opt/chk_mysql.sh"          #这里通过脚本监测
    interval 2                          #脚本执行间隔,每2s检测一次
    weight -5                           #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                              #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                              #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER                        #master1 设置为MASTER
    interface eno1                      #指定虚拟ip的网卡接口
   # mcast_src_ip 192.168.40.127         #绑定的地址
    virtual_router_id 51                #路由器标识,MASTER和BACKUP必须是一致的
    priority 101                        #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 
    advert_int 1         
    authentication {                    #认证类型PASS|AH(IPSEC)
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {                 #虚拟IP的设置即vip
        192.168.200.100
    }

    track_script {                      #监控脚本
        chk_mysql_port             
    }
}
4、chk_mysql.sh 脚本
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    service keepalived stop
fi

chk_mysql.sh的目的是监控mysql是否还存活,如果mysql挂掉,则停止本机器的keepalived,keepalived会自动切换另一个mysql来使用

5、启动keepalived
image.png

查看ip后,发现vip已经生成,此时通过vip 192.168.200.100访问mysql

6、在另外一台局域网机器按1-5步骤通用部署keepalived,keepalived.conf 中除了priority配置,其他可保持一致,这样两台mysql的高可用配置已经完成。可通过主动停掉mysql来进行测试,发现keepalived可以主动漂移到另一台机器的mysql使用,对外统一暴露192.168.200.100虚拟ip
二、docker版keepalived和mysql
1、拉取keepalived镜像
# 拉取镜像
docker pull leishuaishuai/keepalived:2.0
2、运行容器
2.1 脚本配置
  • 目录如下:


    image.png
  • restart.sh
# BEGIN ANSIBLE MANAGED BLOCK
#!/bin/bash
HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
docker rm -f keepalived;
docker run -d --name keepalived --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host \
    -v $HOME/conf:/usr/local/etc/keepalived \
    leishuaishuai/keepalived:2.0 --copy-service
# END ANSIBLE MANAGED BLOCK
  • conf 目录


    image.png
  • chk_mysql.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    echo '!3306 挂了...' > /proc/1/fd/1
    pid=$(ps x | grep keepalived | grep -v grep | awk '{print $1}')
    echo $pid > /proc/1/fd/1
    for i in $pid
    do 
        kill  $i
    done
else
    echo '!3306正常运行...' > /proc/1/fd/1
fi

  • keepalived.conf (配置好后把监控脚本放开)
global_defs {
  default_interface eth0
}

vrrp_script chk_mysql_port {            #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/usr/local/etc/keepalived/chk_mysql.sh"          #这里通过脚本监测
    interval 2                          #脚本执行间隔,每2s检测一次
    weight -5                           #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                              #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                              #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
  interface eth0

  state BACKUP
  virtual_router_id 51
  priority 150
  nopreempt

  unicast_peer {
    192.168.1.10
    192.168.1.11
  }

  virtual_ipaddress {
    192.168.200.126
  }

  authentication {
    auth_type PASS
    auth_pass d0cker
  }
 track_script {                      #监控脚本
        chk_mysql_port             
 }

  notify "/container/service/keepalived/assets/notify.sh"
}

2.2 执行脚本

bash restart.sh
查看日志
docker logs -f --tail 100 keepalived

image.png

发现此时,虚拟ip192.168.200.126已构建,并且正常监控3306端口,此时外部访问mysql可以用192.168.200.126来访问

2.3 查看ip

ip a

image.png

此时也显示构建成功

  • 另一台物理机同理构建
  • mysql、keepalived构建成功,停掉一台机器的mysql,keepalived也随着停止,keepalived的ip会自动切换到另一台机器上,实现mysql的高可用
结语:将keepalived配合mysql的master-master双主方案,即可实现mysql的高可用
希望对你有所帮助!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容