通过keepalived实现高可用

192.168.184.128  主/heartbeat1

192.168.184.129  从/heartbeat2

192.168.184.131  漂移地址

 主备基础:需要在128和129服务器上,搭建mysql主从复制

  1. 环境基础配置

128、129操作关闭防火墙

# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# systemctl stop firewalld

128上操作

# hostnamectl set-hostname db1 修改主机名

# vim /etc/hosts 

192.168.184.128 db1

192.168.184.129 db2

129上操作

#hostnamectl set-hostname db2

# vim /etc/hosts 

192.168.184.128 db1

192.168.184.129 db2

(1)主从上都按照keepalived(两台均操作以下安装步骤)

A:MySQL Master    192.168.184.128
     B:MySQL Slave      192.168.184.129
       VIP               192.168.184.131

# wget  http://www.keepalived.org/software/keepalived-1.2.13.tar.gz

# yum -y install gcc gcc-c++ autoconf automake openssl openssl-devel

# tar -zxvf keepalived-1.2.13.tar.gz

# cd keepalived-1.2.13

# ./configure && make && make install

# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

# mkdir /etc/keepalived

# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

# cp /usr/local/sbin/keepalived /usr/sbin/

# chkconfig --add keepalived

# chkconfig --level 345 keepalived on

(2)修改主的keepalived的配置文件

注意的是:

nopreempt这个参数只能用于state为BACKUP的情况,所以在配置的时候要把master和backup的state都设置成BACKUP,这样才会实现keepalived的非抢占模式!

也就是说:

* 当state状态一个为MASTER,一个为BACKUP的时候,加不加nopreempt这个参数都是一样的效果。即都是根据priority优先级来决定谁抢占vip资源的,是抢占模式!

* 当state状态都设置成BACKUP,如果不配置nopreempt参数,那么也是看priority优先级决定谁抢占vip资源,即也是抢占模式。

* 当state状态都设置成BACKUP,如果配置nopreempt参数,那么就不会去考虑priority优先级了,是非抢占模式!即只有vip当前所在机器发生故障,另一台机器才能接管vip。

  即使优先级高的那一台机器恢复正常后也不会主动抢回vip,只能等到对方发生故障,才会将vip切回来。

Keepalived+mysql双主一般来说,中小型规模的时候,采用这种架构是最省事的。 在master节点发生故障后,利用keepalived的高可用机制实现快速切换到备用节点。

在这个方案里,有几个需要注意的地方:

1、采用 keepalived 作为高可用方案时,两个节点最好都设置成 BACKUP模式,避免因为意外情况下(比如 脑裂)相互抢占导致往两个节点写入相同数据而引发冲突;

2、把两个节点的 auto_increment_increment(自增步长)和 auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master 节点意外宕机时,可能会有部分 binlog 未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID 冲突的话,也可以不这么做;

3、slave 节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的 slave服务器,硬件配置不能低于 master 节点;

4、如果对延迟问题很敏感的话,可考虑使用 MariaDB 分支版本,或者直接上线 MySQL 5.7 最新版本,利用多线程复制的方式可以很大程度降低复制延迟。

# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id Master          #路由名称

}

vrrp_script check_run_mysql
{

    script "/etc/keepalived/bin/mysql.sh"     #检查mysql状态脚本

interval 2     #每两秒检测一下

}

vrrp_instance VI_1 {

state BACKUP     #都设置为BACKUP,设置非抢占模式,防止主库故障重起之后数据不同步,就进行VIP飘移

nopreempt    

    interface ens33         #网卡名称

    virtual_router_id 51  

    priority 100                  #优先级,从库要比主库低

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

}
track_script {

    check_run_mysql     #执行mysql监控服务脚本

}

    virtual_ipaddress {  

        192.168.184.131/24         #vip地址

    }

}

virtual_server 192.168.184.131 3306 {

    delay_loop 5         #每5秒检查一次

    #lb_algo rr

    #Lb_kind DR

    persistence_timeout 50

    protocol TCP

    

    real_server 192.168.184.128 3306 {         #P为当前主机IP,3306为数据库端口

        weight 1

        notify_down  /etc/keepalived/bin/mysql.sh

        TCP_CHECK {

        connect_timeout 3           #连接超时时间

        nb_get_retry 3                 #重连次数

        delay_before_retry 3         #重连间隔时间

        connect_port 3306         #检查端口

        }

    }

}

编写监测脚本:监测到mysql挂掉了,将keepalived进程关掉

# mkdir /etc/keepalived/bin/

# vim  /etc/keepalived/bin/mysql.sh

#!/bin/bash

STATUS=`/usr/local/mysql/bin/mysql -uroot -p123456 -e "show databases" |grep -c Database`

if      [ $STATUS -eq 0 ];then

        systemctl stop keepalived

fi

# chmod +x /etc/keepalived/bin/mysql.sh

(3)修改从的keepalived的配置文件

# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id Slave  

}

vrrp_script check_run_mysql
{

    script "/etc/keepalived/bin/mysql.sh"     

interval 2   

}

vrrp_instance VI_1 {

state BACKUP

nopreempt      

    interface ens33

    virtual_router_id 51  

    priority 90                  #要比主库的小

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

}

track_script {

    check_run_mysql    

}

    virtual_ipaddress {  

        192.168.184.131/24

    }

}

virtual_server 192.168.184.131 3306 {

    delay_loop 6

    #lb_algo rr

    #lb_kind DR

    persistence_timeout 50

    protocol TCP

    

    real_server 192.168.184.129 3306 {         #从的地址

        weight 1

        notify_down /etc/keepalived/bin/mysql.sh

        TCP_CHECK {

        connect_timeout 3  

        nb_get_retry 3

        delay_before_retry 3

        connect_port 3306

        }

    }

}

编写监测脚本:监测到mysql挂掉了,将keepalived进程关掉

# mkdir /etc/keepalived/bin/

# vim  /etc/keepalived/bin/mysql.sh

#!/bin/bash

STATUS=`/usr/local/mysql/bin/mysql -uroot -p123456 -e "show databases" |grep -c Database`

if      [ $STATUS -eq 0 ];then

        systemctl stop keepalived

fi

# chmod +x /etc/keepalived/bin/mysql.sh

(4)主从上分别启动keepalived

# systemctl start keepalived

# ip a查看地址

只有主上会产生vrrp地址

(5)测试高可用

关掉主库mysql

# service mysqld  stop 停掉主mysql

#ip a 查看ip没有虚拟ip

从库上查看ip可以看到虚拟vip

再启动主库mysql、keepakived

# service mysqld start

# systemctl start keepalived

# ip a 主重新产生vip

当切换到从上面,需要限制从为只读,以免恢复主后,主从复制数据出现问题

Mysql>flush tables with read lock; 全表为只读,包括超级用户root

Mysql>unlock tables; 解除限制,为读写

Mysql>set global read_only=0;

猜你喜欢

转载自blog.csdn.net/weixin_42272246/article/details/128533336
今日推荐