ITPub博客

首页 > 数据库 > MySQL > MySQL高可用----双主+Keepalived--单点故障、故障切换

MySQL高可用----双主+Keepalived--单点故障、故障切换

原创 MySQL 作者:lhrbest 时间:2020-02-21 16:24:52 0 删除 编辑


  MySQL 高可用 ---- 双主 +Keepalived-- 单点故障、故障切换




一.1   MySQL 双主+ GTID 环境安装

/usr/local/mysql57/mysql5719/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57/mysql5719 --datadir=/usr/local/mysql57/mysql5719/data573331131
/usr/local/mysql57/mysql5719/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57/mysql5719 --datadir=/usr/local/mysql57/mysql5719/data573331132
 
vi /etc/my.cnf
 
 
### MySQL双主+Keepalived
#  M1(131)  <---->  M2(132)
 
#M1
[mysqld573331131]
basedir=/usr/local/mysql57/mysql5719
datadir=/usr/local/mysql57/mysql5719/data573331131
socket=/usr/local/mysql57/mysql5719/data573331131/mysqld573331131.sock
log-error=/usr/local/mysql57/mysql5719/data573331131/mysqld573331131.log
user=mysql
port=3331
character_set_server=utf8mb4
secure_file_priv=''
server-id = 573331131
log-bin =
binlog_format=STATEMENT
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
log-slave-updates
auto-increment-increment=2
auto-increment-offset=1
skip_name_resolve
gtid-mode=ON
enforce-gtid-consistency=on
 
 
 
### MySQL双主+Keepalived
#  M1(131)  <---->  M2(132)
#M2
[mysqld573331132]
basedir=/usr/local/mysql57/mysql5719
datadir=/usr/local/mysql57/mysql5719/data573331132
socket=/usr/local/mysql57/mysql5719/data573331132/mysqld573331132.sock
log-error=/usr/local/mysql57/mysql5719/data573331132/mysqld573331132.log
user=mysql
port=3331
character_set_server=utf8mb4
secure_file_priv=''
server-id = 573331132
log-bin =
binlog_format=STATEMENT
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
log-slave-updates
auto-increment-increment=2
auto-increment-offset=2
skip_name_resolve
gtid-mode=ON
enforce-gtid-consistency=ON
 
 
mysqld_multi start 573331131-573331132
mysqld_multi report 573331131-573331132
 
mysql -uroot -p -S/usr/local/mysql57/mysql5719/data573331131/mysqld573331131.sock
mysql -uroot -p -S/usr/local/mysql57/mysql5719/data573331132/mysqld573331132.sock
 
 
 
grant all privileges on *.* to root@'%' identified by 'lhr'  WITH GRANT OPTION;
grant all privileges on *.* to root@'localhost' identified by 'lhr'  WITH GRANT OPTION;
flush privileges;
select user,host,grant_priv from mysql.user;
 
 
 
--2个主库
grant replication slave on *.* to repl@'%' identified by 'lhr';
 
show master status \G;
 
 
--M2
change master to master_host='192.168.59.131',master_port=3331,master_user='repl',master_password='lhr',master_auto_position=1;
 
--M1
change master to master_host='192.168.59.132',master_port=3331,master_user='repl',master_password='lhr',master_auto_position=1;
 
 
 
 
start slave;
show slave status \G;
 
 
--主库
create database lhrdb;
use lhrdb;
create table lhrdb.mytb1(id int,name varchar(30));
SET SESSION binlog_format = 'STATEMENT';
insert into lhrdb.mytb1 values(1,@@hostname);
select * from lhrdb.mytb1;

 

一.2   分别安装keepalived 软件包

下载:

http://www.keepalived.org/software/

http://rpmfind.net/linux/rpm2html/search.php?query=keepalived&submit=%E6%90%9C%E7%B4%A2...+&system=&arch=

 

安装Keepalived 并将其配置成系统服务。 master1 master2 两台机器上同样进行如下操作:

yum install -y openssl-devel
cd /soft
wget http://www.keepalived.org/software/keepalived-2.0.19.tar.gz
tar -zvxf keepalived-2.0.19.tar.gz
cd keepalived-2.0.19
./configure --prefix=/usr/local/keepalived
make && make install
 
--或:yum install -y keepalived
 
cp /soft/keepalived-2.0.19/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
echo "/etc/init.d/keepalived start" >> /etc/rc.local
chkconfig keepalived on

 

一.3   配置

一.3.1   master1 机器上的 keepalived.conf 配置

master1 机器上的 keepalived.conf 配置。(下面配置中没有使用 lvs 的负载均衡功能,所以不需要配置虚拟服务器 virtual server

[root@master1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@master 1  ~]# echo '' > /etc/keepalived/keepalived.conf

[root@master1 ~]# vim /etc/keepalived/keepalived.conf        #清空默认内容,直接采用下面配置:

! Configuration File for keepalived

       

global_defs {

    router_id M y SQL -MM -HA

}

       

vrrp_script chk_mysql_port  {     # 检测 mysql 服务是否在运行。有很多方式,比如进程,用脚本检测等等

    script " /etc/keepalived/chk_mysql.sh "   # 这里通过脚本监测

    interval 2                   # 脚本执行间隔,每 2s 检测一次

    weight -5                    # 脚本结果导致的优先级变更,检测失败(脚本返回非 0 )则优先级 -5

    fall 2                       # 检测连续 2 次失败才算确定是真失败 会用weight 减少优先级( 1-255 之间)

    rise 1                       # 检测 1 次成功就算成功。但不修改优先级

}

 

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0       # 指定虚拟 ip 的网卡接口

    virtual_router_id 51    # 路由器标识, MASTER BACKUP 必须是一致的

    priority 101             # 定义优先级,数字越大,优先级越高,在同一个 vrrp_instance 下, MASTER 的优先级必须大于 BACKUP 的优先级。这样 MASTER 故障恢复后,就可以将 VIP 资源再次抢回来

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

         192.168. 59.136

    }

      

track_script {

    chk_mysql_port

}

}

 

 

一.3.2   master 2 机器上的keepalived.conf 配置

master2 机器上的 keepalived 配置。 master2 机器上的 keepalived.conf 文件只修改 priority 90 nopreempt 不设置、 real_server 设置本地 IP

[root@master2 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@master2 ~]# echo '' > /etc/keepalived/keepalived.conf

[root@master2 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

       

global_defs {

    router_id M y SQL -MM -HA

}

       

vrrp_script chk_mysql_port  {     # 检测 mysql 服务是否在运行。有很多方式,比如进程,用脚本检测等等

    script " /etc/keepalived/chk_mysql.sh "   # 这里通过脚本监测

    interval 2                   # 脚本执行间隔,每 2s 检测一次

    weight -5                    # 脚本结果导致的优先级变更,检测失败(脚本返回非 0 )则优先级 -5

    fall 2                       # 检测连续 2 次失败才算确定是真失败 会用weight 减少优先级( 1-255 之间)

    rise 1                       # 检测 1 次成功就算成功。但不修改优先级

}

 

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0       # 指定虚拟 ip 的网卡接口

    virtual_router_id 51    # 路由器标识, MASTER BACKUP 必须是一致的

    priority 99              # 定义优先级,数字越大,优先级越高,在同一个 vrrp_instance 下, MASTER 的优先级必须大于 BACKUP 的优先级。这样 MASTER 故障恢复后,就可以将 VIP 资源再次抢回来

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

         192.168. 59.136

    }

      

track_script {

    chk_mysql_port

}

}

 

 

一.3.3   配置 /etc/keepalived/chk_mysql.sh

2 个节点都需要配置:

[root@master2 ~]# cat /etc/keepalived/chk_mysql.sh

#!/bin/bash

counter=$(netstat -na|grep "LISTEN"|grep " 33 31 "|wc -l)

if [ "${counter}" -eq 0 ]; then

    /etc/init.d/keepalived stop

fi

 

chmod 755 /etc/keepalived/chk_mysql.sh

 

一.4   2 个节点都启动 Keepalived

tail -100f /var/log/messages

/etc/init.d/keepalived start

/etc/init.d/keepalived status

ps -ef |grep keep

ip a

 

 

使用VIP 进行连接:

mysql -uroot -plhr -h192.168.59.136 -P3331

select @@server_id,@@hostname;

 

create database lhrdb 2 ;

use lhrdb 2 ;

create table lhrdb 2 .mytb1(id int,name varchar(30));

SET SESSION binlog_format = 'STATEMENT';

insert into lhrdb 2 .mytb1 values(1,@@hostname);

select * from lhrdb 2 .mytb1;

 

 

一.5   测试高可用性

1 、通过 Mysql 客户端通过 VIP 连接,看是否连接成功。

2 、停止 master 1 这台mysql 服务, 观察 是否能正常切换过去,可通过ip addr 命令来查看 VIP 在哪台服务器上。

master 数据库宕的时候, VIP 就会自动切换到另一台上,实现主主自动切换。远程连接数据库的虚拟 IP 是可以连接的,实现应用切换的效率。部署应用的时候配置 VIP 即可共享数据库资源。

pkill mysqld

停止master1 机器上的 mysql 服务,根据配置中的脚本, mysql 服务停了, keepalived 也会停,从而 vip 资源将会切换到 master2 机器上。

 

3. 注意:当 宕掉的主库 恢复的时候,要启动keepalived ,否则 VIP 无法自动切换回来。( mysql 服务没有起来的时候, keepalived 服务也无法顺利启动!)

如果restart 重启 mysql ,那么还要启动下 keepalived ,因为 mysql 重启,根据脚本会造成 keepalived 关闭

注意:一定要先启动mysql 服务,然后再启动 keepalived 服务。如果先启动 keepalived 服务,按照上面的配置, mysql 没有起来,就会自动关闭 keepalived

service start status
ip a

 




 

keepalived+双主架构部署

在高可用集群环境中,keepalived使用的是VIP,利用keepalived自带的服务监控功能和自定义脚本来实现MYSQL故障时自带切换。

Keepalived基于VRRP协议,虚拟冗余路由协议,所谓vrrp的优先级就是它会根据优先级来确定其他在集群中的地位,用0-255来表示,数字越小则表示优先级越低,数值越大表示优先级越高。当值为0,代表着master放弃持有VIP;该值为255时,表示当前master的优先级最高并蚩尤VIP。

 

1、      搭建GTID+row模式双主环境

IP

主机名

作用

数据库版本

操作系统版本

172.16.20.32

mastera

master

Mysql5.7.20

Redhat6.7

172.16.20.34

masterb

master

Mysql5.7.20

Redhat6.7

172.16.20.30

VIP

 

 

1.1.     MySQL GTID环境安装

此处参照以前论坛内容:

http://www.cnblogs.com/hmwh/p/9011377.html

https://www.cnblogs.com/hmwh/p/9011377.html

1.2.     分别再主备库上创建同步账号

创建主从复制账号

create user 'rep'@'172.16.20.%' identified by 'mysql';

grant replication slave on *.* to 'rep'@'172.16.20.%';

show grants for 'rep'@'172.16.20.%';

flush privileges;

 

所有主机创建管理账号:

 

create user 'zs'@'172.16.20.%' identified by '123456';

grant all privileges on *.* to 'zs'@'172.16.20.%';

flush privileges;

 

 

配置主从复制:

change master to master_host='172.16.20.32',master_port=3307,master_user='rep',master_password='mysql',master_auto_position=1;

star t slave;

show slave status\G;

无问题后再在主库配置复制关系:

change master to master_host='172.16.20.34',master_port=3307,master_user='rep',master_password='mysql',master_auto_position=1;

 

start salve;

show slave status\G;

 

1.3分别安装keepalived软件包

由于我的没有keepalived包

yum install keepalived

 下载地址:

http://rpmfind.net/linux/rpm2html/search.php?query=keepalived&submit=%E6%90%9C%E7%B4%A2...+&system=&arch=

 

rpm -ivh keepalived-1.2.13-5.el6_6.x86_64.rpm

 

 

 

1.4配置MYSQL数据库检测脚本

两台服务器都配置检测脚本:内容根据情况自行修改

cd /etc/keepalived/

vim checkmysql.sh

内容如下:

#!/bin/bash

mysqlstr=/usr/local/mysql5.7/bin/mysql

host=172.16.2.32

user=zs

password=123456

port=3307

#####mysql service machine status health is 1,others 0

mysql_status=1

 

#####check mysql status#########

$mysqlstr -h $host -u $user -p$password -P $port -e "show status;" > /dev/null 2>&1

 

    if [ $? = 0 ];then

         echo "mysql_status=1"

        exit 0

    else

 

/etc/init.d/keepalived stop

 

fi

 

chmod 775 checkmysql.sh

1.5两台机器上修改keepalived配置文件

主库的:

vim keepalived.conf

 

vrrp_script vs_mysql_100 {

     script "/etc/keepalived/checkmysql.sh"

     interval 10

 

}

 

vrrp_instance VI_100 {

    state BACKUP

    nopreempt

    interface eth0

    virtual_router_id 100

    priority 100     --注意,30的为100,34的为90。

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1314

    }

 

track_script {

    vs_mysql_100

   

}

 

 virtual_ipaddress {

        172.16.20.30

    }

}

 

备库的:

vim keepalived.conf

 

vrrp_script vs_mysql_101 {

     script "/etc/keepalived/checkmysql.sh"

     interval 10

 

}

 

vrrp_instance VI_101 {

    state BACKUP

    nopreempt

    interface eth0

    virtual_router_id 100

    priority 90

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1314

    }

 

track_script {

    vs_mysql_101

   

}

 

 virtual_ipaddress {

        172.16.20.30

    }

}

 

 

1.6 启动keepalived

32服务器先启动。

/etc/init.d/keepalived start

/etc/init.d/keepalived status

ps -ef |grep keep

 

 

tail -100f /var/log/messages

 

 

172.16.20.32优先级高,keepalived的状态已经由backup升级为master。

ip addr

 

 

 

34服务器启动keepalived进程:

 

/etc/init.d/keepalived start

/etc/init.d/keepalived status

ps -ef |grep keep

tail -100f /var/log/messages

 

 

查看日志为backup 模式

管理用户测试登陆:

 

 

 

 

查看的UUID为主库32的。

 

 

备库keepalived 启动了,并没有VIP。

 

 1.7故障演练

关闭32。

可以看到VIP飘到34服务器上。

 

 

且keepalived状态由backup升级为master。

 




使用Keepalived实现MySQL主从高可用



一、问题提出

        由于公司服务器硬件已临界损耗期限,最近数据库主机频繁出现故障,不得不手工执行主从库切换操作。这种方式的问题是全程需要人工干预,宕机时间长,严重影响线上业务。于是开始调研MySQL 高可用解决方案,要达到两个主要目标:主库出现问题时快速自动切换到从库;对应用透明。

 


二、方案选择

        MySQL的高可用方案有很多,比如Cluster、MMM、MHA、DRBD,以及Oracle官方推出的Fabric等,这些方案各有优劣,但都比较复杂,安装配置有一定难度,对线上库实施动静太大。就我们的具体情况而言,并不需要这么复杂的环境,实施简单、对现有架构影响最小、能迅速解决问题的方案才是最适合的。比如我们现在只是配置了MySQL Replication,加上如Keepalived这样的高可用软件,就能实现我们的需求。


        MySQL架构为Master/Slave,当Master故障时,虚IP漂移到Slave上提供服务,简单环境如图1所示。在这种架构中,故障自动切换以后,需要采取手动操作的方式与新的Master进行复制。当然也可以设置为Active-Passive模式下的双Master复制。



图1


 


三、Keepalived简介

        Keepalived的作用是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。



1. VRRP

        Keepalived是对VRRP的一个实现,因此在理解Keepalived的工作原理之前,有必要先了解VRRP的原理。


1.1 VRRP协议

        在现实的网络环境中,两台需要通信的主机(end-host)大多数情况下并没有直接地物理连接。对于这样的情况,它们之间的路由怎么选择?通常有两种方法解决如何选定到达目的主机的下一跳路由问题:


使用动态路由协议,如RIP、OSPF等。

配置静态路由。

        很明显,在主机上配置动态路由,因为管理、维护成本以及是否支持等诸多问题是不切实际的。那么配置静态路由就变得很流行。实际上,这种方式一直沿用至今。但是,路由器,或者说默认网关(default gateway)却经常成为单故障点。就算配置了多个静态路由,却因为必须重启网络才能生效而变得不实用。


        VRRP(虚拟路由冗余协议,Virtual Router Redundancy Protocol)的目的就是为了解决静态路由单点故障问题。它通过一种竞选(election)协议动态地将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。这里有两个关键名词:VRRP路由器和虚拟路由器。


VRRP路由器:VRRP路由器就是一台路由器,只不过上面运行了VRRPD程序来实现VRRP协议而已,是物理的路由器。一台VRRP路由器可以位于多个虚拟路由器中。

虚拟路由器:所谓虚拟,就是说并不是实际存在的,是一个逻辑而不是物理的路由器。虚拟路由器通常由多台VRRP路由器通过某种方式组成,就好像将这些物理路由器都丢到一个池里面去,整个池对外看起来就像是一台路由器,但其实内部有多台。虚拟路由器的标识称为VRID。

        在一个VRRP虚拟路由中,有多台物理的VRRP路由器,但是这多台物理路由并不同时工作,而是由一台称为master的负责路由工作,其它的都是backup。master并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是master。master有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的master要负责转发发送给网关地址的包和响应ARP请求。


1.2 工作机制

        VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包形式发送的,多播地址为224.0.0.18。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个众所周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为master的改变而修改自己的路由配置,对它们来说,这种主从的切换是透明的。


        在一个虚拟路由器中,只有作为master的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement Message),backup不会抢占master,除非它的优先级更高。当master不可用时,backup收不到广告包,多台backup中优先级最高的这台会抢占为master。这种抢占是非常快速的(<1秒),以保证服务的连续性。出于安全性考虑,VRRP包使用了加密协议进行加密。


2. Keepalived设计与实现

        Keepalived是一个高度模块化设计的软件,从源代码结构似乎也很容易看出这一点。Keepalived 1.2.13源代码中只有如下目录:check  core  etc  include  libipvs-2.4  libipvs-2.6  vrrp


check:Keepalived的healthchecker子进程的目录,包括了所有的健康检查方式以及对应配置的解析,LVS的配置解析也在这个里面。

core:Keepalived的核心程序,如全局配置的解析,进程启动等等。

etc:包含Keepalived的配置模板和启动脚本等文件。

include:头文件目录。

libipvs*:LVS使用的库文件。

vrrp:Keepalived的vrrpd子进程以及相关的代码。

        Keepalived架构如图2所示。

 


图2



1.1 多进程模式

        Keepalived采用了多进程的设计模式,每个进程负责不同的功能,我们在使用LVS的机器上通常可以看到三个Keepalived进程:

111 keepalived    < 父进程,负责内存管理、监控子进程等

112 \_ keepalived < VRRP子进程

113 \_ keepalived < healthchecker子进程

 


1.2 控制面板

        这里所谓的控制面板就是对配置文件的编译和解析。Keepalived的配置文件解析比较另类,并不是一次解析所有配置,而是只在用到某模块时才解析相应的配置。在源文件里面可以看到类似XXX_parser.c的文件,就是做这个用的。

 


1.3 看门狗

        WatchDog框架提供了对VRRP和healthchecker子进程的监控。

 


1.4 IPVS封装

        Keepalived里面所有对LVS的相关操作并不直接使用ipvsadm客户端程序,而是使用IPVS提供的函数进行操作,这些代码都在check/ipwrapper.c中。

 


四、安装配置

        环境:

        MySQL Master     172.16.1.126

        MySQL Slave      172.16.1.127

        VIP              172.16.1.100


        MySQL主从复制配置从略。

 


1. 安装keepalived软件

        用root执行下面的命令,主从操作一样。


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

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. 主从的配置文件修改

        master的keepalived配置文件如下:


[root@hdp3~]#more /etc/keepalived/keepalived.conf

global_defs {

   router_id MySQL-HA


vrrp_script check_run {

script "/home/mysql/mysql_check.sh"

interval 60

}


vrrp_sync_group VG1 {

group {

VI_1

}

}


vrrp_instance VI_1 {

    state BACKUP

    interface ens32 

    virtual_router_id 51

    priority 100  

    advert_int 1

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1234

    }

    track_script {

    check_run

    }

    notify_master /home/mysql/master.sh

    notify_stop /home/mysql/stop.sh


    virtual_ipaddress {

        172.16.1.100

    }

}

[root@hdp3~]#


        slave的keepalived配置文件如下:


 


[root@hdp4~]#more /etc/keepalived/keepalived.conf

global_defs {

   router_id MySQL-HA


vrrp_script check_run {

script "/home/mysql/mysql_check.sh"

interval 60

}


vrrp_sync_group VG1 {

group {

VI_1

}

}


vrrp_instance VI_1 {

    state BACKUP

    interface ens32  

    virtual_router_id 51

    priority 90  

    advert_int 1

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1234

    }

    track_script {

    check_run

    }

    notify_master /home/mysql/master.sh

    notify_stop /home/mysql/stop.sh


    virtual_ipaddress {

        172.16.1.100

    }

}

[root@hdp4~]#

        master与slave的keepalived配置文件中只有priority设置不同,master为100,slave为90,其它全一样。配置文件是以块形式组织的,每个块都在{}包围的范围内,#和!开头的行都是注释。


        global_defs为全局定义,对整个Keepalived起作用,而不管是否使用LVS。


 


router_id:运行Keepalived的机器的一个标识。

        vrrp_script配置业务进程监控脚本。


 


 


script:设置脚本文件名。

interval:设置脚本执行的时间间隔,这里为每60秒执行一次。

        /home/mysql/mysql_check.sh 文件用以检测MySQL服务是否正常,当发现连接不上mysql,自动把keepalived进程杀掉,让VIP进行漂移。文件内容如下。


 


 


[root@hdp3~]#more /home/mysql/mysql_check.sh

#!/bin/bash

. /home/mysql/.bashrc

count=1


while true

do


mysql -uroot -S /data/mysql.sock -e "show status;" > /dev/null 2>&1

i=$?

ps aux | grep mysqld | grep -v grep > /dev/null 2>&1

j=$?

if [ $i = 0 ] && [ $j = 0 ]

then

   exit 0

else

   if [ $i = 1 ] && [ $j = 0 ]

   then

       exit 0

   else

        if [ $count -gt 5 ]

        then

              break

        fi

   let count++

   continue

   fi

fi


done


/etc/init.d/keepalived stop

[root@hdp3~]#

        vrrp_sync_group配置VRRP同步组。不使用Sync Group的话,如果机器有两个网段,一个内网一个外网,每个网段开启一个VRRP实例。假设VRRP配置为检查内网,那么当外网出现问题时,VRRPD认为自己仍然健康,那么不会触发Master和Backup的切换,从而导致问题。Sync Group解决这个问题,可以把两个实例都放进一个Sync Group,这样的话,Sync Group里面任何一个实例出现问题都会发生切换。


 


group:设置同一组中的VRRP实例名,这里只有一个实例VI_1。

        vrrp_instance配置VRRP实例。VRRP实例表示在上面开启了VRRP协议。这个实例说明了VRRP的一些特性,比如主从、VRID等等。可以在每个网卡上开启一个实例。VRRP实例主要定义vrrp_sync_group里面的每个组的漂移IP等。


 


 


state:指定实例的初始状态。在两台路由都启动后,马上会发生竞争,高priority的会竞选为Master,所以这里的state并不表示这台就一直是Backup。

interface:实例绑定的网卡。

virtual_router_id:VRID标记,值为0..255,这里使用默认的51。

priority:高优先级竞选为Master,Master要高于Backup至少50。这里MySQL主从库两个优先级分别设置为100和90,因此当Keepalived启动后,MySQL主库会被选为Master。

advert_int:检查间隔,这里设置为默认的1秒。

nopreempt:设置为不抢占,注意这个配置只能设置在state为BACKUP的主机上。当MASTER出现问题后,BACKUP会竞选为新的MASTER,那么当之前的MASTER重新在线后,是继续成为MASTER还是变成BACKUP呢?默认不设置不抢占,那么之前的MASTER起来后会继续抢占成为MASTER。这样的频繁切换对于业务是不能容忍的,我们希望MASTER起来后成为BACKUP,所以要设置不抢占。又因为nopreempt配置只能用在state为BACKUP的主机上,因此MASTER的state也得设置为BACKUP,也就是说172.16.1.126和172.16.1.127都要将state设置为BACKUP。通过在两台BACKUP上面设置不同的priority,让它们一起来就抢占,高priority的172.16.1.126成为最初的MASTER。

authentication:设置认证类型和认证密码。 

auth_type:认证类型,支持PASS、AH两种,通常使用PASS类型。

auth_pass:明文认证密码。同一VRRP实例的MASTER与BACKUP使用相同的密码才能正常通信。

track_script:设置追踪脚本,这里为check_run,即调用vrrp_script中定义的脚本。 

notify_master:指定当切换到MASTER时执行的脚本。

notify_stop:VRRP停止以后执行的脚本。

virtual_ipaddress:指定漂移地址(VIP),也就是切换到MASTER时,这些IP或被添加,切换到BACKUP时,这些IP会被删除。因此每台服务器上可以不绑定任何虚拟地址,而都把它们放到virtual_ipaddress里面,可以都多个。Keepalived会自动使用ip addr进行绑定。

        /home/mysql/master.sh的作用是状态改为master以后执行的脚本。首先判断复制是否有延迟,如果有延迟,等1分钟后,不论是否有延迟,都并停止复制,并且记录binlog和pos点。文件内容如下。


 


 


[root@hdp3~]#more /home/mysql/master.sh

#!/bin/bash


. /home/mysql/.bashrc


Master_Log_File=$(mysql -uroot -S /data/mysql.sock -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}')

Relay_Master_Log_File=$(mysql -uroot -S /data/mysql.sock -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}')

Read_Master_Log_Pos=$(mysql -uroot -S /data/mysql.sock -e "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}')

Exec_Master_Log_Pos=$(mysql -uroot -S /data/mysql.sock -e "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " '{print $2}')


i=1


while true

do


if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ]

then

   echo "ok"

   break

else

   sleep 1


   if [ $i -gt 60 ]

   then

      break

   fi

   continue

   let i++

fi

done


mysql -uroot -S /data/mysql.sock -e "stop slave;"

mysql -uroot -S /data/mysql.sock -e "reset slave all;"

mysql -uroot -S /data/mysql.sock -e "reset master;"

mysql -uroot -S /data/mysql.sock -e "show master status;" > /tmp/master_status_$(date "+%y%m%d-%H%M").txt


[root@hdp3~]#

        /home/mysql/stop.sh表示Keepalived停止以后需要执行的脚本。检查是否还有复制写入操作,最后无论是否执行完毕都退出。文件内容如下。


 


[root@hdp3~]#more /home/mysql/stop.sh

#!/bin/bash


. /home/mysql/.bashrc


M_File1=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/File/{print $2}')

M_Position1=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}')

sleep 1

M_File2=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/File/{print $2}')

M_Position2=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}')


i=1


while true

do


if [ $M_File1 = $M_File1 ] && [ $M_Position1 -eq $M_Position2 ]

then

   echo "ok"

   break

else

   sleep 1


   if [ $i -gt 60 ]

   then

      break

   fi

   continue

   let i++

fi

done


[root@hdp3~]#

五、测试

1. 分别在master上和slave上启动keepalived进程。


/etc/init.d/keepalived start

        成功启动后可以看到如图3所示的3个Keepalived进程。



图3


2. 查看master上的VIP


[root@hdp3~]#ip addr

        结果如图4所示,可以看到VIP已经绑定成功。



图4



3. 客户端使用VIP连接数据库,创建测试库,插入数据。


 


C:\WINDOWS\system32>mysql -u wxy -p -h 172.16.1.100

Enter password: ******

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2958

Server version: 5.6.14-log Source distribution


Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> create database test;

Query OK, 1 row affected (0.00 sec)


mysql> use test;

Database changed

mysql> create table t1(a int);

Query OK, 0 rows affected (0.01 sec)


mysql> insert into t1 values (1);

Query OK, 1 row affected (0.00 sec)


mysql> commit;

Query OK, 0 rows affected (0.00 sec)


mysql> select * from t1;

+------+

| a    |

+------+

|    1 |

+------+

1 row in set (0.00 sec)


mysql>

4. 模拟mysqld crash

        在master上执行以下命令:


 


[root@hdp3~]#pkill -9 mysqld

5. 再次使用VIP连接,数据没有异常,复制停止了,因为已经切换为主库。


 


C:\WINDOWS\system32>mysql -u wxy -p -h 172.16.1.100

Enter password: ******

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1568

Server version: 5.6.14-log Source distribution


Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> use test;

Database changed

mysql> select * from t1;

+------+

| a    |

+------+

|    1 |

+------+

1 row in set (0.00 sec)


mysql> show slave status;

Empty set (0.00 sec)


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)


mysql>

        binlog和pos点记录如下:


[root@hdp4~]#more /tmp/master_status_180704-1751.txt

File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set

mysql-bin.000001 120

[root@hdp4~]#

        此时VIP漂移到172.16.1.127,而172.16.1.126上绑定的VIP已经删除。在172.16.1.126查看IP地址如图5所示。



图5


        同时172.16.1.126的keepalived进程也已经被杀掉:


[root@hdp3~]#ps -ef | grep keepalived | grep -v grep

[root@hdp3~]#

 


六、总结


        本MySQL高可用方案配置简单,对现有MySQL架构无任何影响,也不需要停止数据库服务,完全联机操作即可。有一点需要注意,主从库的端口必须一样。


 


参考:

1. Keepalived+MySQL实现高可用

2. Keepalived权威指南


 


 





About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2020-02-01 06:00 ~ 2020-02-31 24:00 在西安完成

● 最新修改时间:2020-02-01 06:00 ~ 2020-02-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2676646/,如需转载,请注明出处,否则将追究法律责任。

上一篇: HAProxy详解
请登录后发表评论 登录
全部评论
QQ:646634621| 网名:小麦苗| 微信公众号:xiaomaimiaolhr| 11g OCM| QQ群:618766405 微信群:私聊| 《数据库笔试面试宝典》作者| OCP、OCM、高可用(RAC+DG+OGG)网络班开讲啦,有需要的小伙伴可以私聊我。

注册时间:2012-09-23

  • 博文量
    1428
  • 访问量
    8505265