mysql keepalived6_(5.16)mysql高可用系列——keepalived+mysql双主ha

【1】KeepAlived的基本概念与原理

双主KeepAlived

利用KeepAlived实现故障转移(功能上类似于MSSQL的镜像,形式上类似于windows的故障转移群集)

更高级的架构如下:

keepalived架在双主上,双主互为主从,多个从库连接keepalived的VIP。外部使用mycat做读写分离与读负载均衡

6672bb61a2d89dcdaa8fd2bd6ad1f409.png

【1.1】keepalived 简介

(1.1.1)Keepalived服务的工作原理

Keepalived服务对之间通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的(有点像故障转移群集中的投票仲裁形式),主的优先级高于备,因此工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外服务。

在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用(也就是备没有受到VRRP广播包信息),就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于1秒。

(1.1.2)keepalived 的三个核心模块

分别是core/check/vrrp

core:keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

check:负责健康检查,包括常见的各种检查方式。

vrrp:是用来实现VRRP协议的;(VRRP:全称 virtual router redundancy protocol,虚拟路由冗余协议)

(1.1.3)什么是VRRP?

VRRP,全称 virtual router redundancy protocol,虚拟路由冗余协议。

VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。

Keepalived通过组播(默认)、单播(自定义),实现keepalived主备推选,工作模式分为抢占和非抢占。

《1》抢占模式

主服务器正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主不供服务,备提供服务。

也就是说,抢占模式下,不分主备,只管优先级。

不管 keepalived.conf 里的 state 配置成 master 还是 backup ,只看谁的priority 优先级高, priority 优先级高的那一个,在故障恢复后,会自动将VIP资源再次抢回来。

举例:

1)俩台都为master/backup时,比如server1的优先级大于server2,keepalived启动后server1获得master,server2自动降级为backup。

此时server1宕机的话,server2接替 服务,当server1恢复后,server1又变为master,重新接管服务,server2变为backup。属于抢占式。

2)  server1为master,server2位backup,且master优先级大于backup。keepalived启动后server1获得master,server2为backup。

当server1宕机后, server2接管服务。当server1恢复后,server1重新接管服务变为master,而server2变为backup。属于抢占式

3)  server1为master,server2位backup,且master优先级低于backup。keepalived启动后server2获得master,server1为backup。

当server2宕机后, server1接管服务。此时server2恢复后抢占服务,获得master,server1降级将为backup。属于抢占式

《2》非抢占模式

这种方式通过参数nopreempt(一般设置在advert_int 的那一行下面)来控制。不管priority优先级,只要master机器发生故障,VIP资源就会被切换到backup上。

并且,当master机器恢复后,也不会将VIP资源抢回来。除非Backup机器发生故障,才能自动把VIP等资源切换会主库。

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

也就是说

d)  当state状态都为master或者都为backup的时候,没有加nopreempt参数,那么

a)当state状态一个为master,一个为backup的时候,加不加nopreempt 这个参数都是一样的效果。

即都是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

b)当state状态都设置成backup,如果不配置nopreempt参数。

也是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

c)当state状态都设置成backup,如果配置了 nopreempt 参数,那么久不会去考虑priority优先级了。

是非抢占模式! 即只有VIP当前所在机器发生故障,另一台机器才能接管VIP。 不考虑优先级问题。

注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了

【1.2】Keepalived在MySQL上有什么作用?

mysql双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备。

但一个Master宕机后不能实现动态切换,使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。

【1.3】较为详细的介绍

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子进程以及相关的代码。

(1) 多进程模式

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

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

112 \_ keepalived < VRRP子进程

113 \_ keepalived < healthchecker子进程

(2) 控制面板

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

(3) 看门狗

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

(4)IPVS封装

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

【2】环境与架构准备

【2.1】实验基本配置情况

操作系统:CentOS7.5

mysql:5.7.24

Mysql master DB3: 192.168.135.173

Mysql slave   DB4: 192.168.135.174

keepalived:https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

先搭建好mysql主从,这里略

【2.2】操作系统环境配置(防火墙)

#(1)添加非本机IP绑定支持echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf

sysctl-p

#(2)配置iptables,添加VRRP通讯支持

-A INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址访问本机,组播地址用于keepalived互相检测心跳

-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信

-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

#(3)开启路由转发功能

#临时

echo "1">/proc/sys/net/ipv4/ip_forward

#永久

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

sysctl -p

【2.3】下载、安装 keepalived

#(1)下载

官网:https://www.keepalived.org/download.html

wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

#(2)安装前置依赖包

mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考:yum源配置、epel源配置)

yum install kernel-devel openssl-devel popt-devel -y

#(3)安装

cd /soft/

tar -zxvf keepalived-1.3.3.tar.gz

cd keepalived-1.3.4

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

make && make install

#(4)设置keepalived开机自启

systemctl enable keepalived

------------下面(5)(6)可以忽略------------------------

#(5)如果不设置自定义目录,默认目录如下

#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/

#(5)构建keepalived 配置文件目录与文件

mkdir /etc/keepalived

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

#(6)基本配置文件复制

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

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

【2.4】配置文件解析

vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File forkeepalived

global_defs { #全局定义,

notification_email {#邮件通知,下面的是收件人邮件地址,需要开启sendmail服务

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc #邮件通知的发件人地址

smtp_server192.168.200.1 #发送邮件服务器地址smtp_connect_timeout30 #连接邮件服务器超时时间-秒router_id LVS_DEVEL #路由id,随便取名字但同一个连接网络要唯一

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval0vrrp_gna_interval0}

vrrp_instance VI_1 {#配置虚拟实例,这个名字任意取

state MASTER #角色状态,可以是 MASTER/BACKUP,具体情况见 1.1.3下标红字体

interface eth0 #指定HA检测网络的接口

virtual_router_id51 #路由idpriority100 #优先级advert_int1 #广播频率,单位是秒

#nopreempt #默认抢占模式,这个参数设置非抢占模式,需要主从state 都为BACKUP 才生效authentication {#身份验证

auth_type PASS #验证类型 PASS为密码验证

auth_pass1111 #验证密码,主从一样就好了}

virtual_ipaddress {#虚拟IP,我们启动后虚拟IP是多少192.168.200.16 #192.168.1.210/24

192.168.200.17

192.168.200.18}

}

virtual_server192.168.200.100 443{#虚拟服务器,IP+端口,以空格分隔

delay_loop6 #运行情况检查,IP+端口是否可用,单位是秒lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法

lb_kind NAT #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选

persistence_timeout50 #会话保持单位时间,单位是秒protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server192.168.201.100 443{#虚拟服务器对应的实际服务器、端口

weight1 #配置服务节点的权值,权值数字越大,权值越高SSL_GET {#获取ssl连接信息

url {

path/digest ff20ad2481f97b1754ef3e12ecd3a9cc

}

url {

path/mrtg/digest 9b3a0c85a887a256d6939da88aabd8cd

}

#notify_down /etc/keepalived/keepalived_stop.sh #如果这个server down掉之后这个服务器执行的内容

#notify_master /home/mysql/master.sh #如果这个server down掉之后,新主服务器执行这个脚本

connect_timeout3 #tcp检测参数,表示3秒无响应超时retry3 #表示最大重试次数delay_before_retry3 #表示重试间隔秒数

#connect_port 3306 #表示连接检测的端口为3306}

}

}

#后面一样的就不赘述了。

【2.5】最佳实践配置文件

参考代码:

global_defs {#全局定义

router_id MySQL-HA #全局路由ID,主从需要相同

}

vrrp_script check_run {#VRRP自定义脚本,check_run自定义名称

script"/etc/keepalived/mysql_check.sh" #调用的脚本文件URLinterval60 #运行间隔,单位为秒}

vrrp_sync_group VG1 {#vrrp同步组,VG1是自定义名称

group {#组内成员

VI_1

}

}

vrrp_instance VI_1 {#vrrp虚拟实例

state BACKUP #从

interface ens34 #针对监听的网络接口

virtual_router_id51 #唯一路由ID,主从要一致priority90 #权限advert_int1 #广播频率,单位是秒nopreempt #非抢占模式

authentication {#同一组keepalived的验证方式

auth_type PASS

auth_pass1234}

track_script {#定义跟踪使用脚本

check_run #这里就是我们上面自己定义的脚本

}

notify_master/etc/keepalived/master.sh#当本机换为Master状态时,会呼叫执行 notify_master

notify_stop/etc/keepalived/stop.sh#当本机终止keepalived 时,会呼叫执行 notify_stop

notify_backup /etc/keepalived/backup.sh #当本机进入Backup状态时,会呼叫执行 notify_backup

notify_fault /etc/keepalived/fault.sh #当本机发现异常情况进入Fault状态时,会呼叫执行 notify_fault

virtual_ipaddress { #设置虚拟IP192.168.1.210}

}

我的实际代码:

#主

global_defs {

router_id MySQL-HA

}

vrrp_script check_run {

script"/etc/keepalived/mysql_check.sh"interval60}

vrrp_sync_group VG1 {

group {

VI_1

}

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id51priority100advert_int1nopreempt

authentication {

auth_type PASS

auth_pass1234}

track_script {

check_run

}

notify_master/etc/keepalived/master.shnotify_stop/etc/keepalived/stop.shvirtual_ipaddress {192.168.135.180}

}

#从

global_defs {

router_id MySQL-HA

}

vrrp_script check_run {

script"/etc/keepalived/mysql_check.sh"interval60}

vrrp_sync_group VG1 {

group {

VI_1

}

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id51priority90advert_int1nopreempt

authentication {

auth_type PASS

auth_pass1234}

track_script {

check_run

}

notify_master/etc/keepalived/master.shnotify_stop/etc/keepalived/stop.shvirtual_ipaddress {192.168.135.180}

}

/etc/keepalived/mysql_check.sh的作用是为了没分钟判断一次mysql服务是否存活

#!/bin/bash

source /etc/profilecount=1

whiletrue

do

mysql-uroot -p123456 -S /tmp/mysql_3306.sock -e "show status;" > /dev/null 2>&1i=$?

ps aux| grep mysqld | grep -v grep > /dev/null 2>&1j=$?if [$i = 0] && [$j = 0]

then

exit 0

else

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

then

exit 0

else

if [$count -gt 5]

then

breakfi

count=$((${count}+1))

continuefi

fi

done

systemctl stop keepalived

other

#!/bin/bash

count=1

while true

do

ps aux | grep mysqld | grep -v grep > /dev/null 2>&1j=$?

if [ $j = 0]thenexit0

else

sleep 1

if [ $count -gt 5]thenbreakficount=$((${count}+1))

continuefi

donesystemctl stop keepalived

/etc/keepalived/master.sh 的作用是状态改为master以后执行的脚本。

首先判断复制是否有延迟,如果有延迟,等1分钟后,不论是否有延迟,都并停止复制,并且记录binlog和pos点。文件内容如下。

#!/bin/bash

source /etc/profile

Master_Log_File=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave statusG" | grep -w Master_Log_File | awk -F":" '{print $2}')

Relay_Master_Log_File=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave statusG" | grep -w Relay_Master_Log_File | awk -F":" '{print $2}')

Read_Master_Log_Pos=$(mysql -uroot -S /tmp/mysql_3306.sock "show slave statusG" | grep -w Read_Master_Log_Pos | awk -F":" '{print $2}')

Exec_Master_Log_Pos=$(mysql -uroot -S /tmp/mysql_3306.sock "show slave statusG" | 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"breakelse

sleep 1

if [ $i -gt 60]thenbreakficontinue

let i++

fi

donemysql-uroot -S /tmp/mysql_3306.sock -e "stop slave;"mysql-uroot -S /tmp/mysql_3306.sock -e "reset slave all;"mysql-uroot -S /tmp/mysql_3306.sock -e "reset master;"

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

#!/bin/bash

source /etc/profile

M_File1=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master statusG" | awk -F':' '/File/{print $2}')

M_Position1=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master statusG" | awk -F':' '/Position/{print $2}')sleep 1M_File2=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master statusG" | awk -F':' '/File/{print $2}')

M_Position2=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master statusG" | awk -F':' '/Position/{print $2}')

i=1

while true

do

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

echo "ok"breakelse

sleep 1

if [ $i -gt 60]thenbreakficontinue

let i++

fi

done

【2.6】修改默认日志文件位置

#默认错误日志位置:/var/log/messages

#(1)修改文件

vim /usr/local/keepalived/etc/sysconfig/keepalived

#左边改成右边

KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.

# --dump-conf         -d Dump the configuration data.

# --log-detail        -D Detailed log messages.

# --log-facility      -S 0-7 Set local syslog facility (default=LOG_DAEMON)

#(2)修改日志级别参数文件

vi /etc/rsyslog.conf

#在最后一行加上

local0.* /var/log/keepalived.log

#(3)重启日志服务

systemctl restart rsyslog

【2.7】启动、查看keepalived

systemctl daemon-reload #重新装载服务

systemctl start keepalived #启动服务

systemctl enable keepalived #设置服务开机自启

systemctl status keepalived#查看服务状态,有没有报错最快可以看这里ps -ef|grep keepalived|grep -v "grep" #查看服务进程

97c08628f9cb5be38076abecfd9fb5a4.png

2b08e4e4096863d8404dca6acf37d66b.png

查看VIP所在。

506fb081110656ce8d7ca95bc5ae6a44.png

【2.8】基于mysql连接的核验

用mysql连接虚拟IP地址,查看是哪个机器。

a8371a0be9ac0543f9190fa1064048a3.png

果然是DB3。

【2.9】故障转移测试

(1)查看当前运行情况,确保keepalived和mysql都在运行

79131ca643e598bdf0ad36724bab3a9d.png

aca15c1e6b06b7cc6ffa35935f578b68.png

(2)查看当前谁是 keepalived 的 master

c02b8265980485588fe3116382b06d17.png

de6598f064dc5198d21b27ed8d6c7c12.png

很明显,现在173是 master

(3)关闭 mysql 服务模拟故障转移

c2635c1631b1724773ed487d92eba28c.png

由上图可以看到,我们关闭了 173(keepalived master) 机器的 mysql服务后,keepalived也跟着关闭了。

(4)故障转移查看

《1》IP地址查看

232310d732aa72f9e1d84235f7fb87c2.png

并且,我们的 master.sh 脚本 还生成了一个txt文件,它记录该机器所在 mysql 实例的 binlog 信息

134e2c15c6a7e2467d3ee80f3616fcd1.png

《2》连接查看,我还特地搞了个 其他机器来连接 VIP,结果成功。

100c8aaec27d42b6aaf790fe2c42ccee.png

【3】MHA配置keepalived

【3.1】实验基本配置情况

操作系统:CentOS7.5

mysql:5.7.24

Mysql master DB1: 192.168.1.201

Mysql slave   DB2: 192.168.1.202

keepalived:https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

先搭建好mysql主从,这里略

【3.2】操作系统环境配置(防火墙)

#(1)添加非本机IP绑定支持

echo "net.ipv3.ip_nonlocal_bind=1" >> /etc/sysctl.conf

sysctl -p

#(2)配置iptables,添加VRRP通讯支持

-A INPUT -d 223.0.0.18 -j ACCEPT #允许组播地址访问本机

-A INPUT -s 192.168.1.0/24 -d 223.0.0.18 -j ACCEPT #允许组播地址通信

-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

#(3)开启路由转发功能

echo "1">/proc/sys/net/ipv4/ip_forward

【3.3】下载、安装 keepalived

#(1)下载

官网:https://www.keepalived.org/download.html

wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

#(2)安装前置依赖包

mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考:yum源配置、epel源配置)

yum install kernel-devel openssl-devel popt-devel -y

#(3)安装

cd /soft/

tar -zxvf keepalived-1.3.3.tar.gz

cd keepalived-1.3.4

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

make && make install

#(4)设置keepalived开机自启

systemctl enable keepalived

#(5)如果不设置自定义目录,默认目录如下

#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/

#(5)构建keepalived 配置文件目录与文件

mkdir /etc/keepalived

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

b6a4e7cfd9d033be956008349bede855.png

【3.4】配置文件解析

vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File forkeepalived

global_defs { #全局定义,

notification_email {#邮件通知,下面的是收件人邮件地址,需要开启sendmail服务

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc #邮件通知的发件人地址

smtp_server 192.168.200.1 #发送邮件服务器地址smtp_connect_timeout 30 #连接邮件服务器超时时间-秒router_id LVS_DEVEL #路由id,随便取名字但同一个连接网络要唯一

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0vrrp_gna_interval 0}

vrrp_instance VI_1 {#配置虚拟实例,这个名字任意取

state MASTER #角色状态,可以是 MASTER/BACKUP,具体情况见 1.1.3下标红字体

interface eth0 #指定HA检测网络的接口

virtual_router_id 51 #路由idpriority 100 #优先级advert_int 1

#nopreempt #默认抢占模式,这个参数设置非抢占模式,需要主从state 都为BACKUP 才生效authentication {#身份验证

auth_type PASS #验证类型 PASS为密码验证

auth_pass 1111 #验证密码,主从一样就好了}

virtual_ipaddress {#虚拟IP,我们启动后虚拟IP是多少

192.168.200.16 #192.168.1.210/24

192.168.200.17

192.168.200.18}

}

virtual_server 192.168.200.100 443{#虚拟服务器,IP+端口,以空格分隔

delay_loop 6 #运行情况检查,IP+端口是否可用,单位是秒lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法

lb_kind NAT #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选

persistence_timeout 50 #会话保持单位时间,单位是秒protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server 192.168.201.100 443{#虚拟服务器对应的实际服务器、端口

weight 1 #配置服务节点的权值,权值数字越大,权值越高SSL_GET {#获取ssl连接信息

url {

path /digest ff20ad2481f97b1754ef3e12ecd3a9cc

}

url {

path /mrtg/digest 9b3a0c85a887a256d6939da88aabd8cd

}

#notify_down /etc/keepalived/keepalived_stop.sh #如果这个server down掉之后这个服务器执行的内容

#notify_master /home/mysql/master.sh #如果这个server down掉之后,新主服务器执行这个脚本

connect_timeout 3 #tcp检测参数,表示3秒无响应超时retry 3 #表示最大重试次数delay_before_retry 3 #表示重试间隔秒数

#connect_port 3306 #表示连接检测的端口为3306}

}

}

#后面一样的就不赘述了。

virtual_server 10.10.10.2 1358{

delay_loop 6lb_algo rr

lb_kind NAT

persistence_timeout 50protocol TCP

sorry_server 192.168.200.200 1358real_server 192.168.200.2 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3retry 3delay_before_retry 3}

}

real_server 192.168.200.3 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334c

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334c

}

connect_timeout 3retry 3delay_before_retry 3}

}

}

virtual_server 10.10.10.3 1358{

delay_loop 3lb_algo rr

lb_kind NAT

persistence_timeout 50protocol TCP

real_server 192.168.200.4 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3retry 3delay_before_retry 3}

}

real_server 192.168.200.5 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3retry 3delay_before_retry 3}

}

}

【3.5】最佳实践配置文件

参考:

global_defs {

notification_email {

xxxxxx@sina.com #设置报警邮件地址,可以设置多个,每行一个。需要开启sendmail服务。

}

notification_email_from keepalived@localhost #设置邮件的发送地址

smtp_server 127.0.0.1#设置SMTP Server地址

smtp_connect_timeout 30#设置SMTP Server的超时时间

router_id LVS_DEVEL #表示运行Keepalived服务器的一个标识。发邮件时显示大邮件主题中的信息

}

vrrp_instance VI_1 { #vrrp 实例定义部分

state MASTER #指定Keepalived的角色,MASTER表示些主机是主服务器。BACKUP表示此主机是备用服务器

interface eth1 #指定HA监测网络的接口

virtual_router_id 51#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下MASTER与BACKUP必须是一致的

priority 50#定义优先级,数字越大,优先级越高

authentication {

auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信

auth_pass 1111}

virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个

192.168.100.250}

}

virtual_server 192.168.100.250 80{ #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开

delay_loop 6#设置运行情况检查时间,单位为秒

lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法

lb_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR三个模式可选

persistence_timeout 60#会话保持单位时间,单位是秒

protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server 192.168.100.60 80{ #配置服务节点1,需要指定real server的真实IP地址和端口

weight 1#配置服务节点的权值,权值数字越大,权值越高

TCP_CHECK { #relserve的状态检测设置部分,单位是秒

connect_timeout 10#表示10秒无响应超时

retry 3#表示重试次数

delay_before_retry 3#表示重试间隔

}

}

real_server 192.168.100.80 80{

weight 1TCP_CHECK {

connect_timeout 10#表示10秒无响应超时

retry 3#表示重试次数

delay_before_retry 3#表示重试间隔

}

}

}

我的配置文件

#master

global_defs {

router_id mysql_ha

}

vrrp_instance VI_1 {

state BACKUP

interface ens34

virtual_router_id 51priority 100authentication {

auth_type PASS

auth_pass 1111}

virtual_ipaddress {

192.168.1.210}

}

virtual_server 192.168.1.201 3306{

delay_loop 6lb_algo rr

lb_kind DR

persistence_timeout 60protocol TCP

real_server 192.168.1.201 3306{

weight 1notify_down /etc/keepalived/keepalived_stop.shTCP_CHECK {

connect_timeout 3retry 3delay_before_retry 3connect_port 3306}

}

}

#slave

global_defs {

router_id mysql_ha

}

vrrp_instance VI_1 {

state BACKUP

interface ens34

virtual_router_id 51priority 100authentication {

auth_type PASS

auth_pass 1111}

virtual_ipaddress {

192.168.1.210}

}

virtual_server 192.168.1.202 3306{

delay_loop 6lb_algo rr

lb_kind DR

persistence_timeout 60protocol TCP

real_server 192.168.1.202 3306{

weight 1notify_down /etc/keepalived/keepalived_stop.shTCP_CHECK {

connect_timeout 3retry 3delay_before_retry 3connect_port 3306}

}

}

杀死keepalived的脚本,防止脑裂

/etc/keepalived/keepalived_stop.sh

echo '#!/bin/bash' >/etc/keepalived/keepalived_stop.sh

echo "pkill keepalived" >>/etc/keepalived/keepalived_stop.sh

chmod u+x /etc/keepalived/keepalived_stop.sh

【3.6】修改默认日志文件位置

#默认错误日志位置:/var/log/messages

#(1)修改文件

vim /usr/local/keepalived/etc/sysconfig/keepalived

#左边改成右边

KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.

# --dump-conf         -d Dump the configuration data.

# --log-detail        -D Detailed log messages.

# --log-facility      -S 0-7 Set local syslog facility (default=LOG_DAEMON)

#(2)修改日志级别参数文件

vi /etc/rsyslog.conf

#在最后一行加上

local0.* /var/log/keepalived.log

#(3)重启日志服务

systemctl restart rsyslog

【3.7】启动、查看keepalived

systemctl daemon-reload #重新装载服务

systemctl start keepalived #启动服务

systemctl enable keepalived #设置服务开机自启

systemctl status keepalived#查看服务状态,有没有报错最快可以看这里ps -ef|grep keepalived|grep -v "grep" #查看服务进程

c19bc2a643ff22c244eb6d2262eb5e43.png

8d60145953b270b289327cb48530ee97.png

【3.8】基于mysql连接的核验

先看看机器信息

791c11231173e8bc0f6edec90c8458a6.png 

6634cf578b91d28789849bfb240a1f25.png

用mysql连接虚拟IP地址,查看是哪个机器。

mysql -uroot -p123456 -h192.168.1.210

6ada8b93a82c47bc9f5ed51be4142028.png

果然是DB1。

【3.9】故障转移测试

因为我们设置的是通过3306端口去做连接访问操作,所以只要mysql挂掉,3306端口也就不可访问了,就可以故障转移了。

我们实践一下,如下图,先关闭DB1的mysql

systemctl stop mysql

984883d6c16a0a168b530b9e4eb6218c.png

(1)查看IP地址,是否有虚拟IP

d309caa2e850e182ce2a955f2b660bfd.png 

7245fdf7bff8308a9fd15c2131c1af23.png

由上图可知,很明显已经飘到DB2机器上来了。

(2)用连接虚拟IP mysql

mysql -uroot -p123456 -h192.168.1.210

1bca7a88ea8a86bc5bfe47d2bc72d759.png

结果是DB2,证明连上的确实是我们想要的结果。

参考文档

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值