zoukankan      html  css  js  c++  java
  • 配置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


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

  • 相关阅读:
    网页中加入Flash的代码
    AJAX示例
    图片过滤效果
    ASP.NET性能优化
    什么是AJAX
    动态获取enum的值并且添到List中
    VSTO为Excel快捷菜单添加项
    OpenXML for office SDK 2.5 Download url.
    WebClient
    C#监控本地目录文件变化
  • 原文地址:https://www.cnblogs.com/Ternura-1023/p/11698730.html
Copyright © 2011-2022 走看看