之前介绍了主从同步和主主同步功能,具体参照:

在主主mysql的模式下,我们就要考虑高可用了,在主主中任意一台MySQL挂掉后,

keepalived会自动切换到另一台MySQL上提供服务,从而保证业务正常可用,这个过程不需要人工干预,

人工要做的只是修复发生故障的服务器,在一台服务器挂掉之后,另外一个服务器自动接手了。

mysql高可用实现,我们这里主要是利用Keepalived实现MySQL主主高可用。

准备两台虚拟机,

CentOS7。

节点DB1:192.168.11.31。

节点DB2:192.168.11.32。

安装Keepalived

安装依赖:

yum -y install libnl libnl-devel

yum -y install libnfnetlink-devel

编译安装:

tar -zxvf keepalived-1.3.4.tar.gz

cd keepalived-1.3.4

./configure --prefix=/usr/local/keepalived

make && make install

安装完成后做成服务模式,方便开启和关闭:

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

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

cp /usr/local/keepalived/sbin/keepalived /etc/init.d/

设置开机自动启动:

systemctl enable keepalived.service

两台机器都要安装Keepalived。

配置Keepalived

keepalive通过组播,单播等方式(自定义),实现keepalive主备推选。工作模式分为抢占和非抢占

(通过参数nopreempt来控制)。

我们采用非抢占模式,分别配置两个节点的配置文件。

mkdir /etc/keepalived && cd /etc/keepalived/

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

123456@qq.com

}

notification_email_from xxxx@163.com

smtp_server smtp.163.com

smtp_connect_timeout 30

router_id LVS_DEVEL

}

# 检测mysql是否正常运行

vrrp_script check_mysql {

script "/etc/keepalived/check_mysql.sh"

interval 5

}

vrrp_instance VI_1 {

state BACKUP # BACKUP MASTER 两台都配置为backup,非抢占模式

interface eno16777736 #绑定虚拟IP的网卡接口

#VRRP组名,两个节点设置一样,以指明各个节点同属一VRRP组

virtual_router_id 61

priority 100 #优先级,另一台设为90

advert_int 1 ##组播信息发送间隔,两个节点需一致

nopreempt #不抢占,只在优先级高的机器上设置,优先级低的不设置

#设置密码验证信息,两个节点需一致

authentication {

auth_type PASS

auth_pass helloweba

}

#指定虚拟IP,两个节点需设置一样

virtual_ipaddress {

192.168.11.30

}

#检测mysql状态

track_script {

check_mysql

}

}

这里注意,我们设置为非抢占模式,节点1中的优先级最高,并设置nopreempt意为不抢占,那么在节点2上就不要设置这个参数了,并且把优先级设为90即可。

此外我们使用Keepalived设置一个虚拟IP,即VIP,统一以VIP对外,就是说,外部访问连接通过VIP:192.168.11.30连接即可。注意VIP一定不能被其他机器占用。

配置好后,我们还需要设置keepalived 主备通信,添加防火墙vrrp 协议,eno16777736- 网卡名。

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface

eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

如果不执行以上命令的话,会导致两个节点都有VIP的情况。当然你也可以关闭防火墙。

MySQL状态脚本检测脚本

#!/bin/bash

MYSQL=/usr/local/mariadb/bin/mysql

MYSQL_HOST=localhost

MYSQL_USER=root

MYSQL_PASSWORD=grandhonor.net12358

CHECK_TIME=3

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

MYSQL_OK=1

function check_mysql_helth (){

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

if [ $? = 0 ] ;then

MYSQL_OK=1

else

MYSQL_OK=0

fi

return $MYSQL_OK

}

while [ $CHECK_TIME -ne 0 ]

do

let "CHECK_TIME -= 1"

check_mysql_helth

if [ $MYSQL_OK = 1 ] ; then

CHECK_TIME=0

exit 0

fi

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

then

pkill keepalived

exit 1

fi

sleep 1

done

记得给这个mysql的检测脚本可执行权限

最后两台机器上都开启Keepalived服务:systemctlstartkeepalived

高可用测试:

1.我们先使用命令ip a查看两台节点的VIP情况,发现节点1:192.168.11.31目前接手了VIP:192.168.11.30,而节点2并没有VIP。

mysql高可用实战 mysql如何实现高可用_MySQL

2.关闭或者重启节点1或者重启节点1上的Keepalived服务,查看节点2是否接手VIP。

mysql高可用实战 mysql如何实现高可用_mysql高可用实战_02

如图所示,如果在节点2上能看到VIP了说明VIP已经变更到节点2上了。

3.我们接着在两个节点机上的Mysql建立新的用户,允许任意机器连接(实际可以指定具体IP)。

grant all privileges on myhelloweba.* to keep@'%' identified by '123456';

4.关闭接手VIP服务节点的mysql服务,检验是否能从其他机器上通过终端连接192.168.11.30上的数据库。如果可以在测试往数据库中添加数据,再检测数据是否正常。