MySQL HA Keepalived 解决方案部署步骤详细说明

一、方案说明

说明:官方图示(如下图)高可用集群部署方案中最少需要两台物理机器(Master和Slave),二者之间互为主从, Master负责读写,Slave通过二进制日志文件同步数据。这就要求两台物理机器必须开启binlog日志,来复制并执行日志中的事件(主要是数据库的DDL和DML)。MySQL Router使用KeepAlive实现。

二、详细步骤

Master

xx.xx.xx.68

Slave  

xx.xx.xx.149

KeepAlive VIP

xx.xx.xx.90

2.1修改mysql配置文件

 

Master配置文件

###########################################

server-id                = 1【必须唯一】

log_bin                 

#= /var/log/mysql/mysql-bin.log

#expire_logs_days        = 10

max_binlog_size         = 100M

# prevent split brain

#auto_increment_offset    = 1【奇数自增】

#auto_increment_increment   = 2

  

Slave配置文件

###########################################

server-id               = 2【必须唯一】

log_bin

#= /var/log/mysql/mysql-bin.log

#expire_logs_days        = 10

max_binlog_size   = 100M

# prevent split brain

#auto_increment_offset = 2 【偶数自增】

#auto_increment_increment = 2

 

NOTE:

Server-id

必须唯一,参数值[1,2^32-1)

Log_bin=日志文件名【可不填写】

必须开启,从服务器必须开启

Expire_logs_days =10

删除十天以前的binlog日志

Max_binlog_szie =100M

日志文件最大100M,但是事物必须完成,所有偶尔会看到日志大于100M

auto_increment_offset=1

auto_increment_increment=2

在发生网络环境脑裂时候出现主键冲突,所以设置Master奇数增长,Slave偶数增长

【可选:如果需要的话:binlog-ignore-db=mysql 可以不写binlog,replicate-ignore-db可以不复制】

NOTE:

!!!修改之后必须重启!!!

  

2.2创建用户

在Master和Slave两台机器上创建复制数据的账号(rootha)和密码(rootha),可任意取名

Mysql> grant replication slave on *.* to rootha@'%' identified by 'rootha';

Mysql> flush privileges;

 

查看日志数据:

Show binary logs;

 

如果不是初装系统,使用以下命令来清除日志记录:

Msyql> purge binary logs before '2020-01-01';

2.3设置主从

2.3.1设置Master日志复制

Msyql> show master status;

 

Slave【注意Master查看之后在Slave执行】上执行【以下参数来源于上面的数据】

Msyql>

CHANGE MASTER TO

MASTER_HOST='xx.xx.xx.68',

MASTER_USER='rootha',

MASTER_PASSWORD='rootha',

MASTER_LOG_FILE='mysql-bin.000002',

MASTER_LOG_POS=591;

!!!Slave上执行!!!

2.3.2设置Slave日志复制

Msyql> show master status;

 

Master【注意Slave查看之后在Master执行】上执行【以下参数来源于上面的数据】

Msyql>

CHANGE MASTER TO

MASTER_HOST='xx.xx.xx.149',

MASTER_USER='rootha',

MASTER_PASSWORD='rootha',

MASTER_LOG_FILE='mysql-bin.000004',

MASTER_LOG_POS=154;

!!!Master上执行!!!

2.3.3启动复制

Master和Slave上执行:

Msyql> start slave;

 

2.3.3验证双主

2.3.3.1 Master查看状态

Mysql> show slave status\G;

 

2.3.3.2 Slave 查看状态

Mysql> show slave status\G;

 

以下状态均为Yes表示设置成功:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

 

NOTE:

!!!如果不成功,请重复以上操作!!!

2.4 KeepAlive

2.4.1编写mysql-keepalived.sh

安装keepalived:

在Master和Slave机器上执行,下载最新版本的keepalived并安装

创建脚本:cd /usr

sudo vim mysql-keepalived.sh

  

NOTE:

账号密码都是之前创建的用户名和密码,mysql命令路径根据实际情况填写

!!!黑色字体必须要要确保正确!!!

 

===================== Master开始 mysql-keepalived.sh =====================

#!/bin/bash

MYSQL=/usr/bin/mysql

MYSQL_HOST=localhost

MYSQL_USER=rootha

MYSQL_PASSWORD=rootha

CHECK_TIME=3

MYSQL_OK=1

function check_mysql_health (){

        $MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1

        if [ $? = 0 ] ;then

                MYSQL_OK=1

                echo 'mysql is ok'

        else

                MYSQL_OK=0

                echo 'mysql is down'

        fi

        return $MYSQL_OK

}

 

while [ $CHECK_TIME -ne 0 ]  

do

     let "CHECK_TIME-=1"

     check_mysql_health

     if [ $MYSQL_OK = 1 ] ; then

          CHECK_TIME=0

          exit 0

     fi

 

     if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]

     then

         /etc/init.d/keepalived stop

     exit 1

     fi

     sleep 1

done

===================== Master 结束 mysql-keepalived.sh ==========================

  

===================== Slave开始 mysql-keepalived.sh =======================

#!/bin/bash

MYSQL=/usr/bin/mysql

MYSQL_HOST=localhost

MYSQL_USER=rootha

MYSQL_PASSWORD=rootha

CHECK_TIME=3

#mysql is up MYSQL_OK is 1 , mysql down MYSQL_OK is 0  

MYSQL_OK=1

function check_mysql_health (){

        $MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1

        if [ $? = 0 ] ;then

                MYSQL_OK=1

                echo 'mysql is ok'

        else

                MYSQL_OK=0

                echo 'mysql is down'

        fi

        return $MYSQL_OK

}

 

while [ $CHECK_TIME -ne 0 ]  

do

     let "CHECK_TIME-=1"

     check_mysql_health

     if [ $MYSQL_OK = 1 ] ; then

          CHECK_TIME=0

          exit 0

     fi

 

     if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]

     then

         /etc/init.d/keepalived stop

     exit 1

     fi

     sleep 1

done

================= Slave mysql-keepalived.sh ============================

 

赋予可执行权限

> sudo chmod +x mysql-keepalived.sh

> ./mysql-keepalived.sh

结果如下:(表示MySQL正常)

 

2.4.2编写keepalived.conf

2.4.2.1 Maser配置文件keepalived.conf

 

global_defs {

    router_id zhf

}

vrrp_script check_run {

    script "/usr/mysql-keepalived.sh"

    interval 5

}

vrrp_sync_group VG1 {

     group {

        VI_1

     }

}

vrrp_instance VI_1 {

     state MASTER

     interface enp0s3

     virtual_router_id 100

     priority 100

     advert_int 1

     nopreempt

     authentication {

         auth_type PASS

         auth_pass 123456

     }

     track_script {

         check_run

     }

     virtual_ipaddress {

         xx.xx.xx.90

     }

}

2.4.2.2 Slave配置文件keepalived.conf

 

global_defs {

    router_id zhf

}

vrrp_script check_run {

    script "/usr/mysql-keepalived.sh"

    interval 5

}

vrrp_sync_group VG1 {

     group {

        VI_1

     }

}

vrrp_instance VI_1 {

     state BACKUP

     interface enp0s3

     virtual_router_id 10

     priority 10

     advert_int 1

     nopreempt

     authentication {

         auth_type PASS

         auth_pass 123456

     }

     track_script {

         check_run

     }

     virtual_ipaddress {

         xx.xx.xx.90

     }

}

 

在Master和Slave启动keepalived

> sudo service keepalived start

> ip addr

 

 NOTE:

router_id

主从必须一致

State

Master设置为MASTER

Slave 设置为BACKUP

interface

发送VRRP包的网络接口,使用命令ifconfig查看

virtual_router_id

取值在0-255之间,用来区分多个instance的VRRP组播, 同一网段中该值不能重复

priority

用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)

advert_int

发VRRP包的时间间隔,即多久进行一次master选举,可以认为是健康查检时间间隔,单位为秒

auth_type

同一vrrp实例MASTER与BACKUP 使用相同的密码才能正常通信

auth_pass

主从必须一致

virtual_ipaddress

VIP

 

测试:

停掉任何一台机器的MySQL,访问90机器都可以相应的切换,表示成功。

三、FAQ

3.1 主键自增带来的问题

事先设置好offset和increment的值,即:实现设置好自增字段的初始值和步长。

MASTER为奇数开始,SLAVE为偶数开始。两者都采用相同的步长。

 

1)、设置主主服务器的自增长偏移位置不同:

A :auto_increment_offset=3

B :auto_increment_offset=4

2)、设置主主服务器步长相同:

auto_increment_increment=2 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值