配置keepalived实现mysql双主高可用

主要思路:两台mysql服务器,其中一台mysql服务挂了后,能快速切换另一台,实现VIP漂移。

首先,实现两台服务器的mysql同步,即mysql主主互备模式:

(注:为防止数据库产生新数据,先关闭tomcat和项目的服务;若mysql服务器开启的防火墙,建议关闭。)


这里以两台mysql服务器为例:

服务器A:192.168.12.37

服务器B:192.168.12.67

VIP:192.168.12.200

数据库名称  mydatabase  


操作步骤:

①修改两台服务器的mysql配置文件

vi /etc/my.cnf

在[mysqld]下添加以下内容:

server-id = 1       ##节点标识

log-bin=mysql-bin     ##日志文件命名格式

relay-log = mysql-relay-bin    ##中继日志命名格式

replicate-wild-ignore-table=mysql.%  ##同步过滤mysql

replicate-wild-ignore-table=test.%    

replicate-wild-ignore-table=information_schema.%

replicate-wild-do-table=mydatabase.%   ##同步mydatabase数据库

②手动同步两台mysql服务器的数据库

1)登录DB1:

mysql -uroot -p123456

show databases;

FLUSH TABLES WITH READ LOCK;

2)打开Navicat Premium连接DB1、DB2:

点击数据库的备份—新建备份—开始—备份完成后点击关闭

3)删除DB2的数据库,导入DB1的备份数据

4)重启两台服务器的mysql服务

③配置两台服务器互备

1)登录DB1,创建用户名repl,密码123456,并授权给DB2的IP地址

grant replication slave on *.* to 'repl'@'192.168.12.67' identified by '123456';

2)查看并记录DB1的file和pos值

show master status;

 3)登录DB2,配置

change master to 

master_host='192.168.12.37',        ##DB1的IP

master_user='repl',

master_password='123456',

master_log_file='mysql-bin.000043',    ##DB1的File

master_log_pos=154;                 ##DB1的Position

 4)启动复制服务,查看复制状态

start slave;

show slave statusG;

  5)重复步骤1-4,在DB1上配置DB2为从服务器

注:Slave_IO_Running、Slave_SQL_Running这两项的状态需要是Yes,如果有no请检查上面配置的内容是否有误。

测试:在DB1上创建一个表,看DB2上是否同步过来。


 
然后,开始配置keepalived

 ①安装keepalived

yum install keepalived -y

②修改服务器A和B中的keepalived的配置文件

vi /etc/keepalived/keepalived.conf   

注:建议先备份这个配置文件:mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived-bak.conf

在keepalived.conf中写入如下内容:

 1 global_defs {
 2       notification_email {
 3         acassen@firewall.loc
 4         failover@firewall.loc
 5         sysadmin@firewall.loc
 6       }
 7       notification_email_from Alexandre.Cassen@firewall.loc
 8       smtp_server 127.0.0.1
 9       smtp_connect_timeout 30
10       router_id MySQLHA_DEVEL1
11 }
12 
13     vrrp_script check_mysqld {
14         script "/etc/keepalived/mysqlcheck/check_slave.pl 127.0.0.1" #检测mysql复制状态的脚本,下面会讲check_slave.pl中如何配置
15        interval  2  
16        weight  21
17     }
18 vrrp_instance HA_1 {
19         state BACKUP  #在DB1和DB2上均配置为BACKUP
20         interface  eth0
21         virtual_router_id 80
22         priority  90
23         advert_int 2
24         #nopreempt #不抢占模式,只在优先级高的机器上设置即可,优先级低的机器上不设置 ,我这里注释掉的原因下面会解释
25         authentication  {
26                 auth_type PASS
27                 auth_pass qweasdzxc
28         }
29         track_script {
30        check_mysqld
31         }
32         virtual_ipaddress {
33           192.168.12.200/24 dev eth0    #mysql的对外服务IP,即VIP
34         }
35   }

③创建Mysql复制状态的检测脚本check_slave.pl

mkdir /etc/keepalived/mysqlcheck                #创建脚本存放的文件夹
vi /etc/keepalived/mysqlcheck/check_slave.pl    #创建脚本
脚本内容: #
!/usr/bin/perl -w use DBI; use DBD::mysql; # CONFIG VARIABLES $SBM = 120; $db = "mydatabase"; ##检测数据库名 $host = $ARGV[0]; $port = 3306; $user = "root"; ##用户名 $pw = "123456"; ##密码 # SQL query $query = "show slave status"; $dbh = DBI->connect("DBI:mysql:$db:$host:$port", $user, $pw, { RaiseError => 0, PrintError => 0 }); if (!defined($dbh)) { exit 1; } $sqlQuery = $dbh->prepare($query); $sqlQuery->execute; $Slave_IO_Running = ""; $Slave_SQL_Running = ""; $Seconds_Behind_Master = ""; while (my $ref = $sqlQuery->fetchrow_hashref()) { $Slave_IO_Running = $ref->{'Slave_IO_Running'}; $Slave_SQL_Running = $ref->{'Slave_SQL_Running'}; $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'}; } $sqlQuery->finish; $dbh->disconnect(); if ( $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" ) { exit 1; } else { if ( $Seconds_Behind_Master > $SBM ) { exit 1; } else { exit 0; } }

④启动keepalived服务

service keepalived start

测试:

确保复制状态正常(Slave_IO_Running、Slave_SQL_Running为YES)的前提下,

在设备上以vip:192.168.12.200登录,查看当前使用的服务器ip,可以使用ip addr

上图中显示,VIP当前在服务器B上,接着关闭DB2的复制服务

stop slave;

重新登录VIP,查看

 

 VIP漂移到了服务器A上


解释:

这里解释下上面keepalived配置文件中为什么注释掉【不抢占模式】,且两台服务器使用相同的配置文件(即相同优先级)。

首先我配置两台服务器为BACKUP,不抢占模式需要两台服务器优先级不同。

我尝试配置一个优先级100,不抢占,另一个优先级90,

发现这样的现象:A挂了,VIP漂移至B;然后A恢复,B挂了,VIP就不漂移。

这不是我想要的结果。

我希望实现:A恢复,B挂了,VIP能回切到A。

所以直接让两台服务器使用相同的配置文件。


FAQ:

1、Slave_IO_Running、Slave_SQL_Running为no

还是检查上面的几个配置文件,主要看用户、ip、file和pos值;若不一致,先stop slave,然后重新配置,再start slave。

2、无法登陆VIP

检查是否能ping通vip,是否开启keepalived服务(service keepalived status),配置文件中vip是否正确

3、配置开机自启

先配置mysql开机自启,再配置keepalived

chkconfig --list

chkconfig --add keepalived

chkconfig keepalived on


啦啦啦,如果你从本文档中获取到灵感,欢迎点赞,欢迎评论,么么哒~ 

原文地址:https://www.cnblogs.com/Ternura-1023/p/11698730.html