设为首页 收藏本站
查看: 354|回复: 0

[经验分享] 探索MySQL高可用架构之MHA(6)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-9 08:22:19 | 显示全部楼层 |阅读模式
上一篇文章介绍了本次架构的Atlas读写分离!
    本篇文章主要介绍本次架构中的keepalive部分!
    什么是Keepalived呢????
        keepalived是一款c语言写的实现在linux系统上实现负载均衡和高可用的软件。它遵从于GNU是一款优秀的开源软件。keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障的发生。
    两个关键词的解释
        负载均衡
        keepalived内置了对ipvs函数的调用支持。可以直接在keepalived中按照语法配置ipvs然后keepalived就可以实现对ipvs的配置。
        高可用
        keepalived是以VRRPVirtual Router Redundancy Protocol协议为实现基础的即虚拟路由冗余协议。虚拟路由冗余协议可以认为是实现路由器高可用的协议即将N台提供相同功能的路由器组成一个路由器组这个组里面有一个master和多个backupmaster上面有一个对外提供服务的vip该路由器所在局域网内其他机器的默认路由为该vipmaster会发组播当backup收不到vrrp包时就认为master宕掉了这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
        本套架构中keepalive的作用????
        由于mysql+replication方案中master和slave的关系是一对多的关系,整个系统中只有一个master节点(写入节点),多个slave节点,那么master节点一旦down机后,整个系统的数据写入操作将瘫痪,对系统造成严重后果。为此引入了keepalive工具,让这个系统的master和slave关系是多对多的关系,对master节点进行双机热备,以达到整个系统的高可用性。其中keepalive工具负责对两个master节点进行不间断监听,一旦工作中的master节点停止工作后,那么备份master节点就会接管 ,让这个系统正常工作。向外提供一个虚拟ip以供proxy访问master,虚拟ip对应了两个实ip的maser节点。
    下面就让我们开始操作吧:

        源码包安装keepalive

1
2
3
4
5
6
7
8
tar zxf keepalived-1.2.2.tar.gz     #解压源码包
cd keepalived-1.2.2        #进入目录
./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64
#configure编译
make && make install     #安装
cp /usr/local/sbin/keepalived /sbin/keepalived    #拷贝可执行命令
service keepalived start        #启动keepalive服务
service keepalived stop    #关闭keepalive服务



        make时可能报错如下:

QQ截图20150709082232.png

        解决方法:

1
2
3
4
5
6
cd keepalived-1.2.2    #进入源码目录
vi keepalived/libipvs-2.6/ip_vs.h    #修改如下
(1)#include <linux/types.h>        /* For __beXX types in userland */
#找到上面这一行
(2)#include <sys/types.h>
#把(1)这一行,放在(2)代码下面,接下来顺利make了。



        编辑keepalived资源配置文件

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
vi /etc/keepalived/keepalived.conf    #修改如下
! Configuration File for keepalived
global_defs {
   router_id MYSQL-ha    #为router_id命名
}
vrrp_script check_running {
       script"/etc/keepalived/keepalived_check_mysql.sh"   #判断实例是running的脚本
       interval 5   #每5秒执行一次,判断实例是running的脚本
}
vrrp_instance PWRD_1 {      #指定vrrp_instance实例
       state BACKUP        #指定状态为备份
       interface bond0     #网络端口为bond0
      virtual_router_id 88   
       priority 150 #[另一台是100]   #本机权重
       advert_int 1
       nopreempt #[另一台不加]    #当主机恢复时,不抢占
       authentication{
       auth_type PASS      #密码验证
       auth_pass 99999
           }
      virtual_ipaddress {
             10.142.132.49   #指定VIP
       }
       track_script {
             check_running
       }
       notify_master/etc/keepalived/master.sh   #当前服务器为主时,觖发执行的脚本
       notify_backup/etc/keepalived/slave.sh   #当前服务器为备时,觖发执行的脚本
       notify_fault/etc/keepalived/notify_fault.sh  #当前服务器出现问题时,觖发执行的脚本
       notify_stop/etc/keepalived/down.sh  #当前服务器为down时,觖发执行的脚本
}



        编写判断mysql服务是否正常的脚本

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
vi keepalived_check_mysql.sh   #增加如下内容
#!/bin/bash
MYSQL=/app/mysql/bin/mysql     #指定mysql命令
MYSQL_HOST=localhost         #指定主机IP
MYSQL_USER=root        #指定Mysql登录用户
MYSQL_PASSWORD=mysql     #指定Mysql登录密码
CHECK_COUNTS=3        #控制循环次数变量
  
#mysql is working MYSQL_OK is 0 , mysql isnot working MYSQL_OK is 1
MYSQL_OK=0   #标识mysql状态变量
  
function check_Mysql_Runing (){
  
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD}-e "show grants;" >/dev/null 2>&1
#在操作系统层面,调用mysql命令
if [ $? = 0 ] ;then
        MYSQL_OK=0        #如果上面操作成功,证明Mysql正常
  
else
        MYSQL_OK=1         #如果上面操作不成功,证明Mysql不正常
  
fi
return $MYSQL_OK          #返回Mysql状态
  
}
  
while [ $CHECK_COUNTS -ne 0 ]      #循环控制
  
do
        let"CHECK_COUNTS -= 1"     #CHECK_COUNTS变量做自减1
  
       check_Mysql_Runing       #调用上面的函数
  
        if [ $MYSQL_OK= 0 ] ; then       #MYSQL_OK=0,mysql工作正常
         
             echo "mysql is runing!"
  
             exit 0
        fi
  
        if [ $MYSQL_OK-eq 1 ] && [ $CHECK_COUNTS -eq 0 ]  
#MYSQL_OK=1和CHECK_COUNTS=0,mysql没有正常运行
        then
  
               echo "mysql is not runing!"
   
               exit 1
        fi
  
        sleep 1   #休眠1秒
done



        编写当前服务器为主时的脚本

1
2
3
4
vi /etc/keepalived/master.sh   #增加如下内容
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change master status!!! " >> /etc/keepalived/change.log
#输出当前时间到日志中



        编写当前服务器为备时的脚本

1
2
3
4
vim/etc/keepalived/slave.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change slave status!!!" >> /etc/keepalived/change.log
#输出当前时间到日志中



         编写当前服务器不正常时的脚本

1
2
3
4
5
6
7
8
vim/etc/keepalived/notify_fault.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change notify_fault status!!!" >>/etc/keepalived/change.log
#输出当前时间到日志中
sleep 3   #休眠3秒
echo "#`date +"%Y-%m-%d%H:%M"` try startup mysql!!!" >> /etc/keepalived/change.log
#输出当前时间到日志中     
service mysql start     #启动Mysql服务器



         编写当前服务器wodn时的脚本

1
2
3
4
vim/etc/keepalived/down.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` keepalived is down!!!" >> /etc/keepalived/change.log
#输出当前时间到日志中



         为所有脚本授予可执行权限

1
2
3
4
5
chmod +x keepalived_check_mysql.sh
chmod +x /etc/keepalived/master.sh
chmod +x /etc/keepalived/slave.sh
chmod +x /etc/keepalived/notify_fault.sh
chmod +x /etc/keepalived/down.sh



         通过vip登录Mysql服务器

1
2
3
4
5
(1) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE 'server_id';  #查看当前是哪个mysql主机,当前mysql主库
(2) 把mysql主库停止
(3) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE 'server_id';  #查看当前是哪个mysql主机,当前是mysql备主



    可以看出主库停了,vip会自动漂移到备主上。
    到此为止,咱们的keepalived功能就配置结束了!
    只要朋友们仔细点按着我写的文章一步一步操作,相信你也可以成功的,加油吧!




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84522-1-1.html 上篇帖子: 探索MySQL高可用架构之MHA(5) 下篇帖子: MySQl Study学习之--MySQl二进制日志管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表