利用keepalived构建高可用的MySQL

一、概述
MySQL-HA目前有很多实现方案,今天就用MySQL双master+keepalived来实现MySQL-HA。
在MySQL-HA环境中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性。
然后用keepalived实现虚拟IP,通过keepalived来实现MySQL故障时自动切换。
实验环境如下:
Ubuntu12.04 MySQL5.5 keepalived-1.2.2
mysql-server1:192.168.1.102
mysql-server2:192.168.1.103
mysql-vip:     192.168.1.106

二、配置MySQL双主结构
1.在两台服务器上同时建立复制账号
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
    -> TO shop@'192.168.1.%' IDENTIFIED BY '123qwe';
2.修改配置文件
192.168.1.102 MySQL配置文件如下:
server-id         = 102
log_bin           = /var/log/mysql/mysql-bin
relay_log         = /var/log/mysql/mysql-relay-bin
log_slave_updates = 1
192.168.1.103 MySQL配置文件如下:
server-id         = 103
log_bin           = /var/log/mysql/mysql-bin
relay_log         = /var/log/mysql/mysql-relay-bin
log_slave_updates = 1
3.在两台机器上分别启动复制
192.163.1.102配置如下:


192.163.1.103配置如下:


现在任何一个MySQL发生数据变化,另外一台数据库也会跟着进行数据更新。

三、配置keepalived
1.两台服务器都安装keepalived

sudo apt-get install keepalived
2.配置/etc/keepalived/keepalived.conf

192.168.1.102配置如下:/etc/keepalived/keepalived.conf

#全局配置
global_defs {
    #表示keepalived在发生诸如切换操作时发送Email给哪些地址,邮件地址可以多个,每行一个
    notification_email {  
        admin@example.com  
    }  
    #表示发送通知邮件时邮件源地址是谁
    notification_email_from admin@example.com
    #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
    smtp_server 127.0.0.1
    #连接smtp连接超时时间    
    smtp_connect_timeout 30
    #机器标识
    router_id MySQL-HA  
} 
vrrp_instance mysql-ha {  
    state BACKUP           #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
    interface eth0         #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    virtual_router_id 81   #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
    priority 100           #设置本节点的优先级,优先级高的为master 
    advert_int 1           #检查间隔,默认为1秒
    authentication {       #这里设置认证
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {    #这里设置的就是VIP,也就是虚拟IP地址
        192.168.1.106  
    }  
}  
virtual_server 192.168.1.106 3306 {  
    delay_loop 2  #每个2秒检查一次real_server状态  
    lb_algo wrr      
    lb_kind DR       
    persistence_timeout 60   #会话保持时间  
    protocol TCP  
    real_server 192.168.1.102 3306 {  
        weight 3  
        notify_down /data/mysql.sh #检测到服务down后执行的脚本  
        TCP_CHECK {  
            connect_timeout 10     #连接超时时间  
            nb_get_retry 3         #重连次数  
            delay_before_retry 3   #重连间隔时间  
            connect_port 3306      #健康检查端口  
        }  
    }
}    

192.168.1.103配置如下: /etc/keepalived/keepalived.conf

这台配置和上面基本一样,但有两个地方不同:优先级为90、real_server为本机IP

#全局配置
global_defs {
    #表示keepalived在发生诸如切换操作时发送Email给哪些地址,邮件地址可以多个,每行一个
    notification_email {  
        admin@example.com  
    }  
    #表示发送通知邮件时邮件源地址是谁
    notification_email_from admin@example.com
    #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
    smtp_server 127.0.0.1
    #连接smtp连接超时时间    
    smtp_connect_timeout 30
    #机器标识
    router_id MySQL-HA  
} 
vrrp_instance mysql-ha {  
    state BACKUP           #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
    interface eth0         #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    virtual_router_id 81   #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
    priority 90            #设置本节点的优先级,优先级高的为master 
    advert_int 1           #检查间隔,默认为1秒
    authentication {       #这里设置认证
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {    #这里设置的就是VIP,也就是虚拟IP地址
        192.168.1.106  
    }  
}  
virtual_server 192.168.1.106 3306 {  
    delay_loop 2  #每个2秒检查一次real_server状态  
    lb_algo wrr      
    lb_kind DR       
    persistence_timeout 60   #会话保持时间  
    protocol TCP  
    real_server 192.168.1.103 3306 {  
        weight 3  
        notify_down /data/mysql.sh #检测到服务down后执行的脚本  
        TCP_CHECK {  
            connect_timeout 10     #连接超时时间  
            nb_get_retry 3         #重连次数  
            delay_before_retry 3   #重连间隔时间  
            connect_port 3306      #健康检查端口  
        }  
    }
}    
3.分别在两台服务器的/data/目录下编写检测服务down后所要执行的脚本mysql.sh

#!/usr/bin/env bash
pkill keepalived
/etc/init.d/networking restart
$sudo chmod 777 mysql.sh
此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项
来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;
通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。
另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的
keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP。

4.分别在两台服务器上建立测试账号

GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

5.在两台服务器上分别启动keepalived

sudo keepalived -D 或者 sudo keepalived start

6.进行测试
客户端192.168.1.100用vip(192.168.1.106)连接MySQL
1.两台服务都正常工作的情况下,在两台服务器上分别用netstat -nat查看,
可以看出目前连接的是192.168.1.102,因为它的优先级高。此时102是活跃 的服务器,103是备用的服务器。
2.当102的mysql服务down掉的时候,keepalived可以完成故障切换,
这时候所有的新的mysql连接就会连接192.168.1.103。
同理,当103的MySQL服务down掉之后,所有的新的MySQL连接就会连接192.168.1.102。
3.当102修复之后,由于权重比较高,102还将会成为活跃的服务器,103将作为备用服务器。
当然可以在102(优先级较高的服务器)上设置nopreempt参数,将此服务器设置为不抢占,
这样就保证了在102服务修复之后,103继续担任活跃服务器的角色。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值