Mysql高可用--双主热备+keepalived

来源:互联网 发布:大数据人才需求 编辑:程序博客网 时间:2024/05/19 13:08

from    http://blog.csdn.net/qq_21835703/article/details/65939298

Mysql高可用--双主热备+keepalived


1章 MySQL-HA介绍

关于MySQL-HA,目前有多种解决方案,比如heartbeatdrbdmmm、共享存储,但是它们各有优缺点。heartbeatdrbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题;对于mmm,生产环境中很少有人用,且mmm管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支;所以我们选用mysqlmaster+keepalived实现HA

 

实现原理

使用MySQLmaster+keepalived是一种非常好的HA方案,在MySQL-HA环境中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换。

 

 

2章 构建MySQL-HA

MySQL-HA环境拓扑如下

MySQL-VIP172.16.2.130 

MySQL-master1172.16.2.126 

MySQL-master2172.16.2.184 

2.1 MySQL master-master配置

1、修改MySQL配置文件

两台MySQL均如要开启binlog日志功能,开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项

两台MySQLserver-ID不能一样,默认情况下两台MySQLserverID都是1,需将其中一台修改为2即可

2、将172.16.2.126设为172.16.2.184的主服务器

172.16.2.126上新建授权用户

MySQL>GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';

Query OK, 0 rows affected (0.00 sec) 

 

MySQL> show master status; 

 


172.16.2.184上将172.16.2.126设为自己的主服务器

MySQL> change master to master_host='172.16.2.126',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106; 

Query OK, 0 rows affected (0.05 sec) 

 

MySQL> start slave; 

Query OK, 0 rows affected (0.00 sec) 

 


MySQL>show slave status\G 

 

 

 3、将172.16.2.184设为172.16.2.126的主服务器

172.16.2.184上新建授权用户

MySQL> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'backup'@'%' IDENTIFIED BY '123456'; 

Query OK, 0 rows affected (0.00 sec) 


MySQL> show master status; 

 

 

172.16.2.126上,将172.16.2.184设为自己的主服务器

MySQL> change master to master_host='172.16.2.184',master_user='backup',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=106;

Query OK, 0 rows affected (0.05 sec) 

 

MySQL> start slave; 

Query OK, 0 rows affected (0.00 sec) 

 

MySQL> show slave status\G 

 

 4MySQL同步测试

如上述均正确配置,现在任何一台MySQL上更新数据都会同步到另一台MySQLMySQL同步在此不再演示

 

 

2.2 keepalived安装及配置

2.2.1 keepalived安装

在两台机器安装:

方法一:yum安装<本地源>:yum install -y 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

 

2.2.2配置虚拟vip

在两台机器配置,外网访问mysqlvip对于VirtualBox桥接网卡创建的虚拟机不需要配置VIP,直接在keepalived中配置即可

ifconfig lo:1 172.16.2.130 netmask255.255.255.255 broadcast 192.168.223.100

 

查看

 

 

2.2.3 keepalived配置

172.16.2.126机器,新建一个配置文件,默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件

#mkdir /etc/keepalived 

#vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs { 

      notification_email{ 

      luwenju@live.cn 

      } 

      notification_email_fromluwenju@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 

      virtual_router_id 51 

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

      advert_int 1 

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

      authentication { 

      auth_type PASS 

      auth_pass 1111 

      } 

      virtual_ipaddress { 

      172.16.2.130 

      } 

      } 

 

virtual_server 172.16.2.130 3306{ 

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

      lb_algo wrr   #LVS算法 

      lb_kind DR    #LVS模式 

      persistence_timeout 60   #会话保持时间 

      protocol TCP 

      real_server 172.16.2.126 3306 { 

      weight 3 

      notify_down /var/lib/mysql/mysql.sh  #检测到服务down后执行的脚本 

      TCP_CHECK { 

      connect_timeout 10    #连接超时时间 

      nb_get_retry 3       #重连次数 

      delay_before_retry 3   #重连间隔时间 

      connect_port 3306   #健康检查端口 

      } 

      } 

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

 #vi /var/lib/mysql/mysql.sh 

 #!/bin/sh 

 pkill keepalived 

 #chmod +x /var/lib/mysql/mysql.sh

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

 

172.16.2.184keepalived配置

这台配置和上面基本一样,但有三个地方不同:优先级为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_fromluwenju@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 { 

      172.16.2.130 

      } 

      } 

 

virtual_server 172.16.2.130 3306{ 

      delay_loop 2 

      lb_algo wrr 

      lb_kind DR 

      persistence_timeout 60 

      protocol TCP 

      real_server 172.16.2.184 3306 { 

      weight 3 

     notify_down /var/lib/mysql/mysql.sh 

      TCP_CHECK { 

      connect_timeout 10 

      nb_get_retry 3 

      delay_before_retry 

      connect_port 3306 

      } 

} 

 

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

#vi /var/lib/mysql/mysql.sh 

#!/bin/sh 

pkill keepalived 

#chmod +x /var/lib/mysql/mysql.sh 

 

2.2.4启动keepalived

在两台机器启动keepalived

#service keepalived start

#ps -aux | grep keepalived

在两台机器设置keepalived开机启动

#chkconfig keepalived on

测试

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

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

2.3 MySQL-HA测试

MySQL远程登录测试

使用Navicat for MySQL登录测试,看是否能登录。在登录之前,两台MySQL服务器都要授权允许从远程登录

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

Query OK, 0 rows affected (0.00 sec) 

 

MySQL> flush privileges; 

Query OK, 0 rows affected (0.00 sec)

 

使用Navicat for MySQL登录VIP测试

 


   ● keepalived故障转移测试

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

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

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

● MySQL故障转移测试

172.16.2.126上关闭MySQL服务,看VIP是否会切换到172.16.2.184

开启172.16.2.126上的MySQLkeepalived,然后关闭172.16.2.184上的MySQL,看VIP是否会切换到172.16.2.126

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

   1.MySQL> show databases; 

   2.ERROR 2006 (HY000): MySQL server has gone away 

   3.No connection. Trying to reconnect... 

   4.Connection id:    592 

   5.Current database: *** NONE *** 

  6. 

   7.+--------------------+ 

   8.| Database           | 

   9.+--------------------+ 

  10.| information_schema | 

  11.| MySQL              | 

  12.| test               | 

  13.+--------------------+ 

  14.3 rows in set (9.01 sec)