主要思路:两台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
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
啦啦啦,如果你从本文档中获取到灵感,欢迎点赞,欢迎评论,么么哒~