keepalive配置mysql自动故障转移

 

 

本文先配置了一个双master环境,互为主从,然后通过Keepalive配置了一个虚拟IP,客户端通过虚拟IP连接master1,当master1宕机,自动切换到master2。一次只能连接其中一个master进行读写,所以是active-passive模式。

一 Mysql主主复制搭建

 

1.1 实验环境

 

两台机器事先都已经装好了mysql单实例。 


二者的端口号需要保持一致,否则在最后用vip连接的时候,不能使用相同端口号连接。 

 

1.2 实验步骤

 

1.2.1 修改配置文件

修改master1:

在[mysqld]下面添加:

server-id =  1

relay-log=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin

relay-log-index=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin.index

auto-increment-offset = 1    

auto-increment-increment = 2 

log-slave-updates=true

 

修改master2:

在[mysqld]下面添加:

server-id =  3

relay-log =/data/server/mysql/binlog/single-relay-bin

relay-log-index=/data/server/mysql/binlog/single-relay-bin.index

auto-increment-offset = 2   

auto-increment-increment = 2 

log-slave-updates=true

 

添加auto-increment-offset那两项,是为了避免在MySQL INSERT时主键冲突。

 

修改完后记得重启mysql

 

1.2.2 建复制用户

分别在两台mysql上执行

GRANT REPLICATION SLAVE ON *.* TO 'RepUser'@'%'identified by 'beijing';

1.2.3 指向master

两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可。否则,需要先备份主库,在备库进行恢复,从而保持数据一致,然后再指向master。

Master1:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      302|              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

Master2:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      120 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

#Master1指向Master2

 

CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.21',MASTER_PASSWORD='beijing',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;


#Master2指向Master1

 

 

CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.22',MASTER_PASSWORD='beijing', MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=302;

 

 

 

 

 

1.2.4 分别启动slave

start slave ;

确保show slave status

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

测试两边是否同步,略。

 

二:配置keepalived

 

1 keepalive安装

分别在master1master2上安装keepalive

 

yum install -y popt-devel openssl-devel gcc
cd /usr/local/src
wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
tar zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/
make
make install

 

2 分别在master1,master2上新建检查mysql脚本

#master1

vi /root/check_mysql.sh

内容如下

MYSQL=/usr/local/mysql/bin/mysql
 
MYSQL_HOST='192.168.1.101'
 
STANDBY_HOST='192.168.1.102'
 
PORT='3307'
 
MYSQL_USER=CheckUser
 
MYSQL_PASSWORD=123456
 
date=`date +%Y%m%d:`
 
LogName='/root/check_mysql.log'
 
echo $date > /root/check_mysql.log
 
str="SELECT MASTER_POS_WAIT('"
 
 
 
$MYSQL  -u $MYSQL_USER -p$MYSQL_PASSWORD -e "select 1" >/dev/null 2>&1
if [ $? == 0 ]
 
then
 
    echo $MYSQL_HOST "mysql login successfully." >> $LogName
    $MYSQL  -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show master status;" > /root/master_status.log
 
    cat /root/master_status.log  | grep -v 'File' > /root/master_status.log2
 
    exit 0
 
else
 
    echo $MYSQL_HOST "mysql login faild" >> $LogName
 
 
 
    #检查备选主库主从复制是否有延迟,无延迟情况下再将浮动ip切到从库
 
    v1=$(cat /root/master_status.log2 | awk -F " " '{print $1}') #取FILE
 
    v2=$(cat /root/master_status.log2 | awk -F " " '{print $2}') #取Position
 
    sql=$str$v1"',"$v2,120')'  #拼sql:SELECT MASTER_POS_WAIT(file, position,120);
 
    v3=$($MYSQL -h $STANDBY_HOST  -u $MYSQL_USER -p$MYSQL_PASSWORD -P $PORT -e "$sql")
 
    v4=$(echo "$v3" | grep -v 'MASTER')
 
    echo $sql'值为'$v4 >> $LogName
 
    if [ $v4 -ge 0 ]
 
    then
 
        echo '备选主库主从复制无延迟,开始进行主从切换...' >> $LogName
 
        #关闭备选主库的只读模式
 
        $MYSQL -h $STANDBY_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -P $PORT -e "set global read_only=off;" >> $LogName
 
        if [ $? == 0 ]
 
        then
 
            /etc/init.d/keepalived stop
 
            echo '主从切换成功' >> $LogName
 
        fi
 
    else
 
        echo '备选主库主从延迟,暂时无法进行主从切换,请注意.' >> $LogName #这里最好配置成一个邮件或其他方式告警,即使知晓该情况。
 
    fi
 
    exit 2
 
fi
 

chmod +x /root/check_mysql.sh

脚本逻辑:

检查能否连接mysql执行基本命令,若不能正常执行该命令,则先确保备选主库主从复制无延迟(SELECT MASTER_POS_WAIT),然后进行主从切换:

① 关闭备选主库的只读模式

② 漂移浮动ip到备选主库上

可以通过/root/check_mysql.log查看脚本执行情况。

 

#master2

MYSQL=/usr/local/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=system@123


$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
#$mysqlclient --host=$host --port=$port --user=$user --password=$password  -e "show databases;" > /dev/null 2>&1
if [ $? == 0 ]
then
    echo " $host mysql login successfully "
    exit 0
else
    #echo " $host mysql login faild"
    /etc/init.d/keepalived stop
    exit 2
fi

chmod +x /root/check_mysql.sh

--假如发现该脚本没有被调用,排查以下几点:

① 脚本是否被授予执行权限

② 是否指定了mysql命令所在全路径

③ 是否关闭了selinux

关闭命令:

setenforce 0

然后重启下keepalive

#永久关闭

修改/etc/selinux/config,将SELINUX=的值改成disabled,这样即使服务器重启后,值也不会失效了。

3 修改配置文件

vi /etc/keepalived/keepalived.conf

master1和master2配置文件内容相同。

内容:

 

#ConfigurationFile for keepalived
global_defs {
notification_email {                        ######定义接受邮件的邮箱
  wangjj@hrloo.com
        }
  notification_email_from jiankong@staff.tuge.com    ######定义发送邮件的邮箱
  smtp_server mail.tuge.com
  smtp_connect_timeout 10
}
vrrp_script check_mysql {                   ######定义监控mysql的脚本
     script "/root/check_mysql.sh"
     interval 2                             ######监控时间间隔
     weight 2                               ######负载参数
     }
vrrp_instance vrrptest {                 ######定义vrrptest实例
        state BACKUP              ######服务器状态
  interface eth0                      ######使用的接口
        virtual_router_id 51                ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
        priority 150                        ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
        advert_int 1                        ######服务器之间的存活检查时间
authentication {
        auth_type PASS                      ######认证类型
        auth_pass ufsoft       ######认证密码,一组lvs 服务器的认证密码必须一致
}
track_script {                              ######执行监控mysql进程的脚本
     check_mysql
     }
virtual_ipaddress {                         ######虚拟IP地址
         192.168.1.60
}
}

 

这里state不配置MASTER,且优先级一样,是期望在MASTER1宕机后再恢复时,不主动将MASTER状态抢过来,避免MySQL服务的波动。

由于不存在使用lvs进行负载均衡,不需要配置虚拟服务器virtual server,下同。 

 

vi /etc/sysconfig/iptables

 

#注意,在两台机器上都要修改。

添加:

-A INPUT -d 192.168.1.60/32 -j ACCEPT

-A INPUT -d 224.0.0.18 -j ACCEPT #添加VRRP通讯支持

注意:第一行中的192.168.1.60需要改成你自己的vip。

service iptables restart

或者执行:iptables -I INPUT 4 -p vrrp -j ACCEPT

CentOS7这样执行:

sudo firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface 网卡名称 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
sudo firewall-cmd --reload

#检查修改是否生效
sudo iptables -S | grep vrrp

 

5 启动keepalived

master1master2上分别启动:
service keepalived start

分别执行ip addr命令,可以在其中一台机器上看到虚拟IP.如:

[root@slave1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UP qlen 1000
    link/ether 08:00:27:04:05:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.60/32 scope global eth0
    inet6 fe80::a00:27ff:fe04:516/64 scope link tentativedadfailed 
       valid_lft forever preferred_lft forever

说明虚拟vip连在了master1这台机器上。

如果自动只连接到了master2,关闭master2keepalived,再启动,自动就连接到master1了。

现在都可以ping通虚拟ip了。

 

假如keepalive报错:one or more vip associated with vrid mismatch actual master advert...则可能是

在同一网段中部署了令一套keepalived环境,导致virtual_router_id值跟我们部署的集群系统中该值冲突了,均使用了默认的值:51

解决方法:

修改其中一套集群中主从节点中keepalived的virtual_router_id 即可,主从需要保持一致

 

6 测试

停止master1服务器keepalived,检查VIP是否切换到master2服务器(用ip addr命令验证即可);
 

三 测试高可用环境是否配置成功

 

3.1 建允许远程访问的用户

在master1,master2创建允许远程访问的用户:

grant select,update,delete,insert on *.* to 'dandan' identified by 'dandan';

 

3.2 访问虚拟IP

用一台同网段的机器访问通过vip访问数据库:
 

mysql -u dandan-pdandan -h 192.168.1.60 --port 3307

停止master1服务器的mysqlVIP切换到了master2服务器。

master2上查看:

 

mysql> showprocesslist;
+----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id | User        | Host               | db   | Command | Time | State                                                                      | Info             |
+----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
|  3 | root        | localhost          | dba | Query   |    0 | init                                                                       | show processlist |
| 14 | systemuser |                    | NULL |Connect |  247 | Reconnecting after afailed master event read                               | NULL             |
| 15 | systemuser |                    | NULL |Connect |  207 | Slave has read all relaylog; waiting for the slave I/O thread to update it | NULL             |
| 90 |dandan      | 192.168.1.60:39995 |dba  | Sleep   |    8|                                                                            | NULL             |
+----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+


看到了dandan的连接信息。

 

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值