利用keepalived构建高可用MySQL-HA

来源:互联网 发布:种子结构网络教研总结 编辑:程序博客网 时间:2024/06/18 04:20

一、mysql 主从复制

参考http://blog.csdn.net/u013378306/article/details/56837766

二、keepalived安装及配置

注意的地方:

两台服务器设置的vip必须一样

virtual_router_id 必须一样

原理:

主服务使用虚拟vip 优先,当主服务关掉后,从服务启用虚拟vip


mysql 服务地址写为vip地址




1、192.168.1.201服务器上keepalived安装及配置

安装keepalived

#tar zxvf keepalived-1.1.20.tar.gz 

#cd keepalived-1.1.20  

#./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686  

(注意这里2.6.18-164.el5-i686版本自己到服务器的/usr/src/kernels目录下去看,写当前服务器中存在的版本)

#make && make install 

[root@master2 ~]#/usr/local/keepalived/sbin/keepalived -D

[root@master2 ~]# ps -aux|grep keepalived

Warning: bad syntax, perhaps a bogus '-'?See /usr/share/doc/procps-3.2.7/FAQ

root     4101  0.3  0.1 35828   632 ?        Ss  15:41   0:00/usr/local/keepalived/sbin/keepalived -D

root     4102  0.7  0.4 39988  1620 ?        S   15:41   0:00/usr/local/keepalived/sbin/keepalived -D

root     4103  0.5  0.3 39988  1092 ?        S   15:41   0:00/usr/local/keepalived/sbin/keepalived -D

root     4106  0.0  0.2 61136   716 pts/0    R+  15:41   0:00 grep keepalived

配置keepalived

ln -sv /usr/src/kernels/2.6.18-194.el5-x86_64/ /usr/src/Linux

我们自己在新建一个配置文件,默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件

#mkdir /etc/keepalived  

#vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs {  

     notification_email { 

     luwenju@live.cn 

     }  

     notification_email_from luwenju@live.cn 

     smtp_server 127.0.0.1 

     smtp_connect_timeout 30 

     router_id MySQL-ha 

     }  

 

vrrp_instance VI_1 {  

     state BACKUP   #两台配置此处均是BACKUP  

     interface eth0  #网卡,可使用ifconfig查看

     virtual_router_id 51 

     priority 100   #优先级,另一台改为90  

     advert_int 1 

     nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置  

     authentication { 

     auth_type PASS 

     auth_pass 1111 

     }  

     virtual_ipaddress { 

     192.168.1.200 

     }  

     }  

 

virtual_server 192.168.1.200 3306 { 

     delay_loop 2   #每个2秒检查一次real_server状态  

     lb_algo wrr   #LVS算法  

     lb_kind DR    #LVS模式  

     persistence_timeout 60   #会话保持时间  

     protocol TCP 

     real_server 192.168.1.201 3306 { 

     weight 3 

     notify_down /usr/local/MySQL/bin/MySQL.sh  #检测到服务down后执行的脚本  

     TCP_CHECK { 

     connect_timeout 10    #连接超时时间  

     nb_get_retry 3       #重连次数  

     delay_before_retry 3   #重连间隔时间  

     connect_port 3306   #健康检查端口  

     }  

     } 

编写检测服务down后所要执行的脚本

#vi /usr/local/MySQL/bin/MySQL.sh  

#!/bin/sh  

pkill keepalived  

#chmod +x /usr/local/MySQL/bin/MySQL.sh 

注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkillkeepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP

启动keepalived

#/usr/local/keepalived/sbin/keepalived –D 

#ps -aux | grep keepalived 

测试

找一台局域网PC,然后去ping  MySQL的VIP,这时候MySQL的VIP是可以ping的通的

停止MySQL服务,看keepalived健康检查程序是否会触发我们编写的脚本

2、192.168.1.202上keepalived安装及配置

安装keepalived

#tar zxvf keepalived-1.1.20.tar.gz 

#cd keepalived-1.1.20  

#./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686  

#make && make install 

配置keepalived

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

#mkdir /etc/keepalived  

#vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs {  

     notification_email { 

     luwenju@live.cn 

     }  

     notification_email_from luwenju@live.cn 

     smtp_server 127.0.0.1 

     smtp_connect_timeout 30 

     router_id MySQL-ha 

     }  

 

vrrp_instance VI_1 {  

     state BACKUP 

     interface eth0 

     virtual_router_id 51 

     priority 90 

     advert_int 1 

     authentication { 

     auth_type PASS 

     auth_pass 1111 

     }  

     virtual_ipaddress { 

     192.168.1.200 

     }  

     }  

 

virtual_server 192.168.1.200 3306 { 

     delay_loop 2 

     lb_algo wrr 

     lb_kind DR 

     persistence_timeout 60 

     protocol TCP 

     real_server 192.168.1.202 3306 { 

     weight 3 

     notify_down /usr/local/MySQL/bin/MySQL.sh 

     TCP_CHECK { 

     connect_timeout 10 

     nb_get_retry 3 

     delay_before_retry 3 

     connect_port 3306 

     }  

     } 

编写检测服务down后所要执行的脚本

#vi /usr/local/MySQL/bin/MySQL.sh  

#!/bin/sh  

pkill keepalived  

#注意此处强制停掉可能会导致vip强占,会导致多服务起都会使用vip,可以改为service  keepalived stop

#chmod +x /usr/local/MySQL/bin/MySQL.sh 

 

启动keepalived  

#/usr/local/keepalived/sbin/keepalived –D 

#ps -aux | grep keepalived 

测试

停止MySQL服务,看keepalived健康检查程序是否会触发我们编写的脚本

三、测试

MySQL远程登录测试

我们找一台安装有MySQL客户端的windows,然后登录VIP,看是否能登录,在登录之两台MySQL服务器都要授权允许从远程登录

MySQL> grant all privileges on *.* to 'root'@'%' identified by '123456'; 

Query OK, 0 rows affected (0.00 sec) 

 

MySQL> flush privileges;  

Query OK, 0 rows affected (0.00 sec) 

使用客户端登录VIP测试

C:\MySQL\bin>MySQL.exe -uroot -p123456 -h192.168.1.200 -P3306 

Welcome to the MySQL monitor.  Commands end with ; or \g. 

Your MySQL connection id is 224 

Server version: 5.0.89-log Source distribution 

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

 

MySQL> 

● keepalived故障转移测试

※在windows客户端一直去ping  VIP,然后关闭192.168.1.201上的keepalived,正常情况下VIP就会切换到192.168.1.202上面去

※开启192.168.1.201上的keepalived,关闭192.168.1.202上的keepalived,看是否能自动切换,正常情况下VIP又会属于192.168.1.201

注:keepalived切换速度还是非常块的,整个切换过程只需1-3秒

● MySQL故障转移测试

※在192.168.1.201上关闭MySQL服务,看VIP是否会切换到192.168.1.202上

※开启192.168.1.201上的MySQL和keepalived,然后关闭192.168.1.202上的MySQL,看VIP是否会切换到192.168.1.201上

下面是用windows客户端连接的MySQL的VIP,在切换时我执行了一个MySQL查询命令,从执行show databases到显示出结果时间为3-5秒(大家可以看到上面有个错误提示,不过不用担心,因为我们的keepalived切换大概为3秒左右,这3秒左右VIP是谁都不属于的)

MySQL> show databases;  

ERROR 2006 (HY000): MySQL server has gone away 

No connection. Trying to reconnect... 

Connection id:    592 

Current database: *** NONE *** 

 

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

| Database           | 

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

| information_schema |  

| MySQL              | 

| test               | 

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

3 rows in set (9.01 sec) 

后话:世间万事万物,都不具备绝对的完美,就像上面的MySQL-HA一样,keepalived只能做到对3306的健康检查,但是做不到比如像MySQL复制中的slave-SQL、slave-IO进程的检查。所以要想做到一些细致的健康检查,还得需要借助额外的监控工具,比如nagios,然后用nagios实现短信、邮件报警,从而能够有效地解决问题。

 

mysql> GRANT REPLICATION SLAVE ON *.*

   -> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

如果你没有备份主服务器,这里是一个创建备份的快速程序。所有步骤都应该在主服务器主机上执行。

 

1.   发出该语句:

 

    mysql> FLUSH TABLES WITH READ LOCK;

2.   仍然加锁时,执行该命令(或它的变体):

 

    shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql

3.   发出该语句并且确保记录了以后用到的输出:

 

    mysql>SHOW MASTER STATUS;

4.   释放锁:

 

    mysql> UNLOCK TABLES;

一个可选择的方法是,转储主服务器的SQL来代替前面步骤中的二进制复制。要这样做,你可以在主服务器上使用mysqldump --master-data,以后装载SQL转储到到你的从服务器。



另一篇

一、概述

Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。

二、配置实现mysql+keepalived主从切换

网络结构:

VIP :192.168.1.172

MYSQL1:192.168.1.100

MYSQL2:192.168.1.104

其中MYSQL1为主服务器

MYSQL2为从服务器

1、mysql主主同步

要实现MySQL+keepalived主从切换,首先要实现的就是两台mysql服务器的主主同步。关于主主同步,可以参考之前的文章mysql数据库远程同步及备份 

2、安装keepalived

准备好源码包keepalived-1.2.7.tar.gz,然后将其放置在home/software目录下面:

#tar zxvf keepalived-1.2.7.tar.gz

#cd keepalived-1.2.7

#./configure

出错:

sudo apt-get install openssl

# apt-get install libpopt-dev

 sudo apt-get install libssl-dev

    sudo apt-get install libssl0.9.8

#make & make install

 

3、keepalived主备配置文件

下面将详细讲述在MYSQL主服务器上对keepalived的配置。

由于keepalived启动的时候,默认到/etc目录下面去读取配置文件,所以要先在/etc目录下创建一目录keepalived

#mkdir –p /etc/keepalived

#cd /etc/keepalived

#vin keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

         380934769@qq.com

   }

   notification_email_from 380934769@qq.com

   smtp_connect_timeout 3

   smtp_server 127.0.0.1

   router_id MySQL-ha

}

 

vrrp_script check_run {   #声明vrrp_script 的函数check_run

   script "/root/keepalived_check_mysql.sh"

   interval 5

}

 

vrrp_sync_group VG1 {

    group {

          VI_1

    }

}

vrrp_instance VI_1 {

    state MASTER   #指定主服务器节点为主节点,备用节点上设置为BACKUP即可

    interface eth0   #指定虚拟IP的网络接口

    virtual_router_id 88 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组

    priority 100  #主节点的优先级(1-254之间),备用节点必须比主节点优先级低。

    advert_int 1  #组播信息发送间隔,两个节点设置必须一样

    nopreempt  

    authentication {   #设置验证信息,两个节点必须一致

        auth_type PASS

        auth_pass skyai1.cublog.cn

    }

    track_script {    #调用函数代码块

        check_run

    }

    virtual_ipaddress {  #虚拟IP

        192.168.1.172

    }

}

 

MYSQL从服务器的keepalived配置如下:

! Configuration File for keepalived

 

global_defs {

   notification_email {

         380934769@qq.com

   }

   notification_email_from 380934769@qq.com

   smtp_connect_timeout 3

   smtp_server 127.0.0.1

   router_id MySQL-ha

}

 

vrrp_script check_run {

   script "/root/keepalived_check_mysql.sh"

   interval 5

}

 

vrrp_sync_group VG1 {

    group {

          VI_1

    }

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 88

    priority 99

    advert_int 1

    nopreempt

    authentication {

        auth_type PASS

        auth_pass skyai1.cublog.cn

    }

    track_script {

        check_run

    }

    virtual_ipaddress {

        192.168.1.172

    }

}

 

4、mysql状态检测脚本

在目录root下创建脚本keepalived_check_mysql.sh:

#vim /root/keepalived_check_mysql.sh

#!/bin/bash

MYSQL=/usr/local/mysql/bin/mysql

MYSQL_HOST=localhost

MYSQL_USER=root

MYSQL_PASSWORD=123456

CHECK_TIME=3

 

#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

 

MYSQL_OK=1

 

function check_mysql_helth (){

    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1

    if [ $? = 0 ] ;then

    MYSQL_OK=1

    else

    MYSQL_OK=0

    fi

    return $MYSQL_OK

}

while [ $CHECK_TIME -ne 0 ]

do

    let "CHECK_TIME -= 1"

    check_mysql_helth

if [ $MYSQL_OK = 1 ] ; then

    CHECK_TIME=0

    exit 0

fi

if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]

then

    pkill keepalived

    exit 1

fi

sleep 1

done

 

5、启动keepalived

#keepalived start

 

6、查看vrrp通读记录

#tcpdump vrrp

 

此时显示是主服务器在提供服务。

关闭主服务器上的mysql

#mysql stop

 

然后由keepalived配置文件可以知道,mysql关闭的话,将会执行keepalived_check_mysql.sh这一脚本。这个脚本在执行的时候,会判断mysql的状态,如果mysql关闭了,将会关闭主服务器上的keepalived。主服务器上的keepalived一旦关闭,那么从服务器马上变为主服务器,为用户提供服务,如下图所示:

由上图可以看到,现在主从服务器已经切换了。

 

7、查看虚拟IP

由于前面所述,主服务器的mysql已经关闭,从服务器已经切换为主服务器,所以在从服务器上就可以查看到虚拟IP。

#ip a

由图中可以看到虚拟IP。

 

此时,一旦主服务器上的mysql重启,然后再启动keepalived之后,主服务器又会切换成向用户提供服务的服务器。

 

由图可知,已经切换成功。

在主服务器上查看虚拟IP

#ip a

 

可以看到虚拟IP。OK,mysql+keepalived自动切换完成。