• keepalive配置mysql自动故障转移


    本文先配置了一个双master环境,互为主从,然后通过Keepalive配置了一个虚拟IP,客户端通过虚拟IP连接master1,当master1宕机,自动切换到master2。一次只能连接其中一个master进行读写,所以是active-passive模式。

    一 Mysql主主复制搭建

    1.1 实验环境

    两台机器事先都已经装好了mysql单实例。 


    二者的端口号需要保持一致,否则在最后用vip连接的时候,不能使用相同端口号连接。 

    1.2 实验步骤

    1.2.1 修改配置文件

    修改master1:

    在[mysqld]下面添加:

    server-id =  1

    relay-log=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin

    relay-log-index=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin.index

    auto-increment-offset = 1    

    auto-increment-increment = 2 

    log-slave-updates=true

    修改master2:

    在[mysqld]下面添加:

    server-id =  3

    relay-log =/data/server/mysql/binlog/single-relay-bin

    relay-log-index=/data/server/mysql/binlog/single-relay-bin.index

    auto-increment-offset = 2   

    auto-increment-increment = 2 

    log-slave-updates=true

    添加auto-increment-offset那两项,是为了避免在MySQL INSERT时主键冲突。

    修改完后记得重启mysql

    1.2.2 建复制用户

    分别在两台mysql上执行

    GRANT REPLICATION SLAVE ON *.* TO 'RepUser'@'%'identified by 'beijing';

    1.2.3 指向master

    两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可。否则,需要先备份主库,在备库进行恢复,从而保持数据一致,然后再指向master。

    Master1:

    mysql> show master status;

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

    | File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

    | mysql-bin.000001 |      302|              |                  |                   |

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

    1 row in set (0.00 sec)

    Master2:

    mysql> show master status;

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

    | File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

    | mysql-bin.000001 |      120 |              |                  |                   |

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

    1 row in set (0.00 sec)

    #Master1指向Master2

     

    [sql] view plain copy
     
    1. CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.21',MASTER_PASSWORD='beijing',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;  


    #Master2指向Master1

     

    [sql] view plain copy
     
    1. CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.22',MASTER_PASSWORD='beijing', MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=302;  



    1.2.4 分别启动slave

    start slave ;

    确保show slave status

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    测试两边是否同步,略。

     

    二:配置keepalived

    1 keepalive安装

    分别在master1,master2上安装keepalive

     

    [plain] view plain copy
     
    1. yum install -y popt-devel  
    2. cd /usr/local/src  
    3. wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz  
    4. tar zxvf keepalived-1.2.2.tar.gz  
    5. cd keepalived-1.2.2  
    6. ./configure --prefix=/  
    7. make  
    8. make install  

    #假如在执行./configure --prefix=/时报错: OpenSSL is not properly installed on your system !!!Can notinclude OpenSSL headers files,则yum install openssl-devel -y

    2 分别在master1,master2上新建检查mysql脚本

    vi /root/check_mysql.sh

    内容如下

     

    [plain] view plain copy
     
    MYSQL=/usr/local/mysql/bin/mysql  
    MYSQL_HOST=localhost  
    MYSQL_USER=root  
    MYSQL_PASSWORD=cc.123  
      
      
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1  
    #$mysqlclient --host=$host --port=$port --user=$user --password=$password  -e "show databases;" > /dev/null 2>&1  
    if [ $? == 0 ]  
    then  
        echo " $host mysql login successfully "  
        exit 0  
    else  
        #echo " $host mysql login faild"  
        /etc/init.d/keepalived stop  
        exit 2  
    fi 
    

      

    chmod +x /root/check_mysql.sh

    3 修改配置文件

    vi /etc/keepalived/keepalived.conf

    master1和master2配置文件内容相同。

    内容:

     

    global_defs {
         router_id HA_MySQL
    }
    
    vrrp_script check_mysql {                   ######定义监控mysql的脚本  
         script "/root/check_mysql.sh"  
         interval 2                             ######监控时间间隔  
         weight 2                               ######负载参数  
         }  
    vrrp_instance VI_1 {
         state BACKUP
         interface eth0
         virtual_router_id 51
         priority 100
         advert_int 1
         nopreempt
         authentication {
             auth_type PASS
             auth_pass 1111
         }
         virtual_ipaddress {
                192.168.60.251
         }
    }
    
    track_script {                              ######执行监控mysql进程的脚本  
         check_mysql  
    }  
    
    virtual_server 192.168.60.251 3306 {
         delay_loop 2
         lb_algo wrr
         lb_kind DR
         persistence_timeout 60
         protocol TCP
         real_server 192.168.60.168 3306 {
             weight 3
             notify_down /root/shutdown.sh
             TCP_CHECK {
                 connect_timeout 10
                 nb_get_retry 3
                 delay_before_retry 3
                 connect_port 3306
             } 
         }
    }
    

      

    这里state不配置MASTER,且优先级一样,是期望在MASTER1宕机后再恢复时,不主动将MASTER状态抢过来,避免MySQL服务的波动。

    由于不存在使用lvs进行负载均衡,不需要配置虚拟服务器virtual server,下同。 

    vi /etc/sysconfig/iptables

    #注意,在两台机器上都要修改。

    添加:

    -A INPUT -d 192.168.1.60/32 -j ACCEPT

    -A INPUT -d 224.0.0.18 -j ACCEPT #添加VRRP通讯支持

    注意:第一行中的192.168.1.60需要改成你自己的vip。

    service iptables restart

    5 启动keepalived

    在master1、master2上分别启动:
    service keepalived start

    分别执行ip addr命令,可以在其中一台机器上看到虚拟IP.如:

    [root@slave1 keepalived]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UP qlen 1000
        link/ether 08:00:27:04:05:16 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
        inet 192.168.1.60/32 scope global eth0
        inet6 fe80::a00:27ff:fe04:516/64 scope link tentativedadfailed 
           valid_lft forever preferred_lft forever

    说明虚拟vip连在了master1这台机器上。

    如果自动只连接到了master2,关闭master2的keepalived,再启动,自动就连接到master1了。

    现在都可以ping通虚拟ip了。

     

     

    6 测试

    停止master1服务器keepalived,检查VIP是否切换到master2服务器(用ip addr命令验证即可);
     

    三 测试高可用环境是否配置成功

    3.1 建允许远程访问的用户

    在master1,master2创建允许远程访问的用户:

    grant select,update,delete,insert on *.* to 'dandan' identified by 'dandan';

     

    3.2 访问虚拟IP

    用一台同网段的机器访问通过vip访问数据库:

    mysql -u dandan-pdandan -h 192.168.1.60 --port 3307

    停止master1服务器的mysql,VIP切换到了master2服务器。

    在master2上查看:

     

    [plain] view plain copy
     
    1. mysql> showprocesslist;  
    2. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+  
    3. | Id | User        | Host               | db   | Command | Time | State                                                                      | Info             |  
    4. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+  
    5. |  3 | root        | localhost          | dba | Query   |    0 | init                                                                       | show processlist |  
    6. | 14 | systemuser |                    | NULL |Connect |  247 | Reconnecting after afailed master event read                               | NULL             |  
    7. | 15 | systemuser |                    | NULL |Connect |  207 | Slave has read all relaylog; waiting for the slave I/O thread to update it | NULL             |  
    8. | 90 |dandan      | 192.168.1.60:39995 |dba  | Sleep   |    8|                                                                            | NULL             |  
    9. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+  


    看到了dandan的连接信息。

  • 相关阅读:
    目前正在自学python,前几天做了一个比较简单的坦克大战游戏,分享出来,想搞一搞的朋友,可以参考。
    我今天给学习运维而英语不好的各位,提供一些计算机英语,感谢惨绿少年的原文和已经离开身边提供英标部分的小虾大佬,只是为了记录。
    前几天看见pthon自动跳一跳很火,自己也按捺不住寂寞,实现了一把。分享一下。图文详解,如果有问题留言,帮解决。
    day01
    java之jvm篇
    mysql
    leecode刷题——数组篇
    java基础
    python进程和线程
    python I/O编程
  • 原文地址:https://www.cnblogs.com/zping/p/7928805.html
Copyright © 2020-2023  润新知